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"]; 
을 시도 사용할 때

하지만 다시 "해시 (someaddress)"

내가 잘못 했습니까? 영어로 죄송합니다. 고마워요 :)

답변

17

나는 무엇을 잘못 했습니까?

없음.

HTTP 상태 코드 411 (길이 필요)은 콘텐츠 길이 헤더없이 메시지를 수락하기를 거부하면 서버에서 응답으로 전송됩니다.

서버는 단순히 Content-Length 헤더가없는 콘텐츠를 허용하거나받지 않을 수 있습니다.

요청시 HTTPBodyStream 속성을 통해 NSInputStream 개체를 요청 본문으로 설정하면 NSURLConnection은 본문 자체의 길이를 더 이상 평가할 수 없습니다. (스트림에는 특성 length이 없음). 따라서 NSURLConnection은 특정 "전송 모드"즉 "청크 분할 전송 인코딩"을 사용합니다. 이 전송 모드 이 신체를 전송하는 데 성공해야하며 Content-Legth 헤더는 필요하지 않습니다. 실제로는 이 아니어야합니다. 아아, 서버는 이러한 유형의 전송을 허용하지 않습니다.

다음을 참조하십시오 : Chunked transfer encoding (위키).

  • 몸 자신의 길이를 결정합니다 (가능한 경우) 및 요청에 대해 "콘텐츠 길이"헤더 필드를 설정합니다

    는 클라이언트 측에서 문제를 해결합니다. 이 입력 스트림이 파일 또는 NSData 오브젝트에서 작성된 경우 길이를 쉽게 판별 할 수 있습니다. 그러나 실제 스트림 내용과 정확히 같은 길이를 바이트로 설정해야합니다.

  • NSInputStream을 사용하지 말고 NSData 개체를 본문으로 사용하고 속성 HTTPBody을 통해 설정하십시오. 본문을 NSData 개체로 설정하면 NSURLConnection은 콘텐츠 길이 자체를 결정할 수 있으며 요청시 직접 설정하지 않는 한 올바른 길이의 Content-Length 헤더를 자동으로 추가합니다.