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