HttpClient系列~StringContent与FormUrlEncodedContent

知识点

本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent我们应该了解的多一点,FormUrlEncodedContent是以键/值对的形式进行POST数据的提供,同时要求服务端以x-www-form-urlencoded的方式去接收数据!而StringContent是ByteArrayContent的一个子集,也是MultipartFormDataContent的一个子集,在进行大数据传输时,我们需要使用这种方法,如果传递的是字符串,可以采用StringContent,如果是二进制流,可以使用ByteArrayContent,而这两种方式都可以对外以MultipartFormDataContent的形式体现,而在服务端要以mutipart/form-data的方式来接收数据!

再深一点

multipart/form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary(分隔符号)隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

x-www-form-urlencoded:会将表单数据转成键/值对进行传递,有大小的限制,一般是2M。

Raw:可以上传任何格式文本,你需要显示的说明content-type,如text/plain,text/html,text/json,text/xml等。

Binary:一般上传文件流,它相当于content-type为application/octet-stream的情况。

从上面的介绍不难发现,raw和binary方式都属于multipart/form-data,只不过是两种不同的体现而以。

DotNet平台为WebAPI传递大数据

对于普通方式的HttpClient(x-www-form-urlencoded)有时已经不能满足我们的需要了,所以必须上multipart/form-data,即在HttpClient构建时,采用StringContent的内容类型,下面是在客户端构建一个HttpClient的方式,以服务端(webapi restful)传递一个大大的JSON对象!

 

复制代码
          var list = new List<TestApiModel>();entity.Category = new Category { Title = "北京" };entity.OrderList = new List<OrderList> {new OrderList{Price=1,ProductName="tel",Address=new Address {Province="印度"}},new OrderList{Price=100,ProductName="tv",Address=new Address {Province="日本"}},new OrderList{Price=999,ProductName="pc",Address=new Address {Province="美国"}}};for (int i = 0; i <= 100; i++)list.Add(entity);var handler = new HttpClientHandler(){AutomaticDecompression = System.Net.DecompressionMethods.GZip};using (var http = new HttpClient(handler)){var body = entity.ToNameValueCollection();var content = new StringContent(list.ToJson(), Encoding.UTF8, "text/json");var responseResult = http.PostAsync(UriAddress, content).Result;}
复制代码

 

如果客户端采用了这种StringContent的方式,那么在设计WebApi时只有两种选择,第一种就是使用JSON强类型(类对象)的参数,第二种就是不写参数(空),如果使用string类型的参数,那这个接口无法被找到,即出现的结果是404的状态码!下面看一下服务端的数据处理,也是很简单!

复制代码
    public async Task<HttpResponseMessage> Post()//没有参数表示使用raw,form-data方式进行传输{try{var data =await Request.Content.ReadAsStringAsync();var entity = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<IEnumerable<TestApiModel>>(data);
}
//.......

}
 
复制代码

上面代码从请求上下文中拿到了这个大数据的字符串,然后通过反序列化得到了下面的结果:

 

当然,对于非常友好的webapi来说,你完全可以在方法参数上显示的使用强类型,这种api框架会帮助我们进行序列化的操作,真的很友好!

这行list对象已经被架构进行了序列化操作

通过本篇文章,让我们更清楚的认识到了POST请求的几种方式,以及他们与服务端(api)如何去结合,对于java,.net平台,这些方法都是同样适用的!

来自:https://www.cnblogs.com/lori/p/5919306.html

转载于:https://www.cnblogs.com/topguntopgun/p/10823767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2008年12月31日,博客园开博

今天是美好的一天&#xff0c;天气晴朗&#xff0c;鸟语花香。呃。。好像没鸟也没花。。大冬天的。。好冷哦&#xff01; 今天是08年的最后一天&#xff0c;08年发生了很多震惊世界的事情。 所以我打算保留对08年的记忆。 去感谢一些人&#xff0c;去忘掉一些人&#xff0c;去追…

java web 多语言_基于 Selenium WebDriver 实现多语言环境下自动化截图

到此&#xff0c;一个 Junit4 test case 就在 Eclipse 中建成 , 如代码清单 1.清单 1. 将脚本导入 Eclipsepackage com.example.casePackage; import static org.junit.Assert.fail ; import java.util.concurrent.TimeUnit; import org.junit.After; import org.junit.Bef…

[html] Standards模式和Quirks模式有什么区别?

[html] Standards模式和Quirks模式有什么区别&#xff1f; 怪异盒模型&#xff1a;元素内容宽度width-margin2-border2-padding2?其实我建议这样说 标准盒模型&#xff1a;元素内容宽度width&#xff0c;元素实际宽度margin2border2padding2width 怪异盒模型&#xff1a;元素…

IP通信基础 4月28号

冗余拓扑&#xff1a; 环路带来的问题&#xff1a;广播风暴&#xff1b;帧的重复复制&#xff1b;交换机MAC地址表的不稳定。 STP相关概念&#xff1a; 桥ID&#xff1b;端口ID&#xff1b;根桥&#xff1b;非根桥&#xff1b;根端口&#xff1b;指定端口&#xff1b;阻塞端口&…

成功有感之给年轻人的10个忠告

1、努力工作要努力&#xff0c;随随便便过日子过四五年也是过&#xff0c;稍微努力的过四五年也是过&#xff0c;努力的过四五年也是过&#xff0c;何不努力好好的干。如果努力的过好毕业后的四五年&#xff0c;这对我们以后的人生非常有帮助。2、虚心学习多与比自己大的人(长辈…

