webapi 之 post参数传递
最近在写webapi,在写post请求接口时遇到了不少的问题,在此记录下来。
post请求的参数和get请求有点不一样,我们知道get请求的参数是通过url来传递的,而post请求则是通过http的请求体中传过来的,WebApi的post请求也需要从http的请求体里面去取参数。
单个参数错误写法
//错误的js ajax post写法
$.ajax({
type:"post",
url:"http://localhost:44670/IOF/test/Test1",
data:{name:"张三丰"},
success:function(data,status){
console.log(data);
console.log(status);
}
});
//错误的webapi写法
[HttpPost]
public string Test1(string name)
{
return name;
}
上面的写法看似很正确,实际上结果这这样的

而且我们在asp.net webapi里打上断点是无法跳转到断点的。
我们更改asp.net webapi(在参数中添加 [FromBody] ),如下
[HttpPost]
public string Test1([FromBody] string name)
{
return name;
}
我们仍然用上面的js来调用接口Test1
此时就可以看到程序跳转到了断点处,但是我们发现name是空值

单个参数正确写法
//正确的js写法
$.ajax({
type:"post",
url:"http://localhost:44670/IOF/test/Test1",
data:{"":"张三丰"},
success:function(data,status){
console.log(data);
console.log(status);
}
});
//正确的webapi写法
[HttpPost]
public string Test1([FromBody] string name)
{
return name;
}
此时我们就看到Status Code是200OK了,webapi也拿到了传递过来的name值了


我们一般的通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,没有key的概念,并且如果你写了key(比如ajax参数写的{name:"张三丰"}),后台反而得到的name等于null。
上面是传递1个参数,那如果是多个呢?是不是ajax可以这样写{" ":"张三丰"," ":"13200000000"},后台可以这样写[FromBody] string name,[FromBody] string phone
多个参数错误写法
//错误的写法
$.ajax({
type:"post",
url:"http://localhost:44670/IOF/test/Test1",
data:{"":"张三丰","":"13200000000"},
success:function(data,status){
console.log(data);
console.log(status);
}
});
//错误的写法
[HttpPost]
public string Test1([FromBody] string name, [FromBody] string phone)
{
return name + ":" + phone;
}

说明这样是行不通的。
多个参数正确写法
//正确写法
$.ajax({
type:"post",
url:"http://localhost:44670/IOF/test/Test1",
data:{name:"张三丰",phone:"13200000000"},
success:function(data,status){
console.log(data);
console.log(status);
}
});
//test:新建一个类如包涵所有的参数
public class test
{
private string name;
private string phone;
public string Name
{
get{return name;}
set{ name = value;}
}
public string Phone
{
get{return phone;}
set{phone = value;}
}
}
//正确写法
[HttpPost]
public string Test1([FromBody] test model)
{
return model.Name;
}


如果我们的webapi都是post,而且每个都是多个参数,那岂不是要创建很多的类来接收post过来的值?作为一个爱偷懒的程序员,那怎么可以!!
最优写法
// JSON.stringify():这个函数的作用主要是为了序列化对象的。
$.ajax({
type:"post",
url:"http://localhost:44670/IOF/test/Test1",
contentType: 'application/json',
data:JSON.stringify({name:"张三丰",phone:"13200000000"}),
success:function(data,status){
console.log(data);
console.log(status);
}
});
//webapi 要换个写法,dynamic:序列化
[HttpPost]
public string Test1(dynamic obj)
{
return obj.name;
}
我们把js要传递的参数序列化,然后通过后来dynamic来接收序列化的值。

