zoukankan      html  css  js  c++  java
  • MVC WebAPI 的基本使用

    1.什么是WebAPI

      Web API是网络应用程序接口。包含了广泛的功能,网络应用通过API接口,可以实现存储服务、消息服务、计算服务等能力,利用这些能力可以进行开发出强大功能的web应用。

      它可以对接各种客户端(浏览器,移动设备),构建http服务的框架。

    2.定义WebAPI接口

      Web API的接口有四种请求方式分别是:GET(获取一条或者多条数据)、POST(添加数据)、PUT(更新数据)和DELTE(删除数据)。

      由Web API的路由规则可知,Web API的路由规则只绑定到Controller,所以是根据请求的方式和传递的参数来匹配合适的Action,否则将会报错。

            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
    

      定义主要由以下两种方式:

      (1)增加Post、Get、Put或者Delete的前缀

        这里的前缀不区分大小写,系统根据不同的http请求方式找到拥有相应前缀的方法名,具体如下所示:

            public IEnumerable<string> GetUsers()
            {
                return new string[] { "value1", "value2" };
            }
    

      (2)指定特性[HttpPost]、[HttpGet]、[HttpPut]和[HttpDelete]

        这种方式是等效于第一种方式的,但是当同时用了这两种方式,但是特性和前缀的访问方式不同的话,以特性为准。

      注意点:

        相同的请求方式下,方法名的命名规则和路由的匹配是没有关系的,如下:

            [HttpGet]
            public IEnumerable<string> Users()
            {
                return new string[] { "2", "value2" };
            }
            [HttpGet]
            public IEnumerable<string> Cates()
            {
                return new string[] { "1", "value2" };
            }
    

      这样通过get方式访问/api/Home/Users和/api/Home/Cates虽然方法名不同,但是结果却都是相同的报错,如下:

    <Error>
    <Message>发生错误。</Message>
    <ExceptionMessage>
    找到了与该请求匹配的多个操作: 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Users() 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Cates()
    </ExceptionMessage>
    <ExceptionType>System.InvalidOperationException</ExceptionType>
    <StackTrace>
    在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    </StackTrace>
    </Error>
    

      如果将方法稍作修改在Cates增加一个参数id,如下:

            [HttpGet]
            public IEnumerable<string> Users()
            {
                return new string[] { "2", "value2" };
            }
            [HttpGet]
            public IEnumerable<string> Cates(int id)
            {
                return new string[] { "1", "value2" };
            }
    

      那么访问/api/Home/Users?id=1或者任意的action如那么访问/api/Home/xxxx?id=1都可以正确访问得到如下结果:

    <ArrayOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <string>1</string>
    <string>value2</string>
    </ArrayOfstring>
    

      但是访问/api/Home/Users或者/api/Home/Cate的话就会报错:

    <Error>
    <Message>请求无效。</Message>
    <MessageDetail>
    对于“MvcApplication1.Api.HomeController”中方法“System.Collections.Generic.IEnumerable`1[System.String] Cates(Int32)”的不可以为 null 的类型“System.Int32”的参数“id”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。
    </MessageDetail>
    </Error>
    

      综上所述,Web API的通过请求方式和传递的参数来寻找到对应的方法,与方法名无关。

    3.参数的传递

      (1)[FromUri] 和 [FromBody]

      Web API的参数获取和普通的Controller有些许不同,参数提交有表单提交和url后面参数传递两种方式,Web API就有对应的着两种参数的获取分别[FromBody]获取表单提交的数据,[FromUri] 获取url传参。如下:

            [HttpPost]
            public IEnumerable<string> Users([FromUri]User user,[FromUri] int day,[FromBody] string str)
            {
                return new string[] { "2", "value2" };
            }
    

      默认是[FromUri],否则就会获取指定方式传递的参数,可以是类会自动组装,不允许重复参数的传递与接收。

      (2)传统获取

      用下面这段代码可以获取get请求的数据:

    var current = HttpContext.Current.Request;
    

      但是这样会有一个问题,就是前面讲到的,因为方法没有参数所以当方法众多时会有多个参数匹配的方法错误。

    4.返回值

      Web API返回的数据格式有很多种如IEnumerable<string>(包括json格式和xml格式)、string、void等,但是使用的过程中基本时返回json或者xml格式的数据,所以这里主要讲这两种。Web API可以返回IEnumerable<string>这样的强类型,

    默认返回的时xml格式的数据,在浏览器中输入地址,返回的是xml格式的数据,那怎么返回json格式的呢?

            public HttpResponseMessage GETH(int id)
            {
                string[] strArry = new string[] { "2", "value2" };
                string json = JsonConvert.SerializeObject(strArry);
                //返回纯文本text/plain  ,返回json application/json  ,返回xml text/xml
                HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(json, Encoding.GetEncoding("UTF-8"), "application/json") };
                return result;
            }
    

      以上的代码就可以返回json的数据,并且还有其他的返回格式。或者通过更改ajax请求头的contentType: "application/json; charset=utf-8"来将xml数据转为json格式。

     

  • 相关阅读:
    MyEclipse快捷键大全
    HTTP请求方法
    [转载]CentOS 7 用户怎样安装 LNMP(Nginx+PHP+MySQL)
    [转载20131024]Nginx服务器漏洞的利用和修复方法
    最小化安装centos7心得
    [转载]Windows 2008多用户同时远程登陆配置方法
    [转载]CentOS 7安装配置Samba服务器
    [转载]CentOS 下安装LEMP服务(Nginx、MariaDB/MySQL和PHP)
    [转载]CentOS 7 创建本地YUM源
    IIS配置注意点
  • 原文地址:https://www.cnblogs.com/xwc1996/p/9356395.html
Copyright © 2011-2022 走看看