zoukankan      html  css  js  c++  java
  • ASP.NET WebAPI 02-Action的选择(一)

    在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步。

    Http方法匹配

    WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptVerbs特性,HttpXXX特性

    方法前缀:

    在上一篇中都是采用的这种方式,即将Http方法作为Action的前缀。比如GetAll, PostByUrl。

    另外这种方式只能指定一种Http方法,比如GetPutPostAll()只支持GET请求

    AcceptVerbs特性

    AcceptVerbs特性提供了两个构造函数:

    public AcceptVerbsAttribute(params string[] methods)

    public AcceptVerbsAttribute(string method)

    通过这两个构造函数我们可以为Action的指定Http请求方式,比如:

    [AcceptVerbs("POST","PUT")]

    public IEnumerable<Figure> PostByBody([FromBody] Figure figure)

    这个时候就可以采用Post,Put方式进行访问。

    HttpXXX特性

    HttpXXX方式跟AcceptVerbs类似,我们可以将其看成是AcceptVerbs的防错误方式(在拼写http方法时可能会出现失误),其格式如下:

    [HttpPut]

    [HttpPost]

    public IEnumerable<Figure> PostByBody([FromBody] Figure figure)

    ASP.NET WebAPI定义了7种对应的特性类型:

    HttpGet

    HttpHead

    HttpPut

    HttpPost

    HttpPatch

    HttpOptions

    HttpDelete

    如果采用了AcceptVerbs与HttpXXX方式,那么前缀方式将失效。AcceptVerbsAttribute与HttpXXXAttribute都实现接口IActionHttpMethodProvider,所以最终的可以采用的Http请求方法是这两种方式的并集

    Action方法名匹配

    方法名的匹配因为比较简单,在这里我们来看一下VS2013默认生成的路由模板。

            public static void Register(HttpConfiguration config)
            {
                // Web API 配置和服务
    
                // Web API 路由
                config.MapHttpAttributeRoutes();
    
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            }
    

      

    VS2013默认情况下
    提供的路由格式为"api/{controller}/{id}",并没有提供action,所以在进行Action查找的时候只会根据请求方式与参数进行匹配。

    在Figure中定义两个方法,分别是:

    public IEnumerable<Figure> GetAll()

    public Figure GetFigure(string firstName)

    分别用以下url进行访问:

    http://localhost:7075/api/Figure

    http://localhost:7075/api/Figure?firstName=Bran

    此时他们调用的方法分别是GetAll, GetByQueryString

    另外在FigureController再加一个无参无返回值的Get方法,现在再用http://localhost:7075/api/Figure访问就会得到"找到了与该请求匹配的多个操作"的错误消息

    参数匹配

    在.NET中方法可以重载,所以在Action的选择中也会有对参数的匹配过程。参数的来源于RouteData与QueryString。在匹配中,会出现以下几种情况(为了在):

    1.所有参数无默认值

    这种情况下就会对所有参数进行匹配,如下:

    public Figure GetFromQueryString(string firstName)

    public Figure GetFromQueryString(string firstName,string lastName)

    用以下Url进行访问

    http://localhost:7075/api/Figure/GetByQueryString?firstName=Bran

    http://localhost:7075/api/Figure/GetByQueryString?firstName=Bran&lastName=Stack

    分别调用的是GetFromQueryString(string firstName), GetFromQueryString(string firstName,string lastName。

    但我们使用http://localhost:7075/api/Figure/GetByQueryString进行访问,会返回"404 Not FOUND"。

    2.存在默认只参数

    首先可以确认的是,优先进行所有参数进行匹配,如果没有匹配的Action再进行二轮匹配

    public IEnumerable< Figure> GetFromQueryStringDefaultValue(string lastName="Stack")

    public Figure GetFromQueryStringDefaultValue(string firstName, string lastName="Stack")

    Action一通过以下url都可以访问

    http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue

    http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?lastName=Jon

    Action二通过以下Action也都可以访问

    http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?firstName=Bran

    http://localhost:7075/api/Figure/GetFromQueryStringDefaultValue?firstName=Bran&lastName=Stack

    如果我们将Action二的firstName也设置默认值,那么上面四个url进行访问都和得到"找到了与该请求匹配的多个操作"的错误。

    3.参数类型

    方法的重载由参数数量、参数类型、参数类型顺序决定,由于Web访问的特殊性(只根据参数名匹配参数)所以参数类型顺序不作为匹配的原则。上面的两种情况都是对参数数量的匹配。在FigureController重载方法GetFromQueryStringType

    public string GetFromQueryStringType(string x, string y)

    public int GetFromQueryStringType(int x, int y)

    通过http://localhost:7075/api/Figure/GetFromQueryStringType?x=1&y=2访问。此时会得到"找到了与该请求匹配的多个操作"。

    所以仅仅只通过参数类型(参数名相同)进行重载是不行的。

    可以作为Action的方法

    1. 公共的实例方法
    2. 方法不是继承自ApiController

    源码

    Github: https://github.com/BarlowDu/WebAPI (API_2)

  • 相关阅读:
    windows 下安装securecrt 绿色版
    对Linux命令进一步学习vim(二)
    提高php编程效率的小结
    javaScript 的小技巧
    常用 Git 命令文档和命令
    你 get 了无数技能,为什么一事无成
    Ubuntu14.4下安装FTP
    对Linux命令进一步学习
    可以输入也可以下拉选择的select
    APP接口基础学习一
  • 原文地址:https://www.cnblogs.com/gangtianci/p/4767744.html
Copyright © 2011-2022 走看看