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

起因

近期使用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错误

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,761评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,799评论 25 709
  • 文:岚小茉 01 很多年以来,我都为自己的性格苦恼。 我羡慕那些在人群中侃侃而谈的人,刚见面就能打成一片,在社交活...
    岚小茉阅读 5,185评论 0 1
  • 没错,我是一个爱哭鬼。 爱哭,仿佛已经成为了矫情的代名词。 我今天又哭了,一个比较好的同事要离职,在她收拾好东西,...
    画语青黛阅读 2,532评论 0 0
  • 8月30日,一直说想吃生蚝,一直说要约起吃饭,感谢她们一个月对自己的帮助,终于约上了。20:00,蚝好吃。妮妮、汤...
    小确幸里的小幸福阅读 1,222评论 0 0