[html] HTML与XHTML二者有不同

[html] HTML与XHTML二者有不同 XHTML 标签必须关闭XHTML所有标签必须小写XHTML标签必须正确嵌套个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

java 编译参数_java – 为什么要编译?代码似乎打破了类型参数的约束

在下面的测试中,TesterClass对其两个类型参数之间的关系设置了约束.方法func2()似乎打破了这个约束,我希望它会在某处导致类型编译错误(在func2的定义中,或者每当类与String之外的任何第二个参数一起使用时),但它不会&#xff01;此外,如果我调用func2并将结果保存在适当类型的…

Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

前言 博客园谈设计模式的文章很多&#xff0c;我也受益匪浅&#xff0c;包括TerryLee、吕震宇等等的.NET设计模式系列文章&#xff0c;强烈推荐。对于我&#xff0c;擅长于前台代码的开发&#xff0c;对于设计模式也有一定的了解&#xff0c;于是我想结合Javascript来设计前台方…

oracle中出现会话被锁

v$locked_object视图列出当前系统中哪些对象正被锁定 --查询被锁session_id select session_id from v$locked_object; -- SELECT sid, serial#, username, osuser FROM v$session where sid 396; --杀掉一个会话进程 ALTER SYSTEM KILL SESSION 396,17429; 转载于:https://ww…

[html] title与h1、b与strong、i与em的区别分别是什么?

[html] title与h1、b与strong、i与em的区别分别是什么&#xff1f; title标签写在body里面不会被渲染,只能写在head里面,对网站SEO比较重要h1标签写在body里面,但是写在head里(不推荐),渲染的时候会自动渲染到body里面去b标签与strong标签在表现上是一样的,都自带font-weight: …

【JS】JS中数值型字符串相加变成拼接字符串的解决方法

一、问题描述 数值型的字符串&#xff0c;通过、 运算符连接后&#xff0c;变成了字符串拼接&#xff0c;而不是数值计算。 先上图&#xff1a; 二、错误原因 这是由于JS中、 运算符既是算术运算符&#xff0c;也是字符串的连接符> 的运算规则是&#xff1a;如果把数字与字符…

[html] html5都有哪些新的特性?移除了哪些元素?

[html] html5都有哪些新的特性&#xff1f;移除了哪些元素&#xff1f; 新增特性canvassvgvideodrag & droplocalStorage/sessionStorage语义化标签: header/nav/section/article/footerinput 类型: date/datetime/email/range移除元素appletbigfontframe/frameset个人简介…

安卓JAVA调用lua_android中java与lua的相互调用

Android Studio Lua环境配置开发环境1. Android Studio 3.52. java sdk: 1.8.03.android sdk&#xff1a;28配置环境添加lua支持语法支持插件&#xff0c;打开android studio -> File -> Settings三方库选择参考文章&#xff1a;https://gameinstitute.qq.com/community/…

过年之-防飞车贼

1、飞车贼最喜欢在马路边和小巷子里下手。 2、当你在偏僻路段单独行走时&#xff0c;听到后面有靠近的车声&#xff0c;提高警惕&#xff0c;注意避让尾随跟踪、企图接近的摩托车。 3、对于可疑车辆、人员要提高警惕&#xff0c;特别是两个人的摩托车&#xff1a;飞车贼寻找目标…

[html]如何让元素固定在页面底部?有哪些比较好的实践?

[html]如何让元素固定在页面底部&#xff1f;有哪些比较好的实践&#xff1f; *{margin:0;padding:0; } body{height:2000px; } div{width:100%;height:30px;position: fixed;bottom:0;text-align:center;line-height:30px;background: #00CCCC; }个人简介 我是歌谣&#xff…

Windows 2008 R2阿里云安全基线检查

设置密码使用期限策略在管理工具打开本地安全策略&#xff0c;打开路径:安全设置\帐户策略\密码策略&#xff0c;将密码最长使用期限设置为30-180之间&#xff0c;建议值为90&#xff0c;将密码最短使用期限设置为1-14之间&#xff0c;建议值为7.风险账户检查存在可疑隐藏账号&…

用ajax(vb.net) 实现dropdownlist二级无刷新联动~!

说说vb.net ajaxpro 实现dropdownlist二级无刷新联动~&#xff01;Code<div class"div_RSL"> <asp:DropDownList ID"DropDownList1" runat"server" DataSourceID"proID" DataTextField"proName"AutoPostBack"…

[html] xml与html有什么区别?

[html] xml与html有什么区别&#xff1f; xml, 是必须有结束元素<br></br>, 它们是自定义 html, 允许单必合<br />, 它们是已经定义好的 好像头部声明不一样? 其它不记得了, 说实话, 没怎么用过xml个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端…

JAVA遍历文件中的字符串_Java遍历文件夹下所有文件并替换指定字符串

应用场景&#xff1a;比如有一个深层次的文件目录结构&#xff0c;如&#xff1a;javaAPI每个文件里面都有相同的内容&#xff0c;而我们要统一修改为其他内容。上千个文件如果一个个修改显得太不明智。import java.io.BufferedReader;import java.io.File;import java.io.File…

python -m pip install [package] --no-deps

python -m pip install [package] --no-deps 有些 packages 会依赖一些其它的 package&#xff0c;当我们离线安装 whl 的时候&#xff0c;就无法联网下载依赖包&#xff0c;所以我们需要 --no-deps 来去掉依赖包的安装&#xff0c;这样就能离线安装 whl 了 但是 如果 whl 有…