回到目錄 知識點 本文是一個很另類的文章,在項目中用的比較少,但如果項目中真的出現了這種情況,我們也需要知道如何去解決,對於知識點StringContent和FormUrlEncodedContent我們應該瞭解的多一點,FormUrlEncodedContent是以鍵/值對的形式進行POST數據的 ...
知識點
本文是一個很另類的文章,在項目中用的比較少,但如果項目中真的出現了這種情況,我們也需要知道如何去解決,對於知識點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平臺,這些方法都是同樣適用的!
感謝各位的閱讀,希望本文對你有所幫助!