天天看點

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

一:簡單介紹什麼是Web api

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

微軟的web api是在vs2012上的mvc4項目綁定發行的,它提出的web api是完全基于RESTful标準的,完全不同于之前的(同是SOAP協定的)wcf和webService,它是簡單,代碼可讀性強的,上手快的,如果要拿它和web服務相比,我會說,它的接口更标準,更清晰,沒有混亂的方法名稱,有的隻有幾種标準的請求,如get,post,put,delete等,它們分别對應的幾個操作,下面講一下:

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

POST:添加服務端添加一條記錄,記錄實體為Form對象

PUT:添加或修改服務端的一條記錄,記錄實體的Form對象,記錄主鍵以GET方式進行傳輸

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

二:怎麼定義的 Post Get Put 和 Delete

首先我們從MVC4 的WEB API模闆自動建立的示範檔案進行分析 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

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

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

你調用什麼類型的方法 ,例如 post 方法,那麼他就去 你的所有的 action 裡面 去找 以 post 開頭的方法 ,名字可以随便叫,例如 postToDataBase 等等,隻要開頭比對 就可以了

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

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

這裡,隻注冊到了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。
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

另外我們可以注意到在Post Put的方法參數有一個關鍵字[ 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 }
        );
           
  • 1
  • 2
  • 3
  • 4
  • 5

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

public string Get(String p1, String p2)
        {
            return p1 + "/" + p2;
        }
           
  • 1
  • 2
  • 3
  • 4

我們去調用一下試試 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

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

三:複雜傳值,直接從前台傳遞一個類到背景接收

我們還是把路由表恢複成以下 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

4.1 我們先在前台頁面,用post方式,來傳遞一個類的2個值到背景

定義一個簡單的類 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

我們在前台送出的頁面設定 方式為 post 送出 ,位址就指向我們的 webapi位址 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

由于我們是通過 Post方式送出的資料,那麼背景接收的時候,就是用 FromBody 來進行接收,由于剛好我們傳遞的前台資料就是類的2個字段,那麼背景接收的時候,也可以直接用類來接收,webapi會根據類型和字段來幫我們自動加載資料,擷取到值.

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用
Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

4.2 用get方式來擷取資料

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用
Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

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

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用
Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

4.4 最傳統 通過 request.form 和 request.querystring 的方式的擷取值

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

public void Post([FromBody]string value)
         {
             HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];//擷取傳統context
             HttpRequestBase request = context.Request;//定義傳統request對象
             string name = request.Form["name"];

         }
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

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

var context = HttpContext.Current.Request;  
           
  • 1
  • 2

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

四: 前台調用, ajax 來調用

可以參考 http://www.cnblogs.com/lori/p/3555737.html

參考 : http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

五: 背景調用,背景代碼調用

參考 : http://www.cnblogs.com/joeylee/p/3810721.html

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

我們按照 api/{controller}/{id}的格式 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

比如我們在 xiaoxin 這個 apicontroller 有自己寫的2個方法(注意 他們的參數名是一樣的,方法名 不一樣) 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

我們想通過get方法來調用其中一個方法 http://localhost:28160/api/xiaoxin/RequestToken

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用
Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

再次調用其中的一個方法,并且傳遞參數過去

http://localhost:28160/api/xiaoxin/AccessToken?name=joey&pwd=lee

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

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

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

那麼如何修改呢? 

Mvc4中的WebApi的使用方式一:簡單介紹什麼是Web api二:怎麼定義的 Post Get Put 和 Delete三:複雜傳值,直接從前台傳遞一個類到背景接收四: 前台調用, ajax 來調用五: 背景調用,背景代碼調用

繼續閱讀