asp_net mvc4 web api 的最新讲解极其详细介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

不管是因为什么原因,结果是在新出的MVC中,增加了WebAPI,用于提供REST风格的WebService,个人比较喜欢REST风格的WebService,感觉比SOAP要轻量级一些,而且对客户端的要求也更少,更符合网络数据传输的一般模式,客户端完全摆脱了代理和管道来直接和WebService进行交互,具体的区别可以参见Web 服务编程,REST 与SOAP

(一)环境准备

本机的环境是XP+VS2010,需要安装VS2010 SP1升级包,MVC4升级包,Vs2010安装SP1后会影响SQLServer2008的自动提示功能,需要在安装补丁或插件,安装成功后可以新建如下的MVC WebAPI 项目

(二)概览

新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models,Views,Controllers等文件夹和Global.asax文件

Views对于WebAPI来说没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认情况下会被转换为Json格式的数据进行传输,Controllers中的Controller对应于WebService来说是一个Resource,用于提供服务。和普通的MVC一样,Global.asax用于配置路由规则

(三)Models

和WCF中的数据契约形成鲜明对比的是,MVC WebAPI中的Model就是简单的POCO,没有任何别的东西,如,你可以创建如下的Model

public class TestUseMode

{

public string ModeKey{get;set;}

public string ModeValue { get; set; }

}

注意:Model必须提供public的属性,用于json或xml反序列化时的赋值

(四)Controllers

MVC WebAPI中的Controllers和普通MVC的Controllers类似,不过不再继承于Controller,而改为继承API的ApiController,一个Controller可以包含多个Action,这些Action响应请求的方法与Global 中配置的路由规则有关,在后面结束Global时统一说明

(五)Global

默认情况下,模板自带了两个路由规则,分别对应于WebAPI和普通MVC的Web请求,默认的WebAPI 路由规则如下

1 routes.MapHttpRoute(

2 name: "DefaultApi",

3 routeTemplate: "api/{controller}/{id}",

4 defaults: new { id = RouteParameter.Optional }

5 );

可以看到,默认路由使用的固定的api作为Uri的先导,按照微软官方的说法,用于区分普通Web请求和WebService的请求路径:

Note: The reason for using "api" in the route is to avoid collisions with 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.

可以看到,默认的路由规则只指向了Controller,没有指向具体的Action,因为默认情况下,对于Controller 中的Action的匹配是和Action的方法名相关联的:

具体来说,如果使用上面的路由规则,对应下面的Controller:

public class TestController : ApiController

{

public static List allModeList = new List();

public IEnumerable GetAll()

{

return allModeList;

}

public IEnumerable 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 upDataList = allModeList.FindAll((mode) => { if (mode.ModeKey == key) return true; return false; });

foreach(var mode in upDataList)

{

mode.ModeValue = value;

}

return upDataList.Count;

}

}

则,会有下面的对应关系:

简单使用JS调用上面提供的数据接口

1function 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) {

8var str = val.ModeKey + ': ' + val.ModeValue;

9 $('

  • ', { html: str }).appendTo($('#modes'));

    10 });

    11 }

    12 }).fail(

    13function (xhr, textStatus, err) {

    14 alert('Error: ' + err);

    15 });

    16 }

    17

    18

    19

  • 相关文档
    最新文档