(三)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 ...
随机推荐
- boost::singleton
singleton即单件模式,实现这种模式的类在程序生命周期里只能有且仅有一个实例. 使用singleton,需要包括头文件: #include <boost/serialization/sin ...
- MongoDB 集群设置集合分片生效及查看集合分片情况
一.设计DB分片与Collection分片 #连接mongos /opt/mongodb/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:27017 ...
- span标签
<span>在行内定义一个区域,也就是一行内可以被<span>划分成好几个区域,从而实现某种特定效果.<span>本身没有任何属性. <span> 与& ...
- 关于 js 函数参数的this
先看一道面试题: var number = 10; function fn() { console.log(this.number); } var obj = { number: 2, show: f ...
- P4514 上帝造题的七分钟——二维树状数组
P4514 上帝造题的七分钟 求的是矩阵里所有数的和: 维护四个树状数组: #include<cstdio> #include<cstring> #include<alg ...
- 基于部标1078视频协议和苏标Adas协议构建主动安全平台
苏标本身仍然是基于部标808协议的基础上递增起草的,苏标协议是包容808协议的, 不能脱离808协议而独立存在的, 主要基于<JT/T 796 道路运输车辆卫星定位系统平台技术要求>.&l ...
- Java基础系列 - equals和==的区别
package com.test7; public class test7 { public static void main(String[] args) { /** * 1.equals()比较的 ...
- linux ssh终端解决中文乱码的问题
@1:第一种办法: 在linux服务器里 命令行修改Linux服务器文件: vi /etc/sysconfig/i18n 默认的内容为: LANG="zh_CN.UTF-8" ; ...
- Apache Flink - Window
Window: 在Streaming中,数据是无限且连续的,我们不可能等所有数据都到才进行处理,我们可以来一个就处理一下,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们 ...
- docker install and minikube install
1.选择国内的云服务商,这里选择阿里云为例 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/ ...

