[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

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

 

ASP.NET MVC学习系列(二)-WebAPI请求

 

  继续接着上文 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/

本文首发博客园,版权归做者跟博客园共有。

转载必须保留本段声明,并在页面显著位置给出本文连接,不然保留追究法律责任的权利。

相关文章
相关标签/搜索