日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

MVC4 WebAPI

發(fā)布時(shí)間:2024/9/20 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC4 WebAPI 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不管是因?yàn)槭裁丛?#xff0c;結(jié)果是在新出的MVC中,增加了WebAPI,用于提供REST風(fēng)格的WebService,個(gè)人比較喜歡REST風(fēng)格的WebService,感覺(jué)比SOAP要輕量級(jí)一些,而且對(duì)客戶端的要求也更少,更符合網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)囊话隳J?#xff0c;客戶端完全擺脫了代理和管道來(lái)直接和WebService進(jìn)行交互,具體的區(qū)別可以參見Web 服務(wù)編程,REST 與 SOAP

(一)環(huán)境準(zhǔn)備

本機(jī)的環(huán)境是XP+VS2010,需要安裝VS2010 SP1升級(jí)包,MVC4升級(jí)包,Vs2010安裝SP1后會(huì)影響SQLServer2008的自動(dòng)提示功能,需要在安裝補(bǔ)丁或插件,安裝成功后可以新建如下的 MVC WebAPI 項(xiàng)目

(二)概覽

新生成的WebAPI項(xiàng)目和典型的MVC項(xiàng)目一樣,包含主要的Models,Views,Controllers等文件夾和Global.asax文件


Views對(duì)于WebAPI來(lái)說(shuō)沒(méi)有太大的用途,Models中的Model主要用于保存Service和Client交互的對(duì)象,這些對(duì)象默認(rèn)情況下會(huì)被轉(zhuǎn)換為Json格式的數(shù)據(jù)進(jìn)行傳輸,Controllers中的Controller對(duì)應(yīng)于WebService來(lái)說(shuō)是一個(gè)Resource,用于提供服務(wù)。和普通的MVC一樣,Global.asax用于配置路由規(guī)則

(三)Models

和WCF中的數(shù)據(jù)契約形成鮮明對(duì)比的是,MVC WebAPI中的Model就是簡(jiǎn)單的POCO,沒(méi)有任何別的東西,如,你可以創(chuàng)建如下的Model

public class TestUseMode{public string ModeKey{get;set;}public string ModeValue { get; set; }}

注意:Model必須提供public的屬性,用于json或xml反序列化時(shí)的賦值

(四)Controllers

MVC WebAPI中的Controllers和普通MVC的Controllers類似,不過(guò)不再繼承于Controller,而改為繼承API的ApiController,一個(gè)Controller可以包含多個(gè)Action,這些Action響應(yīng)請(qǐng)求的方法與Global中配置的路由規(guī)則有關(guān),在后面結(jié)束Global時(shí)統(tǒng)一說(shuō)明

(五)Global

默認(rèn)情況下,模板自帶了兩個(gè)路由規(guī)則,分別對(duì)應(yīng)于WebAPI和普通MVC的Web請(qǐng)求,默認(rèn)的WebAPI路由規(guī)則如下

1 routes.MapHttpRoute( 2 name: "DefaultApi", 3 routeTemplate: "api/{controller}/{id}", 4 defaults: new { id = RouteParameter.Optional } 5 );

可以看到,默認(rèn)路由使用的固定的api作為Uri的先導(dǎo),按照微軟官方的說(shuō)法,用于區(qū)分普通Web請(qǐng)求和WebService的請(qǐng)求路徑:

Note:?The reason for using "api" in the route is to avoid collisions with ASP.NET MVC routing. That way, you can have "/contacts" go to an MVC controller, and "/api/contacts" go to a Web API controller. Of course, if you don't like this convention, you can change the default route table.

可以看到,默認(rèn)的路由規(guī)則只指向了Controller,沒(méi)有指向具體的Action,因?yàn)槟J(rèn)情況下,對(duì)于Controller中的Action的匹配是和Action的方法名相關(guān)聯(lián)的:

具體來(lái)說(shuō),如果使用上面的路由規(guī)則,對(duì)應(yīng)下面的Controller:

public class TestController : ApiController{public static List<TestUseMode> allModeList = new List<TestUseMode>();public IEnumerable<TestUseMode> GetAll(){return allModeList;}public IEnumerable<TestUseMode> GetOne(string key){return allModeList.FindAll((mode) => { if (mode.ModeKey.Equals(key)) return true; return false; });}public bool PostNew(TestUseMode mode){allModeList.Add(mode);return true;}public int Delete(string key){return allModeList.RemoveAll((mode) => { if (mode.ModeKey == key) return true; return false; });}public int DeleteAll(){return allModeList.RemoveAll((mode) => { return true; });}public int PutOne(string key, string value){List<TestUseMode> upDataList = allModeList.FindAll((mode) => { if (mode.ModeKey == key) return true; return false; });foreach(var mode in upDataList){mode.ModeValue = value;}return upDataList.Count;}}

