本文转自:http://www.cnblogs.com/babycool/p/3922738.htmlhtml
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于通常前台页面发起的get和post请求,咱们在Web API中要如何来处理。jquery
这里我使用Jquery 来发起异步请求实现数据调用。web
继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用。ajax
1、无参数Get请求json
通常的get请求咱们可使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现:api
请求的后台Action方法仍为上篇文章中的GetUser() :app
也能够用$.ajax({type:"get"}) 方式,正确的得到了返回数据:asp.net
2、传递一个参数的Get请求异步
一般咱们须要传递参数只须要指定ajax方法的data属性便可: data:{"name":"赵大宝"} post
后台正确的返回数据:
3、传递两个或多个参数的Get请求
按照上面的方法,对于多个参数咱们能够很容易就写出来: data:{"name":"赵大宝","age":12}
后台正确的返回数据:
4、无参数的Post请求
咱们可使用$.post() 或$.ajax({type:"post"}) 来发起post请求:
后台正确的返回了数据:
5、传递一个参数的Post请求:
首先这里须要提醒你们一下,咱们在修改完后台代码后,若是没有从新生成项目,那么在请求时就会报错:“未找到与请求***匹配的HTTP资源” :
因此,咱们只要咱们修改了后台代码,就必定要从新生成一下:
不过,当咱们从新生成项目,再次发送请求,看到的仍然是404错误,再次检查一番代码,也没有发现是哪里的问题。
事实上,ASP.NET Web API可以正确的识别咱们的UserController控制器处理Post /api/user ,但却不能找到一个能够接受的方法来处理请求。
也就是说,Web API接收到的请求可以找到User控制器,但在该控制器中找不到名称为Def 的这个Action。
那咱们要怎么来解决呢?
经过搜索MSDN上Web API官网中的说明,咱们能够找到下面的一段介绍:
即在Action 方法中咱们须要使用 [FromBody] 属性标签来标明属性。
修改后,再次发送请求,咱们能够看到,Status Code 为200,请求发送成功。
能够看到,在post请求中,方法的参数必需要用 [FromBody] 属性来修饰才能够, [FromBody] 就告诉Web API 要从post请求体重去获取参数的值。
但让咱们诧异的倒是,后台返回的数据中name的值为空。
经过调试,咱们能够看到,后台Action 中接收到的name值为null。
经过上面的测试我就也可以猜想到,Web API 要求请求传递的 [FromBody] 参数,确定是有一个特定的格式,才能被正确的获取到。而这种特定的格式并非咱们常见的 key=value 的键值对形式。Web API 的模型绑定器但愿找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。
如今,我们把data中的key设置为空,而后再次发送请求:
测试可见,后台正确的接收到了数据:
6、传递两个参数的Post请求
按理说,一个参数的请求实现了,那么传递两个或者多个参数也就很顺利了,对于两个参数的后台接收方法,咱们可能会这样来写:
但事实证实,这样是错误的。
那到底两个或者多个参数咱们要怎样来定义呢?
再次查看官网中的介绍,咱们了解到:
也就是说,[FromBody] 修饰的参数只能有一个。咱们须要对传递的多个参数进行封装才行。
这里,咱们能够将 Name和 Age 封装成一个Student 类:
前台页面再次发送请求:
Status Code为200,请求成功,并正确获取到后台返回的数据:
这里,咱们经过上面图片中的请求头数据能够看到,Form Data 的格式是 key=value&key=value 这种表单数据格式 Name=%E8%B5%B5%E5%A4%A7%E5%AE%9D&Age=13 ,咱们平时使用的比较多的通常为json格式。 这里,咱们使用 JSON.stringify() 来序列化数据。
再次发送请求:
能够看到,From Data 中数据的格式为json字符串,Status Code为200,请求正确,但结果又出错了,后台又没有接收到数据参数:
那么问题到底出在哪呢?
咱们再次查看上图中请求头内容,注意到,虽然咱们传递的数据格式是json字符串,但请求头中的Content-type 却为
application/x-www-form-urlencoded ,并非json格式对于的 application/json 。 而编码格式 application/x-www-form-urlencoded 表示的是:窗体数据被编码为名称/值对。
这里,也就是我想要说的一个注意点。平时咱们在使用json数据的时候,很容易就忘记了 要指定 Content-type 为 "application/json" ,因此就容易致使不少“想不到”的错误。
因此,咱们在 $.ajax() 中指定 Content-type :
此次,后台正确的接收并返回了数据:
7、传递多个参数的Post请求
有了上面的经验,传递多个参数的post请求咱们就很容易能写出来了:
后台接收并返回数据:
8、传递多个不一样对象的Post请求
有时候咱们还会遇到须要传递多个不一样对象参数的状况,对于这种特殊的状况在 Json.Net 中为咱们提供了一个 名为 JObject 的通用对象容器,咱们能够经过 .对象名 的方式来动态的遍历参数里面的属性的值,而后动态的转换和json类型中对应的属性类型。
好比:
后台调试,经过dynamic 动态转换获取属性的值:
后台正确的返回了数据:
9、获取不一样类型的数据
通常咱们获取到后台返回的数据格式类型为 json格式,咱们也能够指定 请求头中的输出类型来得到不一样的返回类型数据:
指定输出类型为xml格式:
指定输出类型为 json格式:
基本到这里,这篇文章的主要内容也就算说完了,其中的重点仍是 Post请求中对于参数的处理是须要重点注意的。
上面咱们在测试的过程当中,都是经过本身建立的Controller控制器类来对参数进行接收处理,可能有人会问,咱们这么写究竟是否符合规范呢,Web API中默认是怎么来处理的呢? 这里,Visual Studio 中也为咱们自带了 Web API控制器类:
咱们能够添加新建项选择 Web API控制器类 便可:
这里咱们能够看到,默认建立的Controller控制器类中,对于Post请求的Action方法都自带了 [FromBody] 属性。 如今不用我说,你也已经知道为何 它会为参数默认带一个 [FromBody]属性吧!
好了,今天的内容就到这里,下面附上我参考的几篇文章:
MSDN中关于Web API 中 [FromBody] 的介绍: Parameter Binding in ASP.NET Web API | The ASP.NET Site
关于[FromBody]属性的介绍及Post参数说明(E文): Using jQuery to POST [FromBody] parameters to Web API | Encosia
上面网页文章的翻译版本:【翻译】使用JQuery POST表单到Web API | 北飘漂
Post 多个参数到Web API的总结: POST多个参数到Web API控制器方法总结 | 北飘漂
附当前项目的代码:XWebAPIDemo-WebAPI请求
转载请注明出处。
出处:http://www.cnblogs.com/babycool/
本文首发博客园,版权归做者跟博客园共有。
转载必须保留本段声明,并在页面显著位置给出本文连接,不然保留追究法律责任的权利。