最近在写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参数传递的更多相关文章

  1. WebApi中的参数传递

    在WebApi开发过程中,遇到一些客户端参数格式传输错误,经常被问到参数如何传递的一些问题,因此就用这篇博客做一下总结,肯定其它地方呢也有类似的一些文章,但是我还是喜欢通过这种方式将自己的理解记录下来 ...

  2. .net core Web API参数绑定规则

    参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...

  3. webApi中参数传递

    webApi中参数传递 一:无参数的get方法: 前端:    function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...

  4. webapi 参数传递详解

    原因 经常有朋友遇到webapi参数传递问题,自己也碰到过一些坑,在此记录下正确的姿势,简单参数传递相信没有人会有问题,容易出现问题的是对象参数和表单参数. 1.WebApi5.2.3有FromBod ...

  5. .NET Core WebAPI post参数传递时后端的接收方式

    .NET Core WebAPI post参数传递时后端的接收方式 实体类 dynamic动态类型 JObject参数 单值参数(字符串参数) A.前端Post请求代码 $.ajax({ url: & ...

  6. [转]webApi 参数传递总结

    在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...

  7. WebApi参数传递

    c# webapi的参数传递方式:1.查询字符串(query string):2.内容主体(content body) 当然也有cookie或url部分或头部信息(header)等其它传方式,这里仅讨 ...

  8. WebApi参数传递总结

    在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...

  9. WebApi参数传递实例

    Get 1.基础数据类型 1.1方法只含有一个形参 (1)Get传值的本质是通过url字符串拼接(2)Get传递参数本质是url字符串拼接,Request-Head头部传递,Request-Body中 ...

随机推荐

  1. k8s管理机密信息(9)

    一.启动应用安全信息的保护: Secret介绍: 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...

  2. JavaScript 异步和单线程

    JavaScript语言本身是单线程的,所以它自身不可能是异步.所谓单线程,就必然意味着:所有任务需要排队,前一个任务结束,才会执行后一个任务. 但js的宿主环境(比如浏览器,Node)是多线程的.宿 ...

  3. 知识点整理-网络IO知识总结

    UNIX 系统下的 I/O 模型有 5 种 同步阻塞 I/O.同步非阻塞 I/O.I/O 多路复用.信号驱动 I/O 和异步 I/O 什么是I/O 所谓的I/O 就是计算机内存与外部设备之间拷贝数据的 ...

  4. Django:(01) 关于什么是Django?

    一.从 WSGI 开始了解 Django 在了解 Django 之前有必要先了解一下 Python 被用于 Web 开发的基础协议——WSGI. 在开发 web 应用时,我们不希望接触到TCP连接.H ...

  5. Arduino基础入门篇-进入Arduino的世界

    写在前面,首先是发现有网友对Arduino做了介绍,而且介绍比较清晰到位,就引用过来了. 文章出处:https://blog.csdn.net/TonyIOT/article/details/8091 ...

  6. Java学习笔记-内部类

    内部类在Android中有着大量的运用 内部类 内部类提供了更好的封装:内部类可以直接访问外部类的私有数据:匿名内部类适合那些只需要使用一次的类.非静态内部类不能拥有静态成员.内部类比外部类可以多使用 ...

  7. vue v-slot

    参考链接:https://www.jianshu.com/p/7020636d68a5

  8. 【转帖】Webmin 安装 (centos7 rpm 方式)

    https://www.cnblogs.com/osfipin/p/5948803.html 这两天公众号都在手这个小工具, 今天早上试了下 挺好用的 还看到了启动 samba 的方法. 一会儿 再学 ...

  9. Spring Boot 创建动态定时任务

    1,日期格式转换 //定时任务格式转换public static String convertCronTime(Date jobDate){ //https://blog.csdn.net/qq_39 ...

  10. 【洛谷】P4883 mzf的考验

    [洛谷]P4883 mzf的考验 最近忽然放弃治疗开始随机跳题了 感觉还行 就是必须吸氧感觉有点糟糕... 这题翻转和求和都是平衡树基本操作,那个异或可以通过维护树中\(2\)进制下第\(2^{i}\ ...