則,會(huì)有下面的對(duì)應(yīng)關(guān)系:


簡(jiǎn)單使用JS調(diào)用上面提供的數(shù)據(jù)接口 1 function getAll() {2 $.ajax({3 url: "api/Test/",4 type: 'GET',5 success: function (data) {6 document.getElementById("modes").innerHTML = "";7 $.each(data, function (key, val) {8 var str = val.ModeKey + ': ' + val.ModeValue;9 $('<li/>', { html: str }).appendTo($('#modes')); 10 }); 11 } 12 }).fail( 13 function (xhr, textStatus, err) { 14 alert('Error: ' + err); 15 }); 16 } 17 18 19 20 function add() { 21 22 $.ajax({ 23 url: "api/Test/", 24 type: "POST", 25 dataType: "json", 26 data: { "ModeKey": document.getElementById("txtKey").value, "ModeValue": document.getElementById("txtValue").value }, 27 success: function (data) { 28 getAll(); 29 } 30 }).fail( 31 function (xhr, textStatus, err) { 32 alert('Error: ' + err); 33 }); 34 35 } 36 37 function find() { 38 39 $.ajax({ 40 url: "api/Test/" + document.getElementById("txtFindKey").value, 41 type: 'GET', 42 success: function (data) { 43 document.getElementById("modes").innerHTML = ""; 44 $.each(data, function (key, val) { 45 var str = val.ModeKey + ': ' + val.ModeValue; 46 $('<li/>', { html: str }).appendTo($('#modes')); 47 }); 48 } 49 }).fail( 50 function (xhr, textStatus, err) { 51 alert('Error: ' + err); 52 }); 53 } 54 55 function removeAll() { 56 $.ajax({ 57 url: "api/Test/", 58 type: 'DELETE', 59 success: function (data) { 60 document.getElementById("modes").innerHTML = ""; 61 getAll(); 62 } 63 }).fail( 64 function (xhr, textStatus, err) { 65 alert('Error: ' + err); 66 }); 67 } 68 69 function remove() { 70 $.ajax({ 71 url: "api/Test/"+document.getElementById("txtRemoveKey").value, 72 type: 'DELETE', 73 success: function (data) { 74 document.getElementById("modes").innerHTML = ""; 75 getAll(); 76 } 77 }).fail( 78 function (xhr, textStatus, err) { 79 alert('Error: ' + err); 80 }); 81 } 82 83 function update() { 84 $.ajax({ 85 url: "api/Test/", 86 type: 'PUT', 87 dataType: "json", 88 data: { "key": document.getElementById("txtUpdateKey").value, "value": document.getElementById("txtUpdateValue").value }, 89 success: function (data) { 90 document.getElementById("modes").innerHTML = ""; 91 getAll(); 92 } 93 }).fail( 94 function (xhr, textStatus, err) { 95 alert('Error: ' + err); 96 }); 97 }

這樣就實(shí)現(xiàn)了最基本的CRUD操作。

(六)路由規(guī)則擴(kuò)展

和普通的MVC一樣,MVC WebAPI支持自定義的路由規(guī)則,如:在上面的操作中,路由規(guī)則使用

"api/{controller}/{id}"

則限定了使用GET方式利用URL來(lái)傳值時(shí),controller后面的接收參數(shù)名為id,但是在Controller中,GetOne方法的接收參數(shù)名為key,是不會(huì)被匹配的,這是只需要新增一個(gè)新的路由規(guī)則,或修改原先的路由規(guī)則為:

"api/{controller}/{key}"

當(dāng)然,可以對(duì)路由進(jìn)行更深的擴(kuò)展,如:擴(kuò)展成和普通MVC一樣的路由:

"api/{controller}/{action}/{id}"

這樣,就要求同時(shí)使用Action和HTTP方法進(jìn)行匹配
當(dāng)然,根據(jù)微軟的說(shuō)法,這種使用是不被推薦的,因?yàn)檫@不符合大家對(duì)WebService的一般認(rèn)知:

For a RESTful API, you should avoid using verbs in the URIs, because a URI should identify a resource, not an action.

(七)使用Attribute聲明HTTP方法

