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中 ...
随机推荐
- Hbase shell操作表
启动hbase shell ./bin/hbase shell 1.创建表,查看表 create 'tableName', 'familykey1','familykey2',.... eg. cre ...
- 一个小故事,玩转Python-while循环
无论是传统编程场景还是当下火爆的人工智能应用场景,循环的应用都是必不可少的,上一篇文章中阐述了如何使用for循环来进行编程,这篇文章将会由一个小朋友经常听的故事来讲Python编程中的while循环. ...
- java 公共类
package com.javaweb.mvc; import java.text.*; import java.util.Date; import java.util.Random; public ...
- 前端contentType数据传输格式与ajax技术
前端数据格式contentType参数 前后端传输数据的编码格式 1.urlencoded(form表单与ajax默认的数据提交编码格式) 数据格式 name=' django后端识别到urlenco ...
- codevs 1200:同余方程
题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...
- [TCP/IP] 滑动窗口
什么是滑动窗口? 滑动窗口机制是TCP协议的一种流量控制和防拥塞的机制. 滑动窗口的工作原理? 简单来讲,就是接收方和发送方分别保留一块缓冲区,作为接收和发送数据来使用,发送数据过程中,如果发送方发的 ...
- [转帖]SPARC简介
https://www.cnblogs.com/chaohm/p/5674886.html 1. 概述 SPARC(Scalable Processor ARChitecture,可扩展处理器架 ...
- linux利用crontab添加定时任务详解
crontab 作用:添加,查询,删除系统计划任务的指令. [root@localhost ~]# crontab [选项]选项: -e: 编辑crontab定时任务 -l: ...
- LC 394. Decode String
问题描述 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], wh ...
- OpsManager管理MongoDB
mydb1 Ops Manager,mongodb,agent mydb2 mongodb,agent mydb3 mongodb,agent NUMA Settings sysctl -w vm.z ...