IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> 架构设计 -> WebApi系列~StringContent与FormUrlEncodedContent -> 正文阅读

[架构设计]WebApi系列~StringContent与FormUrlEncodedContent

WebApi系列~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平台,这些方法都是同样适用的!
感谢各位的阅读,希望本文对你有所帮助!
回到目录
上一篇文章      下一篇文章      查看所有文章
加:2016-09-30 15:31:36  更:2017-05-16 02:55:23 
 
  架构设计 最新文章
spring boot实现ssm(2)功能
java 企业站源码 兼容手机平板PC 自适应响应
Serverless无服务应用架构纵横谈
理论篇:关注点分离(Separation of concern
Struts 2 入门
spring boot实现ssm(1)功能
java springMVC SSM 操作日志 4级别联动 文
SSM框架SSM项目源码SSM源码下载java框架整合
分布式下session的管理
MvvmLight框架使用入门(一)
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年8日历
2018-8-14 23:57:30
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库