热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于HttpClient用Post方式调用webapi传实体参数的问题

同一个action我在网页上写JS用ajax就可以调用成功了但是用C#中的HttpClient对象调用的时候不管怎么弄webapi那边都接收不到实体参数每次获取到的都是null只有把we
同一个action 我在网页上写JS 用ajax就可以调用成功了 但是用C#中的HttpClient对象调用的时候 不管怎么弄 webapi那边都接收不到实体参数 每次获取到的都是null 只有把webapi那边接收参数类型改为Json类库中的JObject类型才可以接收得到(如果改成Object类型就只是接收到一个什么属性字段都没有的对象)
我就是想问怎么样可以像JS那样让webapi直接接收到我想要的实体参数?

16 个解决方案

#1


如果凭的经验无法使两边发送的请求参数达成格式一致,那么你可以选择使用截包工具,把两边发送的数据做一下比对,找到其中的差异

#2


引用 1 楼 xdashewan 的回复:
如果凭的经验无法使两边发送的请求参数达成格式一致,那么你可以选择使用截包工具,把两边发送的数据做一下比对,找到其中的差异

我用google浏览器查看ajax请求的Request Header 然后我把HttpClient发送的请求头基本都改成和他一样的了 但还是不行

#3


引用 2 楼 Brown_Sugar 的回复:
我用google浏览器查看ajax请求的Request Header 然后我把HttpClient发送的请求头基本都改成和他一样的了 但还是不行

参数是请求体而不是请求头

#4


也许和请求头的内容类型有关系 ,WEBAPI接收POST来的参数时,可以建一个实体类作参数类型放在方法参数上

 request.ContentType = "application/x-www-form-urlencoded" // "表单"形式
                                        "application/json";
                                        "text/xml";

#5


http://blog.csdn.net/hanjun0612/article/details/60126445

#6


引用 5 楼 hanjun0612 的回复:
http://blog.csdn.net/hanjun0612/article/details/60126445

你给的这个代码跟我百度查到的基本相同 我就是这么写的 实体参数还是不能直接接收到

#7


引用 3 楼 xdashewan 的回复:
是请求体而不是请求头

请求体是一样的 我调试webapi 用 HttpContext.Current.Request.Form.ToString() 获取请求体字符串 然后我对比用JS中ajax请求和用C#中HttpClient对象发送的请求体 是一样的 但是偏偏用HttpClient对象发送的时候实体参数就是null

#8


传递JSON字符串即可!!!!!!!!

#9


引用 6 楼 Brown_Sugar 的回复:
Quote: 引用 5 楼 hanjun0612 的回复:

http://blog.csdn.net/hanjun0612/article/details/60126445

你给的这个代码跟我百度查到的基本相同 我就是这么写的 实体参数还是不能直接接收到

你自己测试一下把。没问题的
public class TestController : ApiController
    {
//发起请求
        [HttpGet]
        public async Task Get()
        {//调用请求方法
            var q = await APIPost("http://localhost:16727/api/Test/Post","{'name':'Hello','age':17}");
//post api的返回数据
            return q;
        }
//被请求的post api
        [HttpPost]
        public string Post(User data)
        {

            return "123";
        }

//传递对象
public class User
{
    public string name{get;set;}
    public int age{get;set;}
}

        public static async Task APIPost(string url, string data)
        {
            string result = string.Empty;
            //设置HttpClientHandler的AutomaticDecompression  
            var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            //创建HttpClient(注意传入HttpClientHandler)  
            using (var http = new HttpClient(handler))
            {
                //使用FormUrlEncodedContent做HttpContent  
                var content = new FormUrlEncodedContent(new Dictionary()         
                {  
                  {"", data}//键名必须为空  
                 });

                //await异步等待回应  
                var response = await http.PostAsync(url, content);
                //确保HTTP成功状态值  
                response.EnsureSuccessStatusCode();
                //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)  
                result = await response.Content.ReadAsStringAsync();
            }
            return result;
        }  
    }

#10


引用 9 楼 hanjun0612 的回复:
你自己测试一下把。没问题的
public class TestController : ApiController
    {
//发起请求
        [HttpGet]
        public async Task Get()
        {//调用请求方法
            var q = await APIPost("http://localhost:16727/api/Test/Post","{'name':'Hello','age':17}");
//post api的返回数据
            return q;
        }
//被请求的post api
        [HttpPost]
        public string Post(User data)
        {

            return "123";
        }

//传递对象
public class User
{
    public string name{get;set;}
    public int age{get;set;}
}

        public static async Task APIPost(string url, string data)
        {
            string result = string.Empty;
            //设置HttpClientHandler的AutomaticDecompression  
            var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            //创建HttpClient(注意传入HttpClientHandler)  
            using (var http = new HttpClient(handler))
            {
                //使用FormUrlEncodedContent做HttpContent  
                var content = new FormUrlEncodedContent(new Dictionary()         
                {  
                  {"", data}//键名必须为空  
                 });

                //await异步等待回应  
                var response = await http.PostAsync(url, content);
                //确保HTTP成功状态值  
                response.EnsureSuccessStatusCode();
                //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)  
                result = await response.Content.ReadAsStringAsync();
            }
            return result;
        }  
    }


我晕 我说的是我api接收不到实体参数 不是客户端接收不到返回值 
你在Post方法里面打断点看看参数data的值有吗 我刚才按照你这个参数格式写还是接收不到

#11


引用 4 楼 mirror030 的回复:
也许和请求头的内容类型有关系 ,WEBAPI接收POST来的参数时,可以建一个实体类作参数类型放在方法参数上

 request.ContentType = "application/x-www-form-urlencoded" // "表单"形式
                                        "application/json";
                                        "text/xml";


只是 "application/json" 而已。多了乱了才造成不会调试的问题。

#12


asp.net 各种不定性、各种抄袭 java 不兼容方式都乱了。其实你使用10几年前的 asp.net 技术可以非常方便地2、3行代码自己处理参数。

#13


引用 10 楼 Brown_Sugar 的回复:
我晕 我说的是我api接收不到实体参数 不是客户端接收不到返回值 
你在Post方法里面打断点看看参数data的值有吗 我刚才按照你这个参数格式写还是接收不到


传递对象的话,使用以下方式
                var content = new FormUrlEncodedContent(new Dictionary()         
                {  
                   {"name","hello"},
                     {"age","16"}

                 });

#14


引用 13 楼 hanjun0612 的回复:
传递对象的话,使用以下方式
                var content = new FormUrlEncodedContent(new Dictionary()         
                {  
                   {"name","hello"},
                     {"age","16"}

                 });


 终于发现问题所在了,我的实体参数类型中声明了一个 protected set 的属性,只要给他一个默认值或者去掉protected就没问题 应该是webapi本身在对实体参数赋值的过程中遇到没给默认值又没有权限赋值的属性会无法生成实体对象 结果收到的参数就是null 
之前怎么都没想到是这个问题

#15


还发现了个更坑爹的问题 如果你的实体参数类型是一个继承了父类并且用new关键字覆盖了父类的属性 而且子类的这个属性和父类的属性的类型不同 也会导致接收到的实体参数值为null 
比如以下这种情况:

public class BaseParameter
{
    public int Property { get; set; }
}

public class Parameter : BaseParameter
{
    public new Guid Property { get; set; }
}

#16


现在有个比较通用的解决方法 就是在请求头设置 Content-Type 为 application/json 然后传Json字符串过去 之前我所遇到的那些问题就都没有了

推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
郭建将_683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有