程序员

JavaScript 调用 WebApi 参数传递场景分析

2017-07-27  本文已影响218人  过桥

起因

近期使用WebApi过程中总遇到各种参数传递问题,特此总结复习
以下服务示例均为Web Api 2

场景一 Get

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

        // GET: api/TestWebApi/5
        public string Get(string id)
        {
            return "value";
        }
<script>
        $.ajax({
            url: "http://localhost:14884/api/TestWebApi",
            type: "get",
            data: {
                //"id": 5,
                "code": "1",  //无法获取
                "value": "hello" //无法获取
            },
            success: function (data) {
                console.log(data);
            }
        });
    </script>

小结
若调用中参数未匹配(本例中为注释id),则执行无参方法,输出为(2) ["value1", "value2"]
若调用中参数匹配,则执行有参方法,输出为value

场景二 Post

        public class DataModel
        {
            public string code { get; set; }
            public string value { get; set; }
        }

        // POST: api/TestWebApi
        public string Post([FromBody]DataModel dm)
        {
            return "Api捕获参数:" + dm.code + "_" + dm.value;
        }
    <script>
        $.ajax({
            url: "http://localhost:14884/api/TestWebApi",
            type: "post",
            data: {
                "id": 5,  //无法获取
                "code": "1",   //可以获取
                "value": "hello"   //可以获取
            },
            success: function (data) {
                console.log(data);
            }
        });
    </script>
Post 参数正常获取
小结
Post提交时,常用实体搭配使用,注意保持参数前后台一致即可正常解析

场景三 Post List数组

        public class DataModel
        {
            public string code { get; set; }
            public string value { get; set; }
        }

        // POST: api/TestWebApi
        public string Post([FromBody]List<DataModel> dm)
        {
            return "Api捕获参数:" + dm[0].code + "_" + dm[0].value;
        }
        var temp_data = [{
            "code": "1",
            "value": "hello"
        }, {
            "code": "2",
            "value": "world"
        }];
        $.ajax({
            url: "http://localhost:14884/api/TestWebApi",
            type: "post",
            data: temp_data,
            success: function (data) {
                console.log(data);
            }
        });
List Post 参数无法获取
Request Headers 经观察发送请求,怀疑请求类型问题,后经查找分析测试,调用示例做如下修改即可
        var temp_data = [{
            "code": "1",
            "value": "hello"
        }, {
            "code": "2",
            "value": "world"
        }];
        temp_data = JSON.stringify(temp_data);
        $.ajax({
            url: "http://localhost:14884/api/TestWebApi",
            contentType: 'application/json; charset=utf-8',//将json数据以request payload的形式发起请求
            type: "post",
            data: temp_data,
            success: function (data) {
                console.log(data);
            }
        });
Post List参数获取

场景三 部署后 405 异常补充说明

将场景三Web Api代码部署后,发现页面调用会出现 405
异常

405 异常
通过检索排除等方式,判断IIS设置问题,移除使用Web Api自动生成Web.confighandlersremove OPTIONSVerbHandler即可 处理程序映射 Web.config

参考
ASP.NET Web API(一):使用初探,GET和POST数据
WebApi后端的List<String>前端如何发送?
aspnet webapi 跨域请求 405错误

上一篇下一篇

猜你喜欢

热点阅读