ASIHTTPRequest中數據壓縮問題與gzip

出現了相似問題,先mark,之後修改

 

最近使用asi發現,部分網絡回調數據不能正常的json解析,將responseHeaders頭打印出來,才發現公司服務器部分數據添加了gzip壓縮傳輸。

最近簡單的解決方法就是,設置網絡請求不返回壓縮數據,自動解壓就ok了。
[request  setAllowCompressedResponse :NO ];
 
-----------------------------------------------------------------
-----------------------------------------------------------------

使用gzip來處理壓縮的響應數據

從0.9版本開始,ASIHTTPRequest會提示服務器它能夠接收gzip壓縮過的數據。web

許多web服務器能夠在數據被髮送以前壓縮這些數據——這能夠加快下載速度減小流量使用,但會讓服務器的cpu(壓縮數據)和客戶端(解壓數據)付出代價。總的來講,只有特定的幾種數據會被壓縮——許多二進制格式的文件像jpeg,gif,png,swf和pdf已經壓縮過他們的數據了,因此向客戶端發送這些數據時不會進行gzip壓縮。文本文件例如網頁和xml文件會被壓縮,由於它們一般有大量的數據冗餘。apache

 

怎樣設置apache的mod_deflate來使用gzip壓縮數據

apache 2.x以上版本已經配備了mod_deflate擴展,這使得apache能夠透明地壓縮特定種類的數據。要開啓這個特性,你須要在apache的配置文件中啓用mod_deflate。並將mod_deflate命令添加到你的虛擬主機配置或者.htaccess文件中。json

 

在ASIHTTPRequest中使用gzip

 
1
2
3
4
5
6
7
8
9
10
11
12
- ( IBAction )grabURL:( id )sender
{
NSURL  *url = [ NSURL  URLWithString : @ "http://www.cccsee.cn " ];
ASIHTTPRequest *request = [ASIHTTPRequest  requestWithURL :url];
// 默認爲YES, 你能夠設定它爲NO來禁用gzip壓縮
[request  setAllowCompressedResponse : YES ];
[request  startSynchronous ];
BOOL  *dataWasCompressed = [request  isResponseCompressed ];  // 響應是否被gzip壓縮過?
NSData  *compressedResponse = [request  rawResponseData ];  // 壓縮的數據
NSData  *uncompressedData = [request  responseData ];  // 解壓縮後的數據
NSString  *response = [request  responseString ];  // 解壓縮後的字符串
}

當allowCompressedResponse 設置爲YES時,ASIHTTPRequest將向request中增長一個Accept-Encoding頭,表示咱們能夠接收gzip壓縮過的數據。若是響應頭中包含一個Content-Encoding頭指明數據是壓縮過的,那麼調用responseData 或者responseString 將會獲得解壓縮後的數據。你也能夠經過調用rawResponseData來得到原始未壓縮的數據。服務器

 

相應數據的實時解壓縮

默認狀況下,ASIHTTPRequest會等到request完成時才解壓縮返回的數據。若設置request的shouldWaitToInflateCompressedResponses 屬性爲NO,ASIHTTPRequest將會對收到的數據進行實時解壓縮。 在某些狀況下,這會稍稍提高速度,由於數據能夠在reqeust等待網絡數據時進行處理。網絡

若是你須要對響應數據流進行流處理(例如XML和JSON解析),這個特性會頗有用。若是啓用了這個選項,你能夠經過實現代理函數request:didReceiveData:來將返回的網絡數據一點一點餵給解析器。函數

注意,若是shouldWaitToInflateCompressedResponses 被設置爲NO,那麼原始(未解壓)的數據會被拋棄。具體狀況請查閱ASIHTTPRequest.h的代碼註釋。url

 

使用gzip壓縮request數據

1.0.3版本的新特性就是gzip壓縮request數據。使用這個特性,你能夠經過設置shouldCompressRequestBody 爲YES來使你的程序壓縮POST/PUT的內容,默認值爲NO。spa

apache的mod_deflate能夠自動解壓縮gzip壓縮的請求體(經過合適的設置)。這個方法適用於CGI內容,但不適用於內容過濾器式的模塊(例如mod PHP),這種狀況下,你就必須本身解壓縮數據。代理

相關文章
相關標籤/搜索