接上篇,

HttpPost 请求

1、post请求,单参数

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2(string phone)
        {
            string result = "接口通了";
            return Ok<string>(result);
        }

这个,这个他妈的又来一个妖怪,为啥呢,这跟get差不多呀,咋就接不到了,

哦,还记得上篇的知识点麽?HTTP协议中get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),而post请求则是放在http协议包的包体中

上篇的get请求中,传递实体时,[FromUri]-因为get请求,参数数据放置在HTTP协议头中,而post放在http协议包的包体中,如上图,推断出肯定有个[FromBody]之类的,事实胜于吹牛,试试再说,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2([FromBody]string phone)
        {
            string result = "接口通了";
            return Ok<string>(result);
        }

yeah,断点进action,but,phone=null,为啥呢,查阅相关大神写的博客,通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,单个参数,大神说要这么改,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";
$.post(url, para, function () { }, "application/json");

后端不变,好吧,phone确实能收到值了。

************************************************************************************

2、post请求,多个参数

既然post从请求主体中取参数的机制与get从url中取参数的机制不同,post为=value,

请求多参数-转换为请求实体-转换为请求单参数问题,

多参数包装成实体类,实体类包装成json字符串格式

前端

var url = 'api/EnterOrExit/GetData2';

var para = {};

para["phone"] = "13880825221";

para["UID"] = "uid287572292";

var str = JSON.stringify(para);

var data= {“”,str }

