`

C#WebApi传参之POST请求

阅读更多
本节讲述C# WebApi传参之Post请求-AJAX,说起Ajax针对webApi的Post请求,真的不敢恭维,确实比较怪异,如果你不幸要写一个Ajax Post请求webApi接口,那么您还是有必要花点时间看看本篇博客,如果你也遇到了同样的问题,就不妨在最后给本篇博客点个赞。谢谢

   说起Post请求,想必大家都比较熟悉,post请求原理和get请求不一样,我们知道get请求的参数是通过url来传递的,而post请求则是通过http的请求体中传过来的,WebApi的post请求也需要从http的请求体里面去取参数。说白了Get请求是通过URL传递一组键值对,Post请求是发送一个Http请求体。上一节Get请求,我们用到了[FromUri]关键字。本节的Post请求,我们将使用另一个关键字[FromBoay],上一节结尾我建议大家Get请求时要带上[FromUri]关键字,同理,本节的Post请求,我要建议大家在接收参数时,带上[FromBody]关键字,毕竟养成一个好的习惯不是什么坏事。

   开篇中提到,Ajax Post请求webApi很怪异,那么它究竟怎么怪异呢?下面以代码示范说明:<本文仍旧采用上一节Get请求的实体对象,不知道的博友,请参阅我的上篇博客>

   如下:

复制代码
        /// <summary>
        /// 简单测试案例
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string Get()
        {
            return "OK";
        }
        /// <summary>
        /// 通过id获取特定数据
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpPost]
        public string GetById([FromBody]int Id)
        {
            list = list.Where(p => p.Id == Id).ToList();
            return JsonHelper.JsonSerializer<List<Person>>(list);
        }
复制代码
   aJax如下

复制代码
        //无参数请求-简单示例
        $(document).ready(function () {
            $.ajax({
                url: "http://localhost:9953/api/Person/Get",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data:{},
                success: function (result,status) {
                    if (status == "success") {
                        alert(result);
                    }
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
        //单个参数传递-  data: {"":"3"}, 这种方式也竟然正确
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetById",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: {Id:"3"},
                success: function (result,status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
复制代码
   上文JS中注释有这么一句话:‘data: {"":"3"}, 这种方式也竟然正确’

   这是一种另许多人头痛的写法,但是没办法,经过测试,这种写法确实很正确。

   根据上述案例,我们看到了Post请求传递单个参数的写法,那么如果传递多个参数,我们能否采取如下的方法?(经测试,如下写法是错误的,报404Not Found)

复制代码
  $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: { Id: "3",Sex:"W" },
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
复制代码
复制代码
        /// <summary>
        /// 错误的写法    当然,本篇只讲解Ajax请求,如果你是通过HttpwebClient的方式进行请求,这种写法是没有任何问题的
        /// </summary>
        /// <param name="Json"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]string Id,[FromBody]string Sex)
        {
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }
复制代码
   测试的结果是:获取不到Id 和 Sex 的值!开篇我们说到,Get的请求方式是通过URL传递键值对,而Post 请求传递的是一个Http请求体,而JS中 data: { Id: "3",Sex:"W" }, 采用的是键值对类型,而Post请求是不能读取键值对滴。故:上述写法不对。

   那么,你可能会问,为什么一个参数请求的时候没有问题,为什么两个参数就不行了呢?这个...我能作的解答是:这就是Post Ajax请求的怪异之处。

   正确的写法该当如何呢?

   我们知道:Get请求传递兼职对,Post请求传递的是Http的请求体,按照本人的理解就是:Post请求需要发送一个参数作为Http请求体,这个参数为一个整体,而非一组键值对、故而,我们作如下改动:

   代码如下:

复制代码
//多个参数传递
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify({ Id: "3",Sex:"W" }),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
复制代码
复制代码
        /// <summary>
        /// 错误的写法2 怪异吧
        /// </summary>
        /// <param name="Json"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]string Json)
        {
            string Id = JsonHelper.GetJsonValue(Json, "Id");//获取Id
            string Sex = JsonHelper.GetJsonValue(Json, "Sex");//获取sex
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }
复制代码
   如上注释为红色加粗的JS代码,我们将Post的键值对转化为Json字符串传递到后端。而后端代码中,我们尝试接收这个JSon字符串,并作解析,从中读出Id和Sex的值,按照Post请求规则,我们也是只发送了一个Http请求体,并且在后端作了接收。这次应该没有问题了吧?

   实际测试的结果是:不会发生404 Not Found 错误,但是接收不到Post的字符串,也就是 [FromBody]string Json 中的Json为Null,(⊙o⊙)…

   靠,这样都不行,那到底怎么能行呢?

   下班了,不多喷了,直接告诉大家几点注意事项:

   后端接收时,参数类型应采用dynamic,JS代码中,必须加上contentType对应的类型,Post的值必须为一个整体,而不能是键值对。JS中Type类型必须为Post ,后端接收类型必须为:[HttpPost],如果不加,则会默认为[HttpGet]方式。

   以下是代码示例,希望能帮助大家:

   1、多个参数传递:

复制代码
//多个参数传递
        $(document).ready(function (data) {
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByIdAndSex",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify({ Id: "3",Sex:"W" }),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });
复制代码
复制代码
[HttpPost]
        public HttpResponseMessage GetByIdAndSex([FromBody]dynamic Json)
        {
            string Id = Json.Id;
            string Sex = Json.Sex;
            List<Person> list_2 = new List<Person>();
            var Result = from r in list
                         where r.Id == Convert.ToInt32(Id) && r.Sex == Sex
                         select r;
            foreach (var Item in Result)
            {
                list_2.Add(Item);
            }
            return ResultToJson.toJson(list_2);
        }
复制代码
   2、传递一个对象数据

复制代码
       //传递对象数组
        $(document).ready(function (data) {
            var dataList = [{ Id: "8888", Sex: "男", Name: "陈卧龙", Age: "26" },
                            { Id: "8887", Sex: "男", Name: "陈大龙", Age: "27" },
                            { Id: "8886", Sex: "男", Name: "陈小龙", Age: "25" }];
            $.ajax({
                url: "http://localhost:9953/api/Person/GetByObjectList",
                type: "post",
                contentType: "application/json",
                dataType: "text",
                data: JSON.stringify(dataList),
                success: function (result, status) {
                    alert(result)
                },
                error: function (error) {
                    alert(error);
                }
            });
        });

/// <summary>
        /// 对象数组作为参数
        /// </summary>
        /// <param name="P"></param>
        /// <returns></returns>
        [HttpPost]
        public HttpResponseMessage GetByObjectList([FromBody]dynamic Plist)
        {
            List<Person> list = new List<Person>();
            foreach (var item in Plist)
            {
                Person person = new Person()
                {
                    Name = item.Name,
                    Sex = item.Sex,
                    Id = item.Id,
                    Age = item.Age,
                };
                list.Add(person);
            }
            return ResultToJson.toJson(list);
        }
复制代码
   到此为止:pOst请求也就讲完了

  我们知道有四大请求:Get,Post,Put,Delete ,其中Put、delete请求都是采用的Post请求原理,他们直接大同小异,无非就是Put请求做修改 插入,Delete请求作删除。因此:Put Delete 请求均可采用本文中的请求方式,只是他们所作的动作不一样罢了!

  
分享到:
评论

相关推荐

    C# api接口传参.doc

    本篇文章主要介绍了 C# WebApi 接口传参详解,通过 get、post、put、delete 四种请求方式分别谈论基础类型、实体、数组等类型的参数如何传递。 一、get 请求参数传递 get 请求是最常用的请求方式之一,对于取数据...

    C# WebApi 异常处理解决方案

    前言:上篇C#进阶系列——WebApi接口传参不再困惑:传参详解介绍了WebApi参数的传递,这篇来看看WebApi里面异常的处理。关于异常处理,作为程序员的我们肯定不陌生,记得在介绍 AOP的时候,我们讲过通过AOP可以统一...

    asp net core3.1 webapi 上传功能

    使用`&lt;input type="file"&gt;`标签创建文件选择器,然后通过AJAX发送POST请求到WebAPI。 六、安全性考虑 1. 限制文件大小:为了避免恶意用户上传大量大文件导致服务器资源耗尽,应设置上传文件的大小限制。 2. 文件...

    C# post 传值 和接收值实例

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows应用程序、...而服务器端接收POST请求的值,通常通过Web API或MVC控制器的方法来实现。正确理解和运用这些知识,能够帮助开发者构建高效、安全的Web服务。

    C# url post get json

    2. **POST请求**: - 创建一个`HttpContent`对象,包装要发送的数据。对于JSON,可以使用`StringContent`,如`var content = new StringContent(json, Encoding.UTF8, "application/json");` - 调用`PostAsync`,...

    Labview创建webservice与C#进行简单的http通信(post,get)

    在LabVIEW的Web服务端,接收POST请求时,需解码请求正文获取数据。 - HTTP头在请求和响应中都扮演着重要角色,如Content-Type定义了数据格式(如application/json或application/x-www-form-urlencoded)。 4. **互...

    C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器

    C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器 C# http系列之以form-data方式上传多个文件及键值对集合到远程服务器是指在C#中使用http协议以form-data方式上传多个文件及键值对集合到远程...

    C#使用Http Post方式传递Json数据字符串调用Web Service

    在调用Web Service时,我们需要使用HttpWebRequest类来发送Http Post请求。首先,我们需要创建一个HttpWebRequest对象,并设置其Method属性为"POST",ContentType属性为"application/x-www-form-urlencoded"。然后,...

    C#进阶系列--WebApi

    C#进阶系列——WebApi 路由机制剖析:你准备好了吗? ................................................................................................... 3 一、MVC和WebApi路由机制比较 .......................

    c#同时上传文件和参数

    在.NET编程环境中,C#是一种常用的编程语言,用于构建各种应用程序,包括Web应用。当涉及到与服务器进行数据交互时,HTTP POST请求是非常常见的操作。在某些情况下,接口可能需要我们同时上传文件和额外的参数,这...

    WebApi.rar

    C#进阶系列——WebApi 接口参数不再困惑:传参详解 阅读目录 一、get请求 1、基础类型参数 2、实体作为参数 3、数组作为参数 4、“怪异”的get请求 二、post请求 1、基础类型参数 2、实体作为参数 3、数组作为参数 4...

    multipartform-data 参数传递

    在Web开发中,`multipart/form-data`是一种用于发送表单数据的编码类型,尤其适用于处理文件上传。此编码方式能够使客户端浏览器将表单中的普通文本字段与文件字段一起发送到服务器端进行处理。 #### 标题解析 - **...

    ajax+pako.js实现gzip数据压缩上传,解决post数据过长问题

    然而,当数据量过大时,POST请求可能会遇到HTTP限制,导致请求失败或者性能下降。为了解决这个问题,可以采用数据压缩技术,如gzip,配合JavaScript库pako.js来压缩数据,然后再通过Ajax发送。以下将详细讲解如何...

    C++Http上传文件到web服务器,解决中文参数乱码

    一个POST请求通常包括一个请求行、请求头和请求体。请求头可能包含如Content-Type这样的字段,用于指示请求体的数据类型,例如"application/x-www-form-urlencoded"或"multipart/form-data"。对于文件上传,后者更...

    远程请求url,发送xml参数,返回结果值的2个方法

    在IT行业中,远程请求URL并发送XML参数是常见的数据交互方式,主要应用于Web服务、API接口调用等场景。下面将详细介绍两种实现这一操作的方法,并结合`SyncDemo`这一示例进行阐述。 方法一:使用Java的...

    Postman调用wsdl配置说明

    在IT行业中,Postman是一款非常流行的API测试工具,它能够帮助开发者轻松地测试HTTP请求,包括GET、POST、PUT等多种HTTP方法。对于Web Service接口,尤其是基于WSDL(Web Services Description Language)的服务,...

    QuartzCore.Blazor:QuartzCore.Blazor作业管理平台,实践ant-design-blazor和FreeSql

    启动立即生效,无需重启应用使用Freesql为数据访问组件,也学习交流更新记录删除了no_mongo分支,若不使用mongo自行注释修复post请求传参,默认需要JSON格式dev_qzbv2分支,matser主分支,先维护已知错误去做暂无...

Global site tag (gtag.js) - Google Analytics