FromBody如何接收POST过来的json数据?

by_封爱 2017-04-01 03:25:39
服务端目前设计如下.

[Route("User/Add")]
[HttpPost]
public dynamic AddUser([FromBody] Product p)
{
if (p == null)
{
throw new Exception("产品为空");
}
return Json(p);
}

并且在注册的时候有以下代码.

config.MapHttpAttributeRoutes();
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/xml"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new Headers.MediaTypeHeaderValue("text/json"));

我js作为客户端的时候 使用以下代码 可以正常得到p的值.

var d = { "id": 54, "name": "产品1", "price": 11.11, "time": "2000-01-01T00:00:00" };
$.post("User/Add", d, function (data) {
var rs = JSON.stringify(data);
alert(rs);
});

但是如果我用HttpWebReques客户端请求的时候发现了问题.

request.Method = "POST";
request.ContentType = "application/json";

如果是这样写.是正常的 同 js返回值.
但是我不能要求客户端这样写..因为他们很多时候 都是网上找的代码.post数据 其实是这样的.

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

因为这是标准的.. 我调用微信接口的时候 也是这样的方式.. 所以比较大众化.

我在过滤器中看到请求 是这样的

如果是ajax请求 其实我得到的数据 是id=1&name=产品&price=11.11.. 这样的数据 能被frombody识别.

但是如果我用application/x-www-form-urlencoded这样的方式POST过来的数据 其实就是json字符串
这种

string rs= " { "id": 54, "name": "产品1", "price": 11.11, "time": "2000-01-01T0"}";


所以 有什么办法 在不改ContentType 的情况下 能保证2种客户端 都正常的通讯?

也就是 在ContentType =application/x-www-form-urlencoded的时候,api接口中的"对象参数"依然可以"反序列化"
...全文
4515 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
橘子皮... 2019-08-10
  • 打赏
  • 举报
回复
DefaultModelBinder
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
哎 放弃了 挺费劲的. 还是强制客户端保存一致吧...
Poopaye 2017-04-05
  • 打赏
  • 举报
回复
看代码或者框架吧,tx应该不会用asp吧
至少asp应该没有现成的:Web API Routing by Content-Type
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 12 楼 shingoscar 的回复:
http://iot.weixin.qq.com/wiki/document-2_12.html 如果你不长做开发,像这种: POST数据说明 { "ticket": "TICKET", "device_id": "DEVICEID", "openid": " OPENID" } 意思不是让你用json传,而就是ticket=TICKET&device_id=DEVICEID&openid=OPENID 如果你是用$.post传,它也会转成上面的格式
但是我现在用json传 但是contenttype还是默认的而不是application/json 正常情况下 其实是我做错了.. 但是为什么他还是能兼容我这种错误的写法呢?' 当然假设他们用webapi 我想到的办法 就是判断type跟内容是否一直 如果不一致 强制一致或者使用别的办法. 这里我也可以写出来.但是我想要一种一劳永逸的方式..
Poopaye 2017-04-05
  • 打赏
  • 举报
回复
http://iot.weixin.qq.com/wiki/document-2_12.html 如果你不长做开发,像这种: POST数据说明 { "ticket": "TICKET", "device_id": "DEVICEID", "openid": " OPENID" } 意思不是让你用json传,而就是ticket=TICKET&device_id=DEVICEID&openid=OPENID 如果你是用$.post传,它也会转成上面的格式
peng2739956 2017-04-05
  • 打赏
  • 举报
回复
微信公众号平台吗? 讲道理 我都是用的SDK 来开发微信,并不是自己手动去写那些请求API什么的...
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 9 楼 shingoscar 的回复:
主要问题起因在于客户端没有按照规则来不是吗 如果你是MVC开发者,你会考虑到日后还有这种情况吗?
你看上面的代码..腾讯的接口 就是没有按照"标准"来.. 所以假设有一个人 以前开发过微信 .然后又调用我的webapi. 按照他现在的套路 一定抛出异常了. 因为我标准 他不标准. 但是他又会说..
引用
为什么我这代码请求微信接口能通过 请求你的 就异常啊? 腾讯能实现. 你也一定能实现吧 为什么人家支持x-www-form-urlencoded的json 而你不支持呢?
Poopaye 2017-04-05
  • 打赏
  • 举报
