最近在写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. Hbase shell操作表

    启动hbase shell ./bin/hbase shell 1.创建表,查看表 create 'tableName', 'familykey1','familykey2',.... eg. cre ...

  2. 一个小故事,玩转Python-while循环

    无论是传统编程场景还是当下火爆的人工智能应用场景,循环的应用都是必不可少的,上一篇文章中阐述了如何使用for循环来进行编程,这篇文章将会由一个小朋友经常听的故事来讲Python编程中的while循环. ...

  3. java 公共类

    package com.javaweb.mvc; import java.text.*; import java.util.Date; import java.util.Random; public ...

  4. 前端contentType数据传输格式与ajax技术

    前端数据格式contentType参数 前后端传输数据的编码格式 1.urlencoded(form表单与ajax默认的数据提交编码格式) 数据格式 name=' django后端识别到urlenco ...

  5. codevs 1200:同余方程

    题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空 ...

  6. [TCP/IP] 滑动窗口

    什么是滑动窗口? 滑动窗口机制是TCP协议的一种流量控制和防拥塞的机制. 滑动窗口的工作原理? 简单来讲,就是接收方和发送方分别保留一块缓冲区,作为接收和发送数据来使用,发送数据过程中,如果发送方发的 ...

  7. [转帖]SPARC简介

    https://www.cnblogs.com/chaohm/p/5674886.html 1.    概述 SPARC(Scalable Processor ARChitecture,可扩展处理器架 ...

  8. linux利用crontab添加定时任务详解

    crontab 作用:添加,查询,删除系统计划任务的指令. [root@localhost ~]# crontab [选项]选项:    -e:    编辑crontab定时任务    -l:    ...

  9. LC 394. Decode String

    问题描述 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], wh ...

  10. OpsManager管理MongoDB

    mydb1 Ops Manager,mongodb,agent mydb2 mongodb,agent mydb3 mongodb,agent NUMA Settings sysctl -w vm.z ...