(三)Asp.net web api中的坑-【http post请求中的参数】
接上篇,
HttpPost 请求
1、post请求,单参数
前端
var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");后端
[HttpPost]
public IHttpActionResult GetData2(string phone)
{
string result = "接口通了";
return Ok<string>(result);
}
这个,这个他妈的又来一个妖怪,为啥呢,这跟get差不多呀,咋就接不到了,
哦,还记得上篇的知识点麽?HTTP协议中get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),而post请求则是放在http协议包的包体中,
上篇的get请求中,传递实体时,[FromUri]-因为get请求,参数数据放置在HTTP协议头中,而post放在http协议包的包体中,如上图,推断出肯定有个[FromBody]之类的,事实胜于吹牛,试试再说,
前端
var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");后端
[HttpPost]
public IHttpActionResult GetData2([FromBody]string phone)
{
string result = "接口通了";
return Ok<string>(result);
}yeah,断点进action,but,phone=null,为啥呢,查阅相关大神写的博客,通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,单个参数,大神说要这么改,
前端
var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";
$.post(url, para, function () { }, "application/json");后端不变,好吧,phone确实能收到值了。
************************************************************************************
2、post请求,多个参数
既然post从请求主体中取参数的机制与get从url中取参数的机制不同,post为=value,
请求多参数-转换为请求实体-转换为请求单参数问题,
多参数包装成实体类,实体类包装成json字符串格式
前端
var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "13880825221";
para["UID"] = "uid287572292";
var str = JSON.stringify(para);
var data= {“”,str }
$.post(url, data, function () { }, "application/json");
后端
[HttpPost]
public IHttpActionResult GetData2([FromBody]string requestStr)
{var model= Newtonsoft.Json.JsonConvert.DeserializeObject<TB_RequestModel>(requestStr);
string result = "接口通了";
return Ok<string>(result);
}requestStr获取到json格式字符串,再反序列化为实体,即可。
如果我们前后台每次传递多个参数的post请求,每次都需要修改实体,对于不经常修改的参数,当然上面的方法已经足够,每次参数在变化,大神提供了一种解决方法,
前端
var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";para["UID"] = "uid287572292";
var data= JSON.stringify(para);
$.post(url, data, function () { }, "application/json");
后端
[HttpPost]
public object GetData2(dynamic obj)
{
var UID= Convert.ToString(obj.UID);string result = "接口通了";
return Ok<string>(result);}有一点需要注意的是这里在ajax的请求里面需要加上参数类型为Json,即 contentType: 'application/json', 这个属性,这是ajax请求,request content-type,后面我还会讲到response的content-type。
---------------------------------------------------------------------------------------------------------------------
3、post请求,实体参数
使用实体作为参数的时候,前端直接传递普通json,后台直接使用对应的类型去接收即可,不用FromBody。但是这里需要注意的一点就是,这里不能指定contentType为appplication/json,否则,参数无法传递到后台。httppost,request请求中默认的contentType:application/x-www-form-urlencoded,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
前端:
var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "phone13880825221";para["UID"] = "uid287572292";
var data= para;
$.post(url, data, function () { });
后端:
[HttpPost]
public IHttpActionResult test(RequestModel model)
{
string msg = "";
string code = "";
string result = "接口通了";
return Ok<string>(result);
}
model不为空,且各属性有值
ps,留意上面前端代码,$.post(url, data, function () { });没有指定request的content-type,
post请求默认是将表单里面的数据的key/value形式发送到服务,而我们的服务器只需要有对应的key/value属性值的对象就可以接收到。而如果使用application/json,则表示将前端的数据以序列化过的json传递到后端,后端要把它变成实体对象,还需要一个反序列化的过程。按照这个逻辑,那我们如果指定contentType为application/json,然后传递序列化过的对象应该也是可以的啊。
所以下面这种方式,也是可以的,
前端:
var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "13880825221";para["UID"] = "uid287572292";
var data= JSON.stringify(para);
$.post(url, data, function () { },"application/json”);
后端:
[HttpPost]
public IHttpActionResult test(RequestModel model)
{
string msg = "";
string code = "";
string result = "接口通了";
return Ok<string>(result);
}总结知识点:在http请求中,如果你指定了contentType为application/json,则必须要传递序列化过的对象;如果使用post请求的默认参数类型,则前端直接传递json类型的对象即可。
Post请求api,还有几种特别的,数组,集合,但是由于本人没有在工作中使用,所以没有发言权,不过使用方式都是上面的基本参数演变过来的,搞清楚原理和门路,相信使用的人可以应付多种参数请求的需求。
Post请求api,有时候,你会发现,方法什么的都对,还是会报
WebAPI Post类型传参报错“找不到与该请求匹配的操作” 参考博文http://www.cnblogs.com/xiaoerlang90/p/5420030.html
(三)Asp.net web api中的坑-【http post请求中的参数】的更多相关文章
- 使用 asp.net Web API 2的坑
使用工具: Googl 浏览器+PostMan 插件 写了个 控制器 添加了个Action,结果呢?GET 方式请求没问题. POST一直,在服务器端获取不了参数...找了官方的文档 .各种雨里雾 ...
- 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)
客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...
- ASP.NET WEB API 帮助文档引用单独项目中的DTO,见面上不显示字段注释问题解决办法
StackOverFlow上的解决办法: 问题地址
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- 使用ASP.NET Web API自带的类库实现对CORS的支持(在开发中使用这种方式)(转载)
在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...
- [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API
问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...
- ASP.NET Web API中的路由
ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中,我们通过自定义的HttpMessageHandler自行为ASP.NET Web API实现了针对CORS的支持, ...
- 剖析Asp.Net Web API中HttpController的激活
在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法.当请求经过Asp.Net Web API消息处理管道到达管道"龙尾" ...
- 在ASP.NET Web API中实现CORS(跨域资源共享)
默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...
随机推荐
- collection,random,os,sys,序列化模块
一.collection 模块 python拥有一些内置的数据类型,比如 str,list.tuple.dict.set等 collection模块在这些内置的数据类型的基础上,提供了额外的数据类型: ...
- Codeforces Round #336 (Div. 2) D. Zuma(区间DP)
题目链接:https://codeforces.com/contest/608/problem/D 题意:给出n个宝石的颜色ci,现在有一个操作,就是子串的颜色是回文串的区间可以通过一次操作消去,问最 ...
- javascript权威指南第22章高级技巧
HTML <!DOCTYPE html> <html> <head> </head> <body> <div style=" ...
- MyBatis底层实现原理: 动态代理的运用
转载:https://mp.weixin.qq.com/s/_6nyhaWX15mh3mkj8Lb0Zw Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口 ...
- spring boot 实现多个 interceptor 并指定顺序
首先我们创建Interceptor,实现HandlerInterceptor覆写方法:一.下面我创建了三个拦截器:MyInterceptor,UserInterceptor,StudentInterc ...
- mongodb mongod.lock文件及oplog文件
在mongodb的启动时,在数据目录下,会生成一个mongod.lock文件.如果在正常退出时,会清除这个mongod.lock文件,若要是异常退出,在下次启动的时候,会禁止启动,从而保留一份干净的一 ...
- 微信小程序环境下将文件上传到 OSS
步骤 1: 配置 Bucket 跨域 客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息.OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的 ...
- 在取变量名的时候,千万不要用new
这样子是会报错的
- meshing-局部加密
原视频下载地址: https://pan.baidu.com/s/1nvSf5qh 密码: cpbs
- LeetCode 222. 完全二叉树的节点个数(Count Complete Tree Nodes)
题目描述 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位 ...

