1. 程式人生 > >Web Api簡單使用方法

Web Api簡單使用方法

1. 簡單介紹什麼是Web Api

REST屬於一種設計風格,REST 中的 POST(新增資料),GET(取得資料),PUT(更新資料),DELETE(刪除資料)來進行資料庫的增刪改查,而如果開發人員的應用程式符合REST原則,則它的服務為“REST風格Web服務也稱的RESRfulWeb API”

微軟的web api是在vs2012上的mvc4專案繫結發行的,它提出的web api是完全基於RESTful標準的,完全不同於之前的(同是SOAP協議的)wcf和webService,它是簡單,程式碼可讀性強的,上手快的,如果要拿它和web服務相比,我會說,它的介面更標準,更清晰,沒有混亂的方法名稱,有的只有幾種標準的請求,如get,post,put,delete等,它們分別對應的幾個操作,下面講一下:

GET:生到資料列表(預設),或者得到一條實體資料

POST:新增服務端新增一條記錄,記錄實體為Form物件

PUT:新增或修改服務端的一條記錄,記錄實體的Form物件,記錄主鍵以GET方式進行傳輸

DELETE:刪除 服務端的一條記錄

2. 怎麼理解的 Post Get Put 和Delete

首先我們從MVC4WEBAPI模板自動建立的演示檔案進行分析


從演示的列子,我們可以看到在Action 中沒有使用[HttpGet]、[HttpPost] 等修飾,那究竟它是如何運作的呢

Action 皆以HTTP 動詞開頭Get、Post、Put、Delete ,這個也是剛好符合 webapi的約定的,什麼約定呢?

你呼叫什麼型別的方法 ,例如 post 方法,那麼他就去 你的所有的 action 裡面 去找 以 post 開頭的方法 ,名字可以隨便叫,例如 postToDataBase 等等,只要開頭匹配 就可以了

打個比喻,假設今天服務端收到了一個GET 請求時,會去查詢對應的Controller 並且Action 以”Get…” 開頭的方法,舉個例子:GetMembers、GetTime,以此類推,如果我們從jQueryAjax 發出了一個POST 請求,也會自動對應到以”Post…”開頭的Action 內,也就是說實際呼叫哪個Controller的Action 不是利用網址來決定,而是依照HTTP 所送出的請求來決定,這也就是非常典型的REST風格,而在Web API中也處理了回傳的資料,讓我們看看Get() 這個方法,回傳IEnumerable的方法,等於我們擁有了強型別。

我們再來看看預設的 api 路由表 


這裡,只註冊到了controller,沒有到action,因為api的action名稱是有約定的。

webapi大約有這樣的約定:

action名稱中有get的,0引數,匹配路由到/控制器

action名稱中有get的,1引數,匹配路由到 /控制器/id

action名稱中有post的,0引數,匹配路由到post方式的/控制器

action名稱中有post的,1引數,匹配路由到post方式的/控制器/id

對於返回,可以直接返回一個class,則apicontroller自動根據請求的content-type序列化成xml或者json。具體例子為,用ie開啟相應api的url返回的是json,用chrome返回的就是xml。

另外我們可以注意到在PostPut的方法引數有一個關鍵字[ FromBody ],而Get、Delete則沒有。,事實上沒有加[FromBody ]就預設為[FromUri ].

[ FromBody ]表示由請求檔案本體中取得資料,就像一般表單Post Submit一樣,取得資料的來源是由請求本體中取得,而[ FromUri ]則表示由URI中取得資料,就像在網址列中的所夾帶的引數

在webapi的示範程式碼裡,Get方法很簡單隻有一個id引數的傳入並且是簡單的int型,因此我們可以用http://localhost/api/Values/1 這樣的請求執行Get(int id)方法,但事實上並非每個請求都只用一個簡單的引數就可以能搞定,有時我們可能需要2個或以上的引數才能傳遞或者是獲取到資料,我們可以到路由裡面改為接受兩個引數,分別為{ p1 } & { p2 }

RouteTable.Routes.MapHttpRoute(

            name: "DefaultApi",

            routeTemplate: "webapi/{controller}/{p1}/{p2}",

            defaults: new { id =System.Web.Http.RouteParameter.Optional }

        );

那麼對應的Controller 裡面獲取Get的方法需要修改為

publicstringGet(String p1, String p2)

        {

return p1 + "/" + p2;

        }

這種方法,雖然比較簡單,但是如果我們的引數更多的時候,還是這樣去修改路由也是很麻煩的,我們就採用下面的方法,直接傳遞類到後臺

