WebApi

Posted 领域见识决定专业高度

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebApi相关的知识,希望对你有一定的参考价值。

1:当Controller中有相同参数的方法时,请求调用会报错

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

public string ResturnResult()
{
      return "Success";
}

原因:webapi默认的路由是不带有action的,所以它无法知道你到底调用的是哪一个!

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            // 取消注释下面的代码行可对具有 IQueryable 或 IQueryable<T> 返回类型的操作启用查询支持。
            // 若要避免处理意外查询或恶意查询,请使用 QueryableAttribute 上的验证设置来验证传入查询。
            // 有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=279712//config.EnableQuerySupport();

            // 若要在应用程序中禁用跟踪,请注释掉或删除以下代码行
            // 有关详细信息,请参阅: http://www.asp.net/web-api
            config.EnableSystemDiagnosticsTracing();
        }
    }

修改路由为带有action:

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

 

2:参数传递问题

(1)get方式和mvc中一样的

$.ajax({
            url: "/api/Values/GetList",
            type: "get",
            data: { name: "test1" },
            success: function (data) {
                alert(JSON.stringify(data));
                alert(data.length);
            },
            error: function () {
                alert("失败");
            }
});

  public List<Person> GetList(string name)
        {
            var PersonList = new List<Person>(){
                  new Person{Name="test1",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"},
                  new Person{Name="test2",Sex="女",Duty="工程师",CompanyName="北京XX科技有限公司"},
                  new Person{Name="test3",Sex="男",Duty="工程师",CompanyName="北京XX科技有限公司"}
             };
            return PersonList.Where(p => p.Name == name).ToList();
        }

(2)post提交,如果按照上面的方式是无法获取到参数的;一个参数的post请求和GET请求的方式不一样,后台函数的参数必须用[FromBody]标记,这样才能访问到该函数,如果不加[FromBody] , ASP.NET Web API能够正确的识别我们的 控制器 ,但却不能找到一个可以接受的方法来处理请求。那么后台参数加了[FromBody] ,代码如下是不是就可以请求成功哪?

    $.ajax({
            url: "/api/Values/GetList",
            type: "post",
            data: { name: "test1" },
            success: function (data) {
                alert(JSON.stringify(data));
                alert(data.length);
            },
            error: function () {
                alert("失败");
            }
        });

    [HttpPost]
        public List<Person> GetList([FromBody]string name)
        {
            var PersonList = new List<Person>(){
                  new Person{Name="test1",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"},
                  new Person{Name="test2",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"},
                  new Person{Name="test3",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"}
             };
            return PersonList.Where(p => p.Name == name).ToList();
        }

答案是失败的,确切的说是可以访问到控制器里的GetList方法的,但是GetList函数的参数是获取不到前台ajax传递过来的值得,为什么呢?是因为Web API 要求请求传递的 [FromBody] 参数,是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。

所以 将data:{"name":"test1" } 改成data:{"":"test1" } 这样后台函数才可以正确接收到传递过来的参数值。

 

3:多个参数的POST请求

function GetResult() {
        var person = {
            Name: "test1",
            Sex:""
        };
        $.ajax({
            url: "/api/Values/GetList",
            type: "post",
            data: person,
            success: function (data) {
                alert(JSON.stringify(data));
                alert(data.length);
            },
            error: function () {
                alert("失败");
            }
        });
}
[HttpPost]
public List<Person> GetList([FromBody]Person per) { var PersonList = new List<Person>(){ new Person{Name="test1",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test2",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"}, new Person{Name="test3",Sex="",Duty="工程师",CompanyName="北京XX科技有限公司"} }; return PersonList.Where(p => p.Name == per.Name && p.Sex == per.Sex).ToList(); }

4:多个对象的传递

根据3中的方式,多个对象就好解决了;采用JSON.stringify传递,后台进行反序列即可;

 

5:接口测试工具

 WebApi接口测试工具:WebApiTestClient         http://www.cnblogs.com/landeanfen/p/5210356.html

 

6:webapi使用场景

选择Web API还是WCF : http://www.cnblogs.com/klsw/archive/2016/03/02/5236621.html

以上是关于WebApi的主要内容,如果未能解决你的问题,请参考以下文章

RestFramework

添加 DelegatingHandler 后,WebAPI 2 出现间歇性 CORS 问题

Django REST framework 基本组件

Django REST framework序列化

rest_framework

OData JSON camelCase