2010-10-04 8 views
5

मुझे एक आईफोन/आईओएस ओब्जे-सी एसओएपी क्लाइंट लिखने में परेशानी हो रही है जो एक एसओएपी डब्ल्यूएस इंटरफेस के साथ एक एप्लीकेशन से बात करता है। एप्लिकेशन एक NuSOAP PHP वेबसर्वर का उपयोग करता है और क्लाइंट द्वारा जो भी सक्षम है, gzip/deflate का उपयोग करके किसी निश्चित आकार के ऊपर किसी भी पेलोड को एन्कोड करता है।NSURLConnection: gzip एन्कोडेड SOAP प्रतिक्रिया दूषित हो जाती है

मैं समझता हूं कि NSURLConnection किसी भी gzip एन्कोडेड प्रतिक्रिया को पारदर्शी रूप से डिकंप्रेस करता है और डिकंप्रेस्ड प्रतिक्रिया प्रस्तुत करता है, लेकिन इस मामले में प्राप्त कच्ची प्रतिक्रिया दूषित प्रतीत होती है। मैंने एसओएपी पेलोड को एक फाइल में छोड़ दिया और गनज़िप का उपयोग करके इसे डंप्रेस किया, यह "फाइल के अप्रत्याशित अंत" की शिकायत करता है। मैंने वेबसर्वर की जांच की और gzip प्रतिक्रिया को छोड़ दिया कि यह एक फाइल को भेज रहा है, यह Gunzip का उपयोग कर किसी भी त्रुटि के बिना decompressed है। ऐसा लगता है कि रसीद पर प्रतिक्रिया दूषित हो रही है।

मैंने NSRLConnection और ASIHTTPRequest दोनों का उपयोग करने का प्रयास किया। NSURLConnection के साथ, प्रतिक्रिया डेटा लंबाई और प्रतिक्रिया के HTTP शीर्षलेख में उल्लिखित लंबाई के बीच, हर बार बिल्कुल 15 बाइट्स का अंतर होता है। ASIHTTP के साथ प्राप्त बाइट्स की संख्या और HTTP शीर्षलेख मिलान में प्रतिक्रिया की लंबाई के साथ, लेकिन प्रतिक्रिया अभी भी भ्रष्ट है और कृपया 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 "; कनेक्शन = "रखें-जीवित"; "सामग्री-एन्कोडिंग" = gzip; "सामग्री-लंबाई" = 1683; "सामग्री-प्रकार" = "पाठ/एक्सएमएल; वर्णसेट = यूटीएफ -8"; दिनांक = "सोम, 04 अक्टूबर 2010 08:07:14 जीएमटी"; समाप्त हो जाता है = "थू, 1 9 नवंबर 1 9 81 08:52:00 जीएमटी"; "Keep-Alive" = "टाइमआउट = 15, अधिकतम = 100"; प्रज्ञा = "नो-कैश"; सर्वर = "अपाचे/2.0.5 9 (यूनिक्स) mod_ssl/2.0.59 ओपनएसएसएल/0.9.8 जी डीएवी/2 PHP/5.2.5"; "सेट-कुकी" = "PHPSESSID = udsgtttvts90ijuhsvuqop6ja6; पथ = /"; वेरी = "स्वीकृति-एन्कोडिंग"; "एक्स-पावर्ड-बाय" = "PHP/5.2.5"; "एक्स-साबुन-सर्वर" = "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

मुझे एक बार समस्या हुई जब थोड़ा दूषित फ़ाइल मेरे मैक पर किसी भी समस्या के बिना अनजिप हो जाएगी, लेकिन आईफोन पर यह नहीं होगा। मुझे लगता है कि आईफोन पर zlib त्रुटियों के लिए कम सहनशीलता है।

0

क्या आप वाकई -connection:didReceiveData: को -connection:didReceiveResponse: से कम से कम एक बार नहीं बुलाया जा रहा है? ऐसा लगता है कि आप कुछ डेटा को छीन रहे हैं जो हेडर के साथ पहले पैकेट में आता है।

+0

हाँ, यह सही क्रम में बुलाया जाता है। और मैं प्राप्त सभी डेटा लॉगिंग कर रहा हूं, अनुमान लगाएं कि डेटा को दिखाना चाहिए भले ही इसे अनुक्रम से बाहर बुलाया जाए। यह भी ध्यान रखें कि अगर मैं डब्ल्यूएस सर्वर पक्ष पर gzip एन्कोडिंग अक्षम करता हूं तो एसओएपी कॉल पूरी तरह से काम करता है। – Bala

0

क्या आप सुनिश्चित हैं कि आपका डेटा यूटीएफ 8 है? अन्य एन्कोडिंग आज़माएं और देखें कि क्या आप त्रुटि दूर हो जाते हैं।

+0

हां, डेटा एन्कोडिंग यूटीएफ 8 है। यूटीएफ 8 डिकोडिंग पूरी तरह से काम करता है अगर एक ही संदेश पेलोड gzipped नहीं है। और मैंने बिना किसी सफलता के अन्य एन्कोडिंग भी कोशिश की। – Bala

संबंधित मुद्दे