总结
以上就是post请求参数传递的几种方法,推荐使用最好一种【最优写法】。
转自:https://www.jianshu.com/p/26999e75cfba
webapi 之 post参数传递的更多相关文章
- WebApi中的参数传递
在WebApi开发过程中,遇到一些客户端参数格式传输错误,经常被问到参数如何传递的一些问题,因此就用这篇博客做一下总结,肯定其它地方呢也有类似的一些文章,但是我还是喜欢通过这种方式将自己的理解记录下来 ...
- .net core Web API参数绑定规则
参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...
- webApi中参数传递
webApi中参数传递 一:无参数的get方法: 前端: function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...
- webapi 参数传递详解
原因 经常有朋友遇到webapi参数传递问题,自己也碰到过一些坑,在此记录下正确的姿势,简单参数传递相信没有人会有问题,容易出现问题的是对象参数和表单参数. 1.WebApi5.2.3有FromBod ...
- .NET Core WebAPI post参数传递时后端的接收方式
.NET Core WebAPI post参数传递时后端的接收方式 实体类 dynamic动态类型 JObject参数 单值参数(字符串参数) A.前端Post请求代码 $.ajax({ url: & ...
- [转]webApi 参数传递总结
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...
- WebApi参数传递
c# webapi的参数传递方式:1.查询字符串(query string):2.内容主体(content body) 当然也有cookie或url部分或头部信息(header)等其它传方式,这里仅讨 ...
- WebApi参数传递总结
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...
- WebApi参数传递实例
Get 1.基础数据类型 1.1方法只含有一个形参 (1)Get传值的本质是通过url字符串拼接(2)Get传递参数本质是url字符串拼接,Request-Head头部传递,Request-Body中 ...
随机推荐
- 使用VLC发送TS流与播放TS流
使用VLC发送TS流与播放TS流 一.如何使用VLC发送TS流 1.添加一个文件至VLC 2.选择串流,继续 3.选择UDP,点击添加 4.输入地址及端口 5.选择h.264+mp3(TS) 6.ne ...
- [Scikit-learn] *2.3 Clustering - MeanShift
sklearn.cluster.MeanShift Ref: http://scikit-learn.org/stable/auto_examples/cluster/plot_mean_shift. ...
- Delphi repeat Until 运用
procedure TForm3.SpeedButton1Click(Sender: TObject); Var I:integer; begin I:=; repeat I:=I+; ; ShowM ...
- VS自定义代码块Code Snippet
一 .简述 我们在开发当中,避免不了一些重复的开发工作,在你漫长的开发以及学习当中,你会发现有这么一部分代码是你时常会使用到的.我想这个工具也是针对这个原因出来的吧,它就是预先把你需要的这部分代码的 ...
- onethink多图上传
模板处理, 可以参考 checkbox 的. 注:edit 方法的 基本一样,需要先把已有的数据展示出来,绑定双击事件,删除图片 需要先绑定给已经展示出来的图片, uploadPicture 的cal ...
- oracle数据库可视化工具
1.TreeSoft基于web网页方式,管理维护oracle数据,功能包括:SQL在线执行,数据在线维护管理,数据导出,数据交换同步等. 支持MySQL,Oracle,DB2,PostgreSQL,S ...
- windows7-jdk配置
这里主要讲这么配置环境变量 1.下载jdk安装程序,一直下一步就行了,安装完成 2.添加环境变量 JAVA_HOME 如:C:\Program Files\Java\jdk1.7.0_80 CLASS ...
- Go语言中defer语句使用小结
defer是Go语言中的延迟执行语句,用来添加函数结束时执行的代码,常用于释放某些已分配的资源.关闭数据库连接.断开socket连接.解锁一个加锁的资源.Go语言机制担保一定会执行defer语句中的代 ...
- 简单深入Joomla!3.1.5模块_组件开发(一)
简单深入Joomla!3.1.5模块_组件开发 主要内容: 1, 模块(访问数据库,链接到组件,数据基本流向) 2, 组件CRUD(MVC模式,访问数据库,表单提交,AJAX提交,数据基本流向) 3, ...
- hdoj3534(树形dp,求树的直径的条数)
题目链接:https://vjudge.net/problem/HDU-3534 题意:给出一棵树,求树上最长距离(直径),以及这样的距离的条数. 思路:如果只求直径,用两次dfs即可.但是现在要求最 ...