• 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

  • 相关阅读:
    java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
    JNA
    Java发邮件带附件测试通过
    Java-JDBC调用批处理、存储过程、事务
    Java的JDBC事务详解
    对只转发结果集的无效操作:last
    Servlet 监听器
    TOMCAT6热部署配置
    使用命名参数处理 CallableStatement
    如何在JTable中动态添加一行
  • 原文地址:https://www.cnblogs.com/tianboblog/p/5236920.html
Copyright © 2020-2023  润新知