文章出處

回到目錄

知識點

本文是一個很另類的文章,在項目中用的比較少,但如果項目中真的出現了這種情況,我們也需要知道如何去解決,對于知識點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平臺,這些方法都是同樣適用的!

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

回到目錄

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()