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平臺,這些方法都是一樣適用的!

感謝各位的閱讀,但願本文對你有所幫助!

回到目錄

相關文章
相關標籤/搜索