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中 ...
随机推荐
- 关于在Vue中,只要单个列表显示模态框的做法。
1.在后台返回的数组对象中,添加一个自定义属性,这个属性用于控制模态框的显示.2.在事件中传入该列表的索引参数,然后在事件方法中找到数组相对应的下标,更改自定义属性便可
- Java NIO学习笔记五 FileChannel(文件通道)
Java NIO FileChannel Java NIO FileChannel是连接文件的通道.使用FileChannel,您可以从文件中读取数据和将数据写入文件.Java NIO FileCha ...
- Ambiguous mapping. Cannot map 'appController' method
笔者最初的一套代码模板 import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; impo ...
- 灵活配置tomcat根目录网站
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...
- JAVA 基础编程练习题20 【程序 20 求前 20 项之和】
20 [程序 20 求前 20 项之和] 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和. 程序分析:请抓住分子与分母的变化规律. pac ...
- windows配置apache支持https
https://my.oschina.net/ososchina/blog/510065
- Nmap工具介绍
使用方法 实例: nmap -v scanme.nmap.org 这个选项扫描主机scanme.nmap.org中 所有的保留TCP端口.选项-v启用细节模式. nmap -sS -O scanme. ...
- upload上传通关游戏
第一关:后缀名限制,抓包改一下后缀. 前端脚本检测文件扩展名.当客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消 息,前端的 js 脚本就对文件的扩展名进行检测来判断是否是可以上传的类型 ...
- 【ARM-Linux开发】在win下开发的eclipse+yougatoo+jlink环境搭建
在win下开发的eclipse+yougatoo+jlink环境搭建 一 工具的安装 第一步:安装gcc编译工具 yagarto-bu-2.21_gcc-4.6.2-c-C++_nl-1.19.0_g ...
- 使用apache-commons-lang3架构对HTML内容进行编码和反编码
String a="<br>"; String a_str=StringEscapeUtils.escapeHtml4(a);//编码 System.out.print ...