11

मैं सर्वर से डेटा प्राप्त करने का प्रयास करता हूं। मैं NSURLConnectionDelegate, NSURLConnectionDataDelegate का उपयोग करता हूं। कोड है (उद्देश्य - सी)।HTTP स्थिति कोड 411 - लंबाई आवश्यक

-(void)sendRequest 
{ 
NSURL* url = [[NSURL alloc] initWithString:@"http://SomeServer"]; 

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] init]; 


NSString* reqBody = [NSString stringWithFormat:@"<tag>Content</tag>"]; 

NSData* reqData = [reqBody dataUsingEncoding:NSUTF8StringEncoding]; 

NSInputStream* stream = [NSInputStream inputStreamWithData:reqData]; 



[request setURL:url]; 
[request setHTTPBodyStream:stream]; 
[request setHTTPMethod:@"POST"]; 

self.wpData = [[NSMutableData alloc] init]; 
NSURLConnection* conection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

[conection start]; 

} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 

    [self.wpData setLength:0];  

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d { 
NSString* str = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding]; 

NSLog(@"RESPONSE DATA: %@",str); 
[self.wpData appendData:d]; 
} 

लेकिन मैं मिलता है "411 - लंबाई आवश्यक" जब मैं

[request setHTTPBodyStream:stream]; 

और "हैश (someAddress)" का उपयोग जब मैं

[request setHTTPBody:reqData]; 

मैंने कोशिश की

[request setHTTPBodyStream:stream]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
का उपयोग

लेकिन फिर "हश (कुछ एड्रेस्रेस)"

मैंने क्या गलत किया है? मेरी अंग्रेजी के लिए खेद है। धन्यवाद :)

उत्तर

17

मैंने क्या गलत किया है?

कुछ भी नहीं।

HTTP स्थिति कोड 411 (लंबाई आवश्यक) सर्वर द्वारा प्रतिक्रिया के रूप में भेजा जाता है जब यह किसी भी कारण से सामग्री-लंबाई शीर्षलेख के बिना संदेश स्वीकार करने से इंकार कर देता है।

एक सर्वर सामग्री-लंबाई शीर्षलेख के बिना सामग्री को स्वीकार या स्वीकार नहीं कर सकता है।

जब आप अनुरोध के लिए संपत्ति के माध्यम से NSInputStream ऑब्जेक्ट को अनुरोध निकाय के रूप में सेट करते हैं, NSURLConnection शरीर की लंबाई का मूल्यांकन नहीं कर सकता है। (स्ट्रीम के लिए length कोई संपत्ति नहीं है)। इसलिए, NSURLConnection एक निश्चित "स्थानांतरण मोड" का उपयोग करता है, अर्थात् "खंडित स्थानांतरण एन्कोडिंग"। यह स्थानांतरण मोड किसी भी निकाय को प्रेषित करने में सफल होना चाहिए और इसे सामग्री-पैरथ हेडर की आवश्यकता नहीं है (वास्तव में में कोई नहीं होना चाहिए)। हां, सर्वर बस इस प्रकार के स्थानांतरण को स्वीकार नहीं करता है।

यह भी देखें: Chunked transfer encoding (विकी)।

ग्राहक के पक्ष इस मुद्दे को हल करने के लिए:

  • शरीर खुद की लंबाई निर्धारित (यदि संभव हो) और अनुरोध के लिए एक "सामग्री-लंबाई" शीर्षक क्षेत्र निर्धारित किया है। यदि यह इनपुट स्ट्रीम किसी फ़ाइल से या NSData ऑब्जेक्ट से बनाई गई है, तो लंबाई आसानी से निर्धारित की जा सकती है। लेकिन बाइट्स में वास्तविक स्ट्रीम सामग्री के समान सटीक लंबाई निर्धारित करना सुनिश्चित करें।

  • NSInputStream का उपयोग न करें, लेकिन NSData ऑब्जेक्ट को शरीर के रूप में उपयोग करें और इसे HTTPBody के माध्यम से सेट करें। जब आप शरीर को NSData ऑब्जेक्ट के रूप में सेट करते हैं, तो NSURLConnection सामग्री की लंबाई निर्धारित कर सकता है, और यह स्वचालित रूप से सही लंबाई के साथ सामग्री-लंबाई शीर्षलेख जोड़ देगा, जब तक कि आप इसे स्वयं अनुरोध में सेट न करें।

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