webapi获取post请求参数_webapi获取post请求的body数据 - CSDN
精华内容
参与话题
  • .NET WebAPI post参数传递

    万次阅读 2018-08-30 09:52:38
    JObject参数(推荐) 1.键值对对应 这里所说的键值对并非是一般的键值对,是指键为空,值不为空的键值对 前台请求 $.ajax({ url: host + '/api/Source/TestParams', type:"post", data: { '': &...

    可行的传参形式

    1. 键值对对应
    2. dynamic动态类型(非跨域)
    3. 实体类
    4. JObject参数(推荐)

    1.键值对对应

    这里所说的键值对并非是一般的键值对,是指键为空,值不为空的键值对
    前台请求

    $.ajax({
        url: host + '/api/Source/TestParams',
        type:"post",
        data: { '': "Amon"},
        success: function(a) {
            console.log(a);
        }
    });

    后台
    这里写图片描述

    可以看到后台是接收到参数了的,但是这种方式只能传一个键值对参数,{'': 'Amon', '': 'male'} 这种参数是接收不到的,当然也可以把所有参数序列化为字符串,后台再进行反序列化,但是这种方式较为繁琐,所以不推荐

    2.dynamic 动态类型(非跨域)

    这种传参方式在非跨域环境下可行,但是在跨域环境下,前台请求时会出现 405 错误,虽然通过调整ajax请求参数会解决这个错误,但是后台无法正常接收参数
    前台请求

    $.ajax({
        url: host + '/api/Source/TestParams',
        type:"post",
        contentType: 'application/json',
        data: JSON.stringify({ 'name': "Amon", sex: 'male'}),
        success: function(a) {
            console.log(a);
        }
    });

    后台
    这里写图片描述

    当前传参方式在非跨域环境中测试为可以正常传参,跨域环境暂未找到解决方法,如果有解决方法,欢迎交流

    3.实体类

    实体类是相对来说比较简单的一种传参方式,跟我们平常采用的传参方式相似
    前台请求

    $.ajax({
        url: host + '/api/Source/TestParams',
        type:"post",
        data: { 'name': "Amon", sex: 'male'},
        success: function(a) {
            console.log(a);
        }
    });

    后台
    这里写图片描述
    这里写图片描述
    这种传参方式需要声明一个实体类,所以说在改变传参时,相应的要去更改实体类,灵活性不是很高

    4.JObject 参数(推荐)

    JObject传参方式是个人比较推荐的一种方式,前台请求传参写法不具迷惑性,后台接收也较为灵活
    前台请求

    $.ajax({
        url: host + '/api/Source/TestParams',
        type:"post",
        data: { 'name': "Amon", sex: 'male'},
        success: function(a) {
            console.log(a);
        }
    });

    后台
    这里写图片描述

    如果有其他的传参方式,欢迎交流

    展开全文
  • 获得WebAPI原始POST请求BODY的JSON内容

    万次阅读 2017-09-21 09:24:57
    但是这段代码获取的content却是空的,搞了半天没明白,后来在一个国外的论坛找到了原因。 原因是这样的,当你的Action参数存在[FromBody]等读取内容的方法时,会被[FromBody]“吃掉”。说得有些生动,

    在controller的action里写如下代码:

    string content = Request.Content.ReadAsStringAsync().Result;

    但是这段代码获取的content却是空的,搞了半天没明白,后来在一个国外的论坛找到了原因。

    原因是这样的,当你的Action参数存在[FromBody]等读取内容的方法时,会被[FromBody]“吃掉”。说得有些生动,其实原因是读取完毕后,指向内容的指针会指向最后的结束符,再次读取的时候就读不到了,因此解决方法有两种:

    1、不需要[FromBody],直接在代码里用上述代码读取原始内容。

    2、保留[FromBody],重新调整内容指针,再进行读取。

    Request.Content.ReadAsStreamAsync().Result.Seek(0, System.IO.SeekOrigin.Begin);
    string content = Request.Content.ReadAsStringAsync().Result;

    参考:

    https://stackoverflow.com/questions/10127803/cannot-read-request-content-in-asp-net-webapi-controller

    展开全文
  • 1.单参数 [FromBody]+变量方式(不推荐):如public string PostUser([FromBody] string user_id){} 由于我们的前端习惯用key/value的方式进行请求,而此法要求key为空,有点不三不四,代码不规范,故此不推荐。...

    1.单参数

    [FromBody]+变量方式(不推荐):如public string PostUser([FromBody] string user_id){}

    由于我们的前端习惯用key/value的方式进行请求,而此法要求key为空,有点不三不四,代码不规范,故此不推荐。总不能都是你写的接口,却要求前端因为参数的个数不同而采用不同的代码请求?

    2.JObject方式(适用于单参数或多参数情况,又不想用实体类方式接收)

    JObject需要using  Newtonsoft.Json.Linq;//这里的Newtonsoft.Json要求是11.0.2版本以上支持,而该版本可能需要升级你的nuget管理器来安装。

    前端用普通的键值对方式请求(不论几个参数)

    后端示例

    public string PostUser([FromBody] JObject obj){

    string uid=obj["user_id"].ToString();// 本例前端的key为user_id,JObject实际是dynamic obj

    }

    3.实体类方式

     

    展开全文
  • WebAPI请求——js调用

    万次阅读 2016-04-19 10:32:24
    http://www.cnblogs.com/babycool/p/3922738.html ...ASP.NET MVC学习系列(二)-WebAPI请求 ... MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理。 这里我
    
    

     继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理。

    这里我使用Jquery 来发起异步请求实现数据调用。

      继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用。

     

    一、无参数Get请求

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

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

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

     

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

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

      后台正确的返回数据:

     

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

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

       后台正确的返回数据:

    四、无参数的Post请求

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

      后台正确的返回了数据:

    五、传递一个参数的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设置为空,然后再次发送请求:

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

     六、传递两个参数的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 :

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

     

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

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

    后台接收并返回数据:

     

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

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

    比如:

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

    后台正确的返回了数据:

     

    九、获取不同类型的数据

      一般我们获取到后台返回的数据格式类型为 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请求

    转载请注明出处。

    展开全文
  • ASP.NET Web API中对Headers的操作

    万次阅读 2019-02-15 10:53:57
    ASP.NET Web API中对Headers的操作。 1、获取请求头信息 string value = HttpContext.Current.Request.Headers["name"]; 2、添加响应头信息 HttpResponseMessage result = new HttpResponseMessage...
  • c# webapi POST 参数解决方法

    万次阅读 2015-10-21 14:57:24
    c# webapi POST 参数解决方法:简单类型 复杂类型
  • public IList<UserInfo_Customer_Model> Post([FromBody]PostParameters parm) { GetCustomersList getCustomersList = new GetCustomersList(); return getCustomersList.GetPotentialCustomersList(parm....
  • WebApi FromBody参数

    万次阅读 2017-10-17 18:08:44
    WebApi程序可在方法参数前加[FromBody]标识,表示该参数值应该从请求的Body中获取,而不是从URL中获取。 从URL获取参数值的方式的弊端是URL有长度限制,当超过浏览器的最大URL长度时请求将被浏览器拒绝,根本不会发...
  • Web Api简单使用方法

    千次阅读 2018-04-07 14:54:41
    1. 简单介绍什么是Web ApiREST属于一种设计风格,REST 中的 POST(新增数据),GET(取得数据),PUT(更新数据),DELETE(删除数据)来进行数据库的增删改查,而如果开发人员的应用程式符合REST原则,则它的服务为...
  • asp.net mvc4 webapi request获取参数

    万次阅读 2013-06-11 15:07:26
    来园很长时间,不擅长交际的我,一直没有装饰家园,最近用mvc4中的WEBAPI,发现接收参数不是很方便,跟传统的request.querystring和request.form有很大区别,在网上搜了一大圈,各种方案都有,但不是太详细,于是跟踪...
  • NET Web API接收POST方式的JSON格式

    千次阅读 2019-08-27 10:03:23
    测试接口的工具:postman,发送参数为JSON格式,发送方式为POST Web API接收的方法: public string PostSaveData() { LogHelper.WriteLog("接口请求:" + Request.RequestUri.ToString()); HttpRequest...
  • C# WebApi传参之Post请求-AJAX

    千次阅读 2018-02-28 18:01:00
     学无止境,精益求精 上一节讲述了C# WebApi传参之Get请求-AJAX 本节讲述C# WebApi传参之Post请求-AJAX,说起Ajax针对webApiPost请求,真的不敢恭维,确实比较怪异,如果你不幸要写一个Ajax Post请求webAp...
  • C# 调用Web Api post提交json格式

    千次阅读 2018-09-17 12:18:31
    C# 调用Web Api post提交json格式 public static void sdf(string urls) { string url = urls; //定义request并设置request的路径 WebRequest request = WebRequest.Create(url); reque...
  • /// 获取Http请求Get和Post所有参数 /// </summary> /// <param name="request">HttpRequestMessage实例</param> /// <returns>Get和Post参数键值对集合</returns> public static c.....
  • 我需要的参数格式内容大致是 { "cmd":"pathAnalysis", "sx":116.359425, "sy":39.951782, "ex":116.403694, "ey":39.914935, "route":2 ...在service中我应该怎么获取请求体中的参数内容呢?
  • Mvc4中的WebApi的使用方式

    千次阅读 2017-05-10 16:20:35
    一:简单介绍什么是Web apiREST属于一种设计风格,REST 中的 POST(新增数据),GET(取得数据),PUT(更新数据),DELETE(删除数据)来进行数据库的增删改查,而如果开发人员的应用程式符合REST原则,则它的服务为...
  • 获取HttpActionContext请求参数

    万次阅读 2017-08-17 08:59:41
    主要通过反射获取请求参数,输出JSON格式数据方便以后直接转换对象HttpActionContext actionContext = this.HttpActionContext; var test = actionContext.ActionArguments; foreach (var b in test)
  • 用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面1、HttpClient部分:HttpClient通过PostAsync提交数据时,第二个请求参数为抽象类...
  • 求大神,rest APi,url路径没有错,就是不知道参数错了没有,请大神指教。
  • .NET Core 获取GET,Post 参数

    万次阅读 2017-06-22 14:32:06
    获取GET参数 Request.Query["Key"]  获取GET参数 Request.Form["Key"]
1 2 3 4 5 ... 20
收藏数 76,141
精华内容 30,456
关键字:

webapi获取post请求参数