WebApi 传参详解(转)

摘要:
事实上,ASP NET Web API可以正确地识别我们的UserController控制器处理Post/API/user,但它找不到可接受的方法来处理请求。也就是说,Web API接收的请求可以找到用户控制器,但在控制器中找不到名为Def的操作。通过在MSDN上搜索WebAPI网站上的描述,我们可以找到以下介绍:在Action方法中,我们需要使用[FromBody]属性标记来指示属性。通过以上测试,我还可以猜测Web API要求请求传递的[FromBody]参数必须具有特定的格式才能正确获得。

一、无参数Get请求

一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现:

WebApi 传参详解(转)第1张

请求的后台Action方法仍为上篇文章中的GetUser() :

WebApi 传参详解(转)第2张

也可以用$.ajax({type:"get"}) 方式,正确的获得了返回数据:

WebApi 传参详解(转)第3张

二、传递一个参数的Get请求

通常我们需要传递参数只需要指定ajax方法的data属性即可:data:{"name":"赵大宝"}

WebApi 传参详解(转)第4张

后台正确的返回数据:

WebApi 传参详解(转)第5张

三、传递两个或多个参数的Get请求

按照上面的方法,对于多个参数我们可以很容易就写出来:data:{"name":"赵大宝","age":12}

WebApi 传参详解(转)第6张

后台正确的返回数据:

WebApi 传参详解(转)第7张

四、无参数的Post请求

我们可以使用$.post() 或$.ajax({type:"post"}) 来发起post请求:

WebApi 传参详解(转)第8张

后台正确的返回了数据:

WebApi 传参详解(转)第9张

五、传递一个参数的Post请求:

首先这里需要提醒大家一下,我们在修改完后台代码后,如果没有重新生成项目,那么在请求时就会报错:“未找到与请求***匹配的HTTP资源” :

WebApi 传参详解(转)第10张

所以,我们只要我们修改了后台代码,就一定要重新生成一下:

WebApi 传参详解(转)第11张

不过,当我们重新生成项目,再次发送请求,看到的仍然是404错误,再次检查一番代码,也没有发现是哪里的问题。

WebApi 传参详解(转)第12张

事实上,ASP.NET Web API能够正确的识别我们的UserController控制器处理Post /api/user ,但却不能找到一个可以接受的方法来处理请求。

也就是说,Web API接收到的请求能够找到User控制器,但在该控制器中找不到名称为Def 的这个Action。

那我们要怎么来解决呢?

通过搜索MSDN上Web API官网中的说明,我们可以找到下面的一段介绍:

WebApi 传参详解(转)第13张

在Action 方法中我们需要使用 [FromBody] 属性标签来标明属性

修改后,再次发送请求,我们可以看到,Status Code 为200,请求发送成功。

WebApi 传参详解(转)第14张

可以看到,在post请求中,方法的参数必须要用 [FromBody] 属性来修饰才可以, [FromBody] 就告诉Web API 要从post请求体重去获取参数的值。

但让我们诧异的却是,后台返回的数据中name的值为空。

WebApi 传参详解(转)第15张

通过调试,我们可以看到,后台Action 中接收到的name值为null。

WebApi 传参详解(转)第16张

通过上面的测试我就也能够猜测到,Web API 要求请求传递的 [FromBody] 参数,肯定是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。

现在,咱们把data中的key设置为空,然后再次发送请求:

WebApi 传参详解(转)第17张

测试可见,后台正确的接收到了数据:

WebApi 传参详解(转)第18张

六、传递两个参数的Post请求

按理说,一个参数的请求实现了,那么传递两个或者多个参数也就很顺利了,对于两个参数的后台接收方法,我们可能会这样来写:

WebApi 传参详解(转)第19张

但事实证明,这样是错误的。

WebApi 传参详解(转)第20张

那到底两个或者多个参数我们要怎样来定义呢?

再次查看官网中的介绍,我们了解到:

WebApi 传参详解(转)第21张

也就是说,[FromBody] 修饰的参数只能有一个。我们需要对传递的多个参数进行封装才行。

这里,我们可以将 Name和 Age 封装成一个Student 类:

WebApi 传参详解(转)第22张

前台页面再次发送请求:

WebApi 传参详解(转)第23张

Status Code为200,请求成功,并正确获取到后台返回的数据:

WebApi 传参详解(转)第24张

这里,我们通过上面图片中的请求头数据可以看到,Form Data 的格式是 key=value&key=value 这种表单数据格式Name=%E8%B5%B5%E5%A4%A7%E5%AE%9D&Age=13 ,我们平时使用的比较多的一般为json格式。 这里,我们使用JSON.stringify() 来序列化数据。

WebApi 传参详解(转)第25张

再次发送请求:

WebApi 传参详解(转)第26张

可以看到,From Data 中数据的格式为json字符串,Status Code为200,请求正确,但结果又出错了,后台又没有接收到数据参数:

WebApi 传参详解(转)第27张

那么问题到底出在哪呢?

我们再次查看上图中请求头内容,注意到,虽然我们传递的数据格式是json字符串,但请求头中的Content-type 却为

