11

Я пытаюсь получить данные с сервера. Я использую NSURLConnectionDelegate, NSURLConnectionDataDelegate. Существует код (Objective-C).Код состояния 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]; 

и "HASH (someAddress)", когда я использую

[request setHTTPBody:reqData]; 

Я попытался

[request setHTTPBodyStream:stream]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

, но снова "HASH (someAdddress)"

Что я сделал не так? Извините за мой английский. Спасибо :)

ответ

17

Что я сделал не так?

Ничего.

Код HTTP-статуса 411 (требуемая длина) отправляется сервером в качестве ответа, когда он отказывается принять сообщение без заголовка длины содержимого по любой причине.

Сервер просто может принять или не принять контент без заголовка Content-Length.

Если вы установили объект NSInputStream в качестве тела запроса через свойство HTTPBodyStream для запроса, NSURLConnection больше не может оценить длину самого тела. (нет свойства length для потока). Следовательно, NSURLConnection использует определенный «режим передачи», а именно «закодированное кодирование передачи». Этот режим передачи должен преуспеть для передачи любого тела, и ему не требуется заголовок Content-Legth (фактически должен не содержать). Увы, сервер просто не принимает этот тип передачи.

См. Также: Chunked transfer encoding (wiki).

Для решения проблемы на стороне клиента:

  • Определить длину тела самостоятельно (если это возможно) и установить «Content-Length» поле заголовка для запроса. Если этот входной поток был создан из файла или из объекта NSData, длина может быть легко определена. Но обязательно укажите ту же длину, что и фактическое содержимое потока в байтах.

  • Не используйте NSInputStream, но используйте объект NSData как тело и установите его через свойство HTTPBody. Когда вы устанавливаете тело как объект NSData, NSURLConnection может определить длину контента сам, и он автоматически добавит заголовок Content-Length с правильной длиной, если вы не установите его самостоятельно в запросе.

 Смежные вопросы

  • Нет связанных вопросов^_^