有沒(méi)有感覺(jué)默認(rèn)的使用方法名來(lái)匹配HTTP Method的做法很傻??或者我有一些方法是自己用的,不想暴露出來(lái),又該怎么辦?還是使用attribute做這些工作感覺(jué)優(yōu)雅一些,比如,上面的Action我可以更改為:

[HttpGet]public IEnumerable<TestUseMode> FindAll()[HttpGet]public IEnumerable<TestUseMode> FindByKey(string key)[HttpPost]public bool Add(TestUseMode mode)[HttpDelete]public int RemoveByKey(string key)[HttpDelete]public int RemoveAll()[HttpPut]public int UpdateByKey(string key, string value)[NonAction] public string GetPrivateData()

當(dāng)然,我只列出了方法名,而不是這些方法真的沒(méi)有方法體...方法體是不變的,NoAction表示這個(gè)方法是不接收請(qǐng)求的,即使以GET開頭。
如果感覺(jué)常規(guī)的GET,POST,DELETE,PUT不夠用,還可以使用AcceptVerbs的方式來(lái)聲明HTTP方法,如:

[AcceptVerbs("MKCOL", "HEAD")]public int UpdateByKey(string key, string value){List<TestUseMode> upDataList = allModeList.FindAll((mode) => { if (mode.ModeKey == key) return true; return false; });foreach(var mode in upDataList){mode.ModeValue = value;}return upDataList.Count;}

******************************************************************************

總結(jié)

以上是生活随笔為你收集整理的MVC4 WebAPI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜影院18 | 国产夫妻性生活视频 | 动漫女被黄漫免费视频 | 欧美精品手机在线 | 四虎在线视频 | 五月av在线| 成人综合影院 | 人妻久久一区二区 | 亚洲交性网 | 国产美女自拍 | av噜噜在线观看 | 亚洲综合在线五月 | 午夜精品免费观看 | 日韩亚洲天堂 | 潘金莲三级野外 | 精品无码国产一区二区三区av | 欧洲午夜视频 | 日韩国产片 | 韩国三级hd中文字幕叫床浴室 | 黄色a级片网站 | 久久精品一 | 69色堂 | 9.1在线观看免费 | 日韩福利视频导航 | 欧美爱爱视频 | 尤物精品 | 男女啪啪免费看 | 污视频网址 | 激情欧美网站 | 国产成人av无码精品 | 欧美黄色图片 | 亚洲一区二区三区四区在线播放 | 亚洲熟女乱综合一区二区三区 | 大又大粗又爽又黄少妇毛片 | 亚洲成人激情av | 欧美日韩少妇精品 | 一二三区在线播放 | 精品一区二区三区无码视频 | 成人午夜免费毛片 | 亚洲成人一二三 | 天天干天天干天天操 | 日韩成人av毛片 | 手机在线观看毛片 | 日韩一区在线视频 | 欧美黑人一区 | 久久综合中文字幕 | 五月天婷婷在线观看 | 成人在线三级 | 国产无遮挡免费视频 | 国产视频福利 | 日韩福利视频导航 | 久久av免费看 | 国产jk精品白丝av在线观看 | 二区国产 | 久久国产精品网 | 性久久久久久久 | 911精品国产一区二区在线 | 日本丰满少妇一区二区三区 | 国产香蕉尹人视频在线 | 无套日出白浆 | 久久噜噜噜 | 成人爱爱网站 | 男女啪动最猛动态图 | 99色婷婷 | 国产精品www色诱视频 | 国产精品精品久久久久久 | 国产乱人乱精一区二视频国产精品 | 国产孕妇孕交大片孕 | 17c在线观看视频 | 久久久久久色 | 少妇精品视频 | 色就是色欧美色图 | 国产视频一区二区三 | www.色亚洲 | 嫩草嫩草嫩草嫩草 | 国产91边播边对白在线 | 你懂的av在线 | 在线天堂在线 | 亚洲欧洲视频 | 日日操操 | 波多野结衣电影在线播放 | 国产天堂 | 日韩成人免费观看 | 日本不卡视频在线播放 | 91视频国产免费 | 182av| 亚洲一二三区在线 | 日韩毛片在线看 | 天天操天天操天天射 | 国产精品11 | 国产黄色一级片视频 | 国产精品9 | 日本一区二区视频在线 | 日韩欧美视频一区 | 波多野结衣成人在线 | 精品人妻一区二区三区香蕉 | 秋葵视频成人 | 另一种灿烂生活 | 欧美日韩国产一级片 |