application/x-www-form-urlencoded ,并不是json格式对于的 application/json 。 而编码格式application/x-www-form-urlencoded 表示的是:窗体数据被编码为名称/值对。

这里,也就是我想要说的一个注意点。平时我们在使用json数据的时候,很容易就忘记了 要指定 Content-type 为 "application/json" ,所以就容易导致很多“想不到”的错误。

所以,我们在 $.ajax() 中指定 Content-type :

WebApi 传参详解(转)第28张

这次,后台正确的接收并返回了数据:

WebApi 传参详解(转)第29张

七、传递多个参数的Post请求

有了上面的经验,传递多个参数的post请求我们就很容易能写出来了:

WebApi 传参详解(转)第30张

后台接收并返回数据:

WebApi 传参详解(转)第31张

八、传递多个不同对象的Post请求

有时候我们还会遇到需要传递多个不同对象参数的情况,对于这种特殊的情况在 Json.Net 中为我们提供了一个 名为 JObject 的通用对象容器,我们可以通过 .对象名 的方式来动态的遍历参数里面的属性的值,然后动态的转换和json类型中对应的属性类型。

比如:

WebApi 传参详解(转)第32张

后台调试,通过dynamic 动态转换获取属性的值:

WebApi 传参详解(转)第33张

后台正确的返回了数据:

WebApi 传参详解(转)第34张

九、获取不同类型的数据

一般我们获取到后台返回的数据格式类型为 json格式,我们也可以指定 请求头中的输出类型来获得不同的返回类型数据:

指定输出类型为xml格式:

WebApi 传参详解(转)第35张

指定输出类型为 json格式:

WebApi 传参详解(转)第36张

基本到这里,这篇文章的主要内容也就算说完了,其中的重点还是 Post请求中对于参数的处理是需要重点注意的。

上面我们在测试的过程中,都是通过自己创建的Controller控制器类来对参数进行接收处理,可能有人会问,我们这么写到底是否符合规范呢,Web API中默认是怎么来处理的呢? 这里,Visual Studio 中也为我们自带了 Web API控制器类:

我们可以添加新建项选择 Web API控制器类 即可:

WebApi 传参详解(转)第37张

WebApi 传参详解(转)第38张

这里我们可以看到,默认创建的Controller控制器类中,对于Post请求的Action方法都自带了 [FromBody] 属性。 现在不用我说,你也已经知道为什么 它会为参数默认带一个 [FromBody]属性吧!

本文转载自:http://www.cnblogs.com/babycool/p/3922738.html

免责声明:文章转载自《WebApi 传参详解(转)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用PHP开发HR系统(6)python--GIL锁下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net WebApi使用swagger 美化接口文档

本文将一步步演示如何用swagger美化WebApi接口文档,为接口文档添加接口名称说明,为请求参数和返回数据结构字段含义添加注释说明 一、为WebApi项目安装Swagger 首先我们新建一个WebApi项目 图1(新建WebApi项目) 右击项目,选择管理NuGet程序包,搜索swagger,为WebApi安装swagger 图2(右击项目或者解决...

wordpress二次开发随笔-2

调用分类,标签,友情连接,搜索框 调用分类 get_the_category() 调用标签 get_the_tags() 调用友情连接 wp_list_bookmarks() 调用指定文章的ID,guid,标题,摘要,内容 get_the_ID() get_the_guid(post_id) get_the_title(post_id) get_the_...

使用百度地图API进行Android地图应用开发(Eclipse)

随着基于位置的服务的兴起,地图类App呈现爆发趋势。随着而来的是地图供应商开放大量的API。供开发人员开发基于PC或者移动端的应用程序。 如今我们研究使用百度地图SDK进行Android项目的开发。 本文讨论怎样导入百度地图SDK。 主要分为server端配置和client配置。 (1)首先要有一个百度账号,账号能够去百度官网申请,然后登陆:http:/...

thinkphp 对数据库的操作

   框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下。 数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作,一步步的讲述一下框架对数据库的操作 想要操作数据库,第一步必然是要:链接数据库 一、链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编...

外卖小程序对接飞鹅小票打印的实现

外卖点餐在流程处理上是争分夺秒的,大多数买家都是临近饭点才点餐,这样下单之后就会盼望着能尽快送到,作为点餐流程环节一部分的小票打印也就要求越便捷越省时间越好。小票云打印因为其小巧便捷、无线联网、自动打印而成为首选的外卖小程序小票打印解决方案。 酷客多外卖小程序的小票打印对接了易联云、飞鹅两家,其中飞鹅小票打印机因为自带接单语音提醒所以更受欢迎。云打印的原理...

GET和POST请求区别

关于http协议GET和POST方法的区别我们可以从各处得到比较一致的答案,今天我们来填一个面试中可能碰到的一个坑。 当面试官问你“你觉得GET和POST有什么区别"时,我们可能会想到以下几点(来源于网络): GET在浏览器回退时是无害的,而POST会再次提交请求。 GET产生的URL地址可以被Bookmark,而POST不可以。 GET请求会被浏览器主...