DotNet 笔记

东方欲晓,莫道君起早。

Asp.net下面的WebApi的Url以及请求使用注意

准备:

1:在VS中新建一个WebApi项目。

2:安装一个接口调试工具,个人推荐火狐浏览器的RestClient插件。

 

开始

外表多重要?同样又懒又蠢又笨,看人们对猪和熊猫的不同态度就知道了,对女人而言,外表决定你接触男人的广度。
对接口而言,直观判断你好坏的就是Url。

示例项目默认路由规则(在WebApiConfig.cs文件中),代码如下:

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

在示例项目中打开一个示例控制器(ValuesController.cs文件),代码如下:

    public class ValuesController : ApiController
    {
        // GET api/values
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        public void Post([FromBody]string value)
        {
        }

        // PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/values/5
        public void Delete(int id)
        {
        }
    }

根据默认的路由规则以及示例控制器代码,生成的请求URL是什么,请求方法HttpMethod是什么?可以看一下示例项目自带的帮助文档。

示例代码仅仅就是示例代码,它是一套最简单的最基础完整代码,在实际工作中,我们需要根据情况做许多补充,下面会说道这些。

首先,可以看到,请求方式HttpMethod是靠action名称决定的。我来回实验,总结的,

请求方式:在不显示指定请求方式( 使用[HttpGet]、[HttpPost]等等)的情况下,如果action方法名包含 get、post、put、delete、等字符串
或这些关键字的一部分字符串 ,那么请求方式就为对应的方式。

 

1、问题:如果我希望一个接口“可同时接受Get,Put请求”,咋办?

解决方法:使用[AcceptVerbs],[HttpGet][HttpPost]...等方法属性

        //方式1
        [HttpGet]
        [HttpPut]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
        //方式2
        [AcceptVerbs("get", "put")]
        public string Get(int id)
        {
            return "value";
        }

 

2、问题:在当前示例项目下,如果我需要两个Get请求,他们参数类型一样。如下:

        public string Get(int id)
        {
            return "value";
        }

        public string Get2(int id)
        {
            return "value";
        }

那么,按照当前的路由【routeTemplate: "api/{controller}/{id}】,会生成什么样的Url呢?结果这两个action接口在文档中都不显了,如图:

究其原因:他们生成的接口Url一模一样,参数一样,请求类型一样。傻傻分不清,所以都不显示了。

解决办法:

把路由改为【routeTemplate: "api/{controller}/{action}/{id}】,就是说,action也显示出来。如图:

 

3、问题:如果某个action,我不想让他当做接口,如何办?

解决办法:

为了防止一个方法被当做action来调用,可以使用NonAction特性。这个信号告诉框架此方法不是一个action,即使它匹配到了某一条路由规则。如下:

        [HttpPost]
        [ActionName("NonAction")]
        public string Get2(int id)
        {
            return "value";
        }

 

4、问题:如果有两个action,我希望映射到同一个URL上,Get请求为查询,Post请求为修改,如何办?

解决办法:你可以通过ActionName特性来重写action name。

        [HttpGet]
        [ActionName("aaaaaa")]
        public string QueryTest(int id)
        {
            //查询操作
            //...
            return "value";
        }

        [HttpPost]
        [ActionName("aaaaaa")]
        public void UpdateTest(int id)
        {
            //修改操作
            //...
        }

 

 5、补充小知识、HttpVerbs常用的简单介绍

	Delete	请求删除指定的 URI。

	Get	检索由请求的 URI 标识的信息或实体。

	Head	检索由请求的 URI 标识的信息或实体的消息头。

	Options	表示由请求 URI 标识的请求/响应链上提供的通信选项的相关信息请求。

	Patch	请求将请求实体中描述的一组更改应用于请求 URI 所标识的资源。

	Post	发布新实体作为对 URI 的补充。

	Put	替换由 URI 标识的实体。 

 

Loading