2010-10-04 60 views
5

我在寫一個IPhone/IOS Obj-C SOAP客戶端時遇到了麻煩,該客戶端使用SOAP WS接口與應用程序對話。該應用程序使用NuSOAP PHP網絡服務器,並使用gzip/deflate編碼超過一定大小的任何有效載荷,無論客戶端是否啓用。NSURLConnection:gzip編碼的SOAP響應被破壞

據我所知,NSURLConnection透明地解壓縮任何gzip編碼響應,並呈現解壓縮的響應,但在這種情況下收到的原始響應似乎已損壞。我將SOAP有效載荷轉儲到一個文件中,並使用gunzip將其解壓縮,它抱怨「文件意外結束」。我確實檢查了網絡服務器,並將其發送到文件的gzip響應轉儲,這是使用gunzip解壓縮的,沒有任何錯誤。似乎收到的響應已經損壞。

我試過使用NSURLConnection和ASIHTTPRequest。使用NSURLConnection時,響應數據長度和響應的HTTP頭中提到的長度之間每次只有15個字節的差異。使用ASIHTTPRequest接收到的字節數和HTTP Header中響應的長度匹配,但是可惜的是響應仍然是錯誤的,並且對gzip解壓縮沒有反應。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    NSLog(@"Headers :%@",[(NSHTTPURLResponse*)response allHeaderFields]); 
     [self.receivedData setLength:0]; 
    self.receivedData = [[NSMutableData dataWithCapacity:1024*1024] retain]; 
    } 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)value { 
    NSString *dataRec = [[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding]; 
    NSLog(@"didReceiveData :%@",dataRec); 
    [self.receivedData appendData:value]; 
} 

2010-10-04 13:37:15.310 SugarSoap [848:207]接頭:{ 「緩存控制」=「不存儲,無緩存,必重新驗證, 後檢查= 0,預檢= 0「; Connection =「Keep-Alive」; 「內容編碼」= gzip; 「Content-Length」= 1683; 「Content-Type」=「text/xml; charset = UTF-8」; Date =「Mon,04 Oct 2010 08:07:14 GMT」; Expires =「星期四,1981年11月19日08:52:00 GMT」; 「Keep-Alive」=「timeout = 15,max = 100」; Pragma =「no-cache」; Server =「Apache/2.0.59(Unix)mod_ssl/2.0.59 OpenSSL/0.9.8g DAV/2 PHP/5.2.5」; 「Set-Cookie」=「PHPSESSID = udsgtttvts90ijuhsvuqop6ja6; path = /」; Vary =「Accept-Encoding」; 「X-Powered-By」=「PHP/5.2.5」; 「X-Soap-Server」=「NuSOAP/0.7.2()」; } 2010-10-04 13:37:15.311 SugarSoap [848:207]

didReceiveData:(空)2010-10-04 13:37:15.311 SugarSoap [848:207] connectionFinsihed!長度:1668

-(void)requestFinished:(ASIHTTPRequest *)request { 
    if([request isResponseCompressed]){ 
     NSLog(@"Response Compressed."); 
    } 
    NSData *compressedResponse = [request rawResponseData]; 
    NSData *responseData = [request responseData]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 
    NSLog(@"Length before decompression:%d Length after decompression:%d", compressedResponse length],[responseData length]); 
    NSLog(@"Response :%@",responseString); 
} 

2010-10-04 14:11:20.687 Hello_SOAP [1033:207]壓縮的響應。

2010-10-04 14:11:20.687 Hello_SOAP [1033:207]長度解壓縮之前:解壓後2165長度:0

2010-10-04 14:11:20.687 Hello_SOAP [1033:207]迴應:

回答

0

我曾經有一個問題,當一個輕微損壞的文件解壓縮沒有任何問題在我的Mac上,但在iPhone上它不會。我猜iPhone上的zlib對錯誤的容忍度較低。

0

您確定-connection:didReceiveData:-connection:didReceiveResponse:之前至少沒有被調用過一次嗎?它看起來像你可能會截斷第一個數據包中包含頭部的一些數據。

+0

是的,它被調用以正確的順序。我記錄了所有收到的數據,猜測數據即使被調用失序也應該顯示出來。另請注意,如果我在WS服務器端禁用gzip編碼,則SOAP調用完美地工作。 – Bala 2010-11-09 06:26:30

0

你確定你的數據是UTF8嗎?嘗試其他編碼,看看你的錯誤是否消失。

+0

是的,數據編碼是UTF8。如果相同的消息有效載荷未被壓縮,UTF8解碼完美地工作。我也嘗試了其他編碼,但沒有取得太大的成功。 – Bala 2010-11-09 06:28:47