3. 複雜傳值,直接從前臺傳遞一個類到後臺接收

我們先在前臺頁面,post方式,來傳遞一個類的2個值到後臺

我們在前臺提交的頁面設定方式為 post 提交 ,地址就指向我們的 webapi地址

定義一個簡單的類

由於我們是通過 Post方式提交的資料,那麼後臺接收的時候,就是用 FromBody 來進行接收,由於剛好我們傳遞的前臺資料就是類的2個欄位,那麼後臺接收的時候,也可以直接用類來接收,webapi會根據型別和欄位來幫我們自動載入資料,獲取到值.

如果你這裡是用 get 方式進行傳值的,那麼這裡的 FromBody 就應該換成 FromUri 

get方式來獲取資料:

我直接在前臺,用一個超連結,裡面指向我們的webapi 並且傳遞2個值,剛好是我們的UserInfo類的2個屬性

即使我們傳了一個不存在型別裡的屬性名稱引數值,也不會引發錯誤,該引數只會被忽略掉

例如,我們修改的例子,post提交的時候,我們新增加一個引數,這個引數在後臺的 Userinfo類裡面是沒有對應的屬性的,我們這樣提交之後,後臺接收到值,會自動忽略掉不在類屬性裡面的值

 

最傳統通過 request.form request.querystring 的方式的獲取值

我們傳統的在aspx或者是一般處理程式裡面獲取值是通過request.querystringrequest.form來獲取到.那麼在 webapi裡面,則是有些改變


可以通過上面這種強轉的方式獲取,也可以直接

var context =HttpContext.Current.Request;

WEBAPI中的RequestHttpRequestMessage型別,不能像Web傳統那樣有querystringfrom 方法接收引數,而傳統的HttpReqest的基類是HttpReqestBase.所以這裡我們就直接使用(HttpContextBase)Request.Properties[“MS_HttpContext”]

4. 前臺呼叫,ajax來呼叫

5. 後臺呼叫,後臺程式碼呼叫

如果我們想不用Get/Post/Put/Delete ,怎麼定義 ? 簡單,我們自己在方法上打上接受動詞標籤 HttpPost HttpGet

 

這個時候就會直接報錯請求的資源不支援 http 方法“GET” 

再次呼叫其中的一個方法,並且傳遞引數過去

居然直接就報錯了,提示 : 找到了與該請求匹配的多個操作

這裡報錯的坑爹原因是: 你以為你剛才那樣寫 url 是在呼叫AccessToken方法? 你太天真了,都說了, 我們的webapi是隻繫結到 controller ,而不繫結到 action上的,呼叫什麼方法,完全看你是用的 post 還是get方法,並且是根據action的名字裡面有沒有 post get 來匹配action ,我這裡使用url的方式顯然是get方法, 然後AccessToken?name=joey&pwd=lee 這麼一大串,在路由裡面實際就是代表了引數id, 當匹配到 controller 裡面的時候,發現有2個 HttpGet 的方法, 但是 這2個方法,他們的引數名字都是一模一樣的,所以就提示了, 找到了與該請求匹配的多個操作….那麼如何修改呢? 

相關推薦

Web Api簡單使用方法

1. 簡單介紹什麼是Web ApiREST屬於一種設計風格,REST 中的 POST(新增資料),GET(取得資料),PUT(更新資料),DELETE(刪除資料)來進行資料庫的增刪改查,而如果開發人員的應用程式符合REST原則,則它的服務為“REST風格Web服務“也稱的RE

用Fiddler測試Asp.net Web API Post 方法

沒什麼好說的,重點看上面填的東西,Content-Type: application/x-www-form-urlencoded 通常要自己加上去 服務端接收引數 using System; using System.Collections.Gener

在ASP.NET Core MVC中構建簡單 Web Api

程序 Getting Started在 ASP.NET Core MVC 框架中,ASP.NET 團隊為我們提供了一整套的用於構建一個 Web 中的各種部分所需的套件,那麽有些時候我們只需要做一個簡單的 Web Api 程序怎麽辦呢?在 GitHub 中的 ASP.NET Core MVC 源碼裏面,我

Web API 方法的返回類型、格式器、過濾器

lca asc .net nbsp tin 過濾 col 數據 www 一、Action方法的返回類型 a) 操作方法的返回類型有四種:void、簡單或復雜類型、HttpResponseMessage類型、IHttpActionResult類型。 b) 如果返回類型為voi

asp.net Web API 身份驗證 不記名令牌驗證 Bearer Token Authentication 簡單實現