回复
引用 3 楼 diaodiaop 的回复:
[quote=引用 2 楼 shingoscar 的回复:] 不要frombody 拿request.content解析呗
关键不是还得自己解析吗? 现在就是想让客户端 不管是json还是encode的方式上传 客户端都正常. 而且服务端只写简单的代码 自己解析肯定可实现..现在是没有没更简单的办法兼容2种..[/quote] 主要问题起因在于客户端没有按照规则来不是吗 如果你是MVC开发者,你会考虑到日后还有这种情况吗?
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 7 楼 starfd 的回复:
request.ContentType = "application/x-www-form-urlencoded" 这样的时候,就让对方按正常的post方式提交,不要传json,本来MVC就是根据content-type来决定如何解析的,何必自己折腾自己呢
你作为服务端 你一定要"兼容"吧. 我们假设 用户用了application/x-www-form-urlencoded 但是同时提交了json. 这个时候虽然"规定"的时候 是一致. 但是人家就不一致或者忘记修改了报错了... 如果做的好的 你是要兼容2个模式了. 比如 我们说微信的接口中..我的代码如下.

 if (MessageBox.Show(this, "确定要解绑吗?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                var postObject = new { device_id = devid.ToString().Replace("-", ""), openid = (com_openid.SelectedValue ?? txt_openid.Text) };
                var postJson = dosoft.Common.JsonHelper.GetJson(postObject);
                var url = "https://api.weixin.qq.com/device/compel_unbind?access_token=" + txt_access_token.Text;
                var rs = dosoft.HttpWebResponseUtility.PostHttp(url, postJson);
                MessageBox.Show(rs);
            }
而我在HttpWebResponseUtility中的代码的

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
我类型完全不一致.. 但是依然可以提交.. 可能是微信这个东西并不标准... 但是最起码 给开发人员带来的好处是 任何类型的type 任何类型的body 我都能识别.. 而虽然我写几句判断 一样可以实现这个东西. 但是归根结底 我想用最减短的代码 来实现最多的功能.. 仅此而已.. 因为我觉得mvc(webapi) 这么高端的东西 一定有这种实现方式..而不是在每个acion里都判断...
  • 打赏
  • 举报
回复
request.ContentType = "application/x-www-form-urlencoded" 这样的时候,就让对方按正常的post方式提交,不要传json,本来MVC就是根据content-type来决定如何解析的,何必自己折腾自己呢
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
少写一句话,浪费多少开发和调试的时间啊。
不只是一句话 . 得判断客户端ContentType 跟实际post上来的内容是否一致 假设一致 我们就可以使用FromBody 如果不一致的话 我就得判断content的具体内容来反序列化. 所以 如果有"拦截器"之类的东西...我在半路发现不一致那么我就"强制"让他们一直..这样的话不就省了很多工作吗.
  • 打赏
  • 举报
回复
少写一句话,浪费多少开发和调试的时间啊。
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
不要frombody 拿request.content解析呗
虽然可以

var model=json.des...<model.xxx>(request.oooooo);
来解析..但是现在就是 懒得连这句话 也不写... 就想着 哪里稍微弄一下子 然后 就跟formbody一样使用 少写一句话 提升多少效率啊
by_封爱 2017-04-05
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
不要frombody 拿request.content解析呗
关键不是还得自己解析吗? 现在就是想让客户端 不管是json还是encode的方式上传 客户端都正常. 而且服务端只写简单的代码 自己解析肯定可实现..现在是没有没更简单的办法兼容2种..
Poopaye 2017-04-01
  • 打赏
  • 举报
回复
不要frombody 拿request.content解析呗
正怒月神 版主 2017-04-01
  • 打赏
  • 举报
回复
http://www.cnblogs.com/loogn/p/6275659.html http://blog.csdn.net/hanjun0612/article/details/50893719

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