WebApi系列~StringContent与FormUrlEncodedContent

回到目录html

知识点

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

再深一点

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

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

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

Binary:通常上传文件流,它至关于content-type为application/octet-stream的状况。restful

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

DotNet平台为WebAPI传递大数据

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

 

          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);
}
//.......

}
 

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

 

固然,对于很是友好的webapi来讲,你彻底能够在方法参数上显示的使用强类型,这种api框架会帮助咱们进行序列化的操做,真的很友好!

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

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

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

回到目录

相关文章
相关标签/搜索