博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebApi系列~StringContent与FormUrlEncodedContent
阅读量:6975 次
发布时间:2019-06-27

本文共 2964 字,大约阅读时间需要 9 分钟。

知识点

本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点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
(); entity.Category = new Category { Title = "北京" }; entity.OrderList = new List
{ 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
Post()//没有参数表示使用raw,form-data方式进行传输 { try { var data =await Request.Content.ReadAsStringAsync(); var entity = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson
>(data); } //....... }
 

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

 

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

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

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

感谢各位的阅读,希望本文对你有所帮助!

 

转载于:https://www.cnblogs.com/lori/p/5919306.html

你可能感兴趣的文章
wiki备份脚本
查看>>
安装sql 2005 闪退 连接到服务器失败。错误:0x80070424
查看>>
Linux下分割与合并文件的方法
查看>>
安全攻防实战:使用winlogonhack获取系统密码
查看>>
AD RMS高可用(三)部署RMS根群集服务器
查看>>
5.1 python的缩进
查看>>
瀚思首发三款产品 推动大数据安全战略布局
查看>>
全“芯”关注用户需求 AMD“超轻薄笔记本”杀出重围
查看>>
自定义通知与系统通知的学习(详解)
查看>>
软考新思维--2017年上半年信息系统项目管理师上午试题分析与答案(试题16-20题)...
查看>>
C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)
查看>>
使用sudo进入root权限,以及防止root密码被恶意篡改
查看>>
Android 多媒体综述
查看>>
route命令相关整理
查看>>
关于VS2012如何安装Windows Phone Toolkit
查看>>
Forefront for OCS2007之部署
查看>>
IBM Thinkpad T43-44U 升级到 2G 内存后少了 66M
查看>>
【No.1_sizeof与strlen】
查看>>
SMO学习笔记(二)——还原(恢复)篇之完整恢复
查看>>
Windows Server 2003 AD升级到Windows Server 2008 AD的方法及详细步骤
查看>>