$.post(url, data, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2([FromBody]string requestStr)
        {

var model= Newtonsoft.Json.JsonConvert.DeserializeObject<TB_RequestModel>(requestStr);
            string result = "接口通了";
            return Ok<string>(result);
        }

requestStr获取到json格式字符串,再反序列化为实体,即可。

如果我们前后台每次传递多个参数的post请求,每次都需要修改实体,对于不经常修改的参数,当然上面的方法已经足够,每次参数在变化,大神提供了一种解决方法,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";

para["UID"] = "uid287572292";

var data= JSON.stringify(para);

$.post(url, data, function () { }, "application/json");

后端

[HttpPost]
public object GetData2(dynamic obj)
{
var UID= Convert.ToString(obj.UID);

string result = "接口通了";
        return Ok<string>(result);

 }

有一点需要注意的是这里在ajax的请求里面需要加上参数类型为Json,即 contentType: 'application/json', 这个属性,这是ajax请求,request content-type,后面我还会讲到response的content-type。

---------------------------------------------------------------------------------------------------------------------

3、post请求,实体参数

使用实体作为参数的时候,前端直接传递普通json,后台直接使用对应的类型去接收即可,不用FromBody。但是这里需要注意的一点就是,这里不能指定contentType为appplication/json,否则,参数无法传递到后台。httppost,request请求中默认的contentType:application/x-www-form-urlencoded,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

前端:

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "phone13880825221";

para["UID"] = "uid287572292";

var data= para;

$.post(url, data, function () { });

后端:

[HttpPost]
public IHttpActionResult test(RequestModel model)
{
           string msg = "";
           string code = "";
           string result = "接口通了";
           return Ok<string>(result);
}

model不为空,且各属性有值

ps,留意上面前端代码,$.post(url, data, function () { });没有指定request的content-type,

post请求默认是将表单里面的数据的key/value形式发送到服务,而我们的服务器只需要有对应的key/value属性值的对象就可以接收到。而如果使用application/json,则表示将前端的数据以序列化过的json传递到后端,后端要把它变成实体对象,还需要一个反序列化的过程。按照这个逻辑,那我们如果指定contentType为application/json,然后传递序列化过的对象应该也是可以的啊。

所以下面这种方式,也是可以的,

前端:

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "13880825221";

para["UID"] = "uid287572292";

var data= JSON.stringify(para);

$.post(url, data, function () { },"application/json”);

后端:

[HttpPost]
public IHttpActionResult test(RequestModel model)
{
           string msg = "";
           string code = "";
           string result = "接口通了";
           return Ok<string>(result);
}

总结知识点:在http请求中,如果你指定了contentType为application/json,则必须要传递序列化过的对象;如果使用post请求的默认参数类型,则前端直接传递json类型的对象即可。

Post请求api,还有几种特别的,数组,集合,但是由于本人没有在工作中使用,所以没有发言权,不过使用方式都是上面的基本参数演变过来的,搞清楚原理和门路,相信使用的人可以应付多种参数请求的需求。

Post请求api,有时候,你会发现,方法什么的都对,还是会报

WebAPI Post类型传参报错“找不到与该请求匹配的操作”   参考博文http://www.cnblogs.com/xiaoerlang90/p/5420030.html

(三)Asp.net web api中的坑-【http post请求中的参数】的更多相关文章

  1. 使用 asp.net Web API 2的坑

    使用工具: Googl  浏览器+PostMan 插件 写了个  控制器 添加了个Action,结果呢?GET 方式请求没问题. POST一直,在服务器端获取不了参数...找了官方的文档 .各种雨里雾 ...

  2. 如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

    客户端js无需任何专门设置,使用通常的ajax调用即可: $.ajax({ url: '跨域URL', type: 'get', dataType: 'json', success: function ...

  3. ASP.NET WEB API 帮助文档引用单独项目中的DTO,见面上不显示字段注释问题解决办法

    StackOverFlow上的解决办法: 问题地址

  4. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

    最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...

  5. 使用ASP.NET Web API自带的类库实现对CORS的支持(在开发中使用这种方式)(转载)

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...

  6. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  7. ASP.NET Web API中的路由

    ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的. public static class WebApiConfig { public s ...

  8. 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中,我们通过自定义的HttpMessageHandler自行为ASP.NET Web API实现了针对CORS的支持, ...

  9. 剖析Asp.Net Web API中HttpController的激活

    在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法.当请求经过Asp.Net Web API消息处理管道到达管道"龙尾" ...

  10. 在ASP.NET Web API中实现CORS(跨域资源共享)

    默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...

随机推荐

  1. 12 | 为什么我的MySQL会“抖”一下?

    平时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短. 看上去,这就像 ...

  2. Yarn 配置阿里源

    1.查看一下当前源 yarn config get registry 2.切换为淘宝源 yarn config set registry https://registry.npm.taobao.org ...

  3. 网络OSI和TCP/IP参考模型详解

    网络模型 对应协议 转载自: https://www.2cto.com/kf/201612/576253.html

  4. Postgresql pg_dump

    pg_dump 命令详解 参数 描述 -h 指定服务器名称 -p 指定端口 -U 指定要连接的用户名 -w/--no-password 从不提示密码 -W/--password 强制pg_dump在连 ...

  5. web+文件夹上传

    一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框 ...

  6. TensorFlow(十五):使用inception-v3实现各种图像识别

    上代码: import tensorflow as tf import os import numpy as np import re from PIL import Image import mat ...

  7. Ansible管理上千台主机时需要的速度优化

    1 开启ssh长连接 OpenSSH 5.6版本后SSH支持了Multiplexing 设置参数 ssh_args = -C -o ControlMaster=auto -o ControlPersi ...

  8. bochs调试命令

    Bochs几条基本指令: 通过物理地址查看内存时,可以不加参数'/nuf': 其中n指定显示的单元数,默认是1: u 指定每个显示单元的大小(b表示字节.h表示字(2字节).w表示双字(4字节)),默 ...

  9. 从输入URL到浏览页面的过程

    之前我们已经讨论过浏览器的渲染原理,今天我们来讨论下更广泛的从输入URL到渲染出页面的过程. 1. 查询该URL是否有缓存 如果有,则直接返回,没有的话,下一步 2. 查询URL对应的IP 首先,到 ...

  10. 下载MAMP

    下载https://www.mamp.info/en/downloads/ MAMP PRO will create copies of the MySQL databases located in ...