驗證 tca star ati manager ace .com return public 1. Startup.Auth.cs文件 添加屬性 1 public static OAuthBearerAuthenticati

WEB - 定時獲取代理池(簡單方法)

quest 循環 定時 def int urn 腳本 time 獲取 import requests import time from read_ip_pool import read_ip_pool PROXIES_URL = ‘‘ def get_ip_pool(

從零開始學習 asp.net core 2.1 web api 後端api基礎框架(七)-新增一個查詢單筆資料的方法

再寫一個查詢單筆資料的方法: [Route("{id}")] public JsonResult GetProduct(int id) { return new JsonResult(ProductService.Curre

Web API入門 簡單例項

地址:https://blog.csdn.net/zhoukun1008/article/details/52702007。 WebApi怎麼用? 1、 開啟VS2012,新建------>專案     選擇Visual C#   Web 下面的 Visua

web API種類 常見形式 Web API簡單分類總結

常見形式 Web API 的簡單分類總結     一、請求--響應API。 請求--響應類的API的典型做法是,通過基於HTTP的Web伺服器暴露一個/套介面。API定義一些端點,客戶端傳送資料的請求到這些端點,Web伺服器處理這些請求,然後返回響應。響

ASP.NET Web API實現簡單的檔案下載與上傳

ASP.NET Web API實現簡單的檔案下載與上傳。首先建立一個ASP.NET Web API專案,然後在專案下建立FileRoot目錄並在該目錄下建立ReportTemplate.xlsx檔案,用於下面示例的使用。 1、檔案下載 示例:實現報表模板檔案下載功能。 1.1 後端程

ASP.NET Web API執行提示:找到了與該請求匹配的多個操作的解決方法

ASP.NET Web API執行提示:找到了與該請求匹配的多個操作。 開啟App_Start目錄下的WebApiConfig.cs配置檔案可以看到,路由中預設的配置資訊。 config.Routes.MapHttpRoute( name: "DefaultApi", r

ASP.NET Web API構建一個簡單的應用

使用ASP.NET Web API構建一個簡單的應用。 示例:使用ASP.NET Web API提供獲取使用者列表和使用者資訊介面。 1、在Models目錄下建立使用者資訊類(UserModel.cs) /// <summary> /// 使用者資訊類 /// </

常見形式 Web API簡單分類總結

一、請求--響應API。 請求--響應類的API的典型做法是,通過基於HTTP的Web伺服器暴露一個/套介面。API定義一些端點,客戶端傳送資料的請求到這些端點,Web伺服器處理這些請求,然後返回響應。響應的格式通常是JSON或XML。 在這種型別的Web API裡,比較流行的是這三種:REST,RP

用最簡單方法解決api介面安全問題,幾乎無法破解

場景描述 專案需要為第三方提供api服務介面。介面涉及到核心功能,如何保證介面安全。防止偽造身份、篡改資料? 思路 保障資料安全最好的方法,當然是加密了。無法解析內容,自然無法偽造,篡改。 可是使用https證書需要收費的。有其它方法麼? 有的。 訊息雜湊認證(hmac

web api(GET請求方法)

//控制器裡的方法   using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.We

C# web api返回型別設定為json的兩種方法

web api寫api介面時預設返回的是把你的物件序列化後以XML形式返回,那麼怎樣才能讓其返回為json呢,下面就介紹兩種方法: 方法一:(改配置法) 找到Global.asax檔案,在Application_Start()方法中新增一句:  。程式碼如下: Glo

ASP.NET Web Api中使用Session、Cache和Application的幾個方法

        在ASP.NET中,Web Api的控制器類派生自ApiControll,該類與ASP.NET的Control類沒有直接關係,因此不能像在ASPX.CS程式碼隱藏類中直接使用HttpContext、HttpApplicationState或HttpSessi

Android【百度地圖API】經緯度轉換地址超簡單方法

第一種方式:  public static void reverseGeoCode(LatLng latLng) { // 建立地理編碼檢索例項 GeoCoder geoCoder = GeoCoder.newInstance();

web api中序列化後的時間中含有“T”的解決方法

web api中序列化後的時間中含有“T”的解決方法 在web api中,系統會自動將返回的物件序列化為json資料,但是如果物件中含有時間的話,序列化後的時間中會含有“T”字元,如下:

fetch API簡單使用方法

fetch 可以看做是將要代替ajax的一種方式;行為與promise類似,下面是一些簡單的使用方法: <body> <img src="" alt=""> <script> myImag