HTTP状态码411 – 需要的长度

我试图从服务器获取数据。 我使用NSURLConnectionDataDelegate NSURLConnectionDelegate。 有代码(Objective – C)。

-(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)”

我做错了什么? 对不起我的英语不好。 谢谢 :)

我做错了什么?

没有。

HTTP状态码411(长度要求)由服务器作为响应发送,当它拒绝接受没有内容长度标题的消息时,无论出于何种原因。

服务器只是可能接受或不接受没有内容长度标头的内容。

当您通过属性HTTPBodyStream为请求设置一个NSInputStream对象作为请求主体时, NSURLConnection不能再计算主体的长度。 (一个stream没有属性length )。 因此, NSURLConnection使用某种“传输模式”,即“分块传输编码”。 这种传输模式应该成功传输任何主体,并且不需要Content-Legth头(实际上不能包含一个)。 唉,服务器根本不接受这种types的转移。

另请参阅:分块传输编码 (wiki)。

为了解决客户端的问题:

  • 确定身体的长度(如果可能),并为请求设置“Content-Length”标题字段。 如果这个inputstream是从文件或NSData对象创build的,则可以很容易地确定长度。 但一定要设置与实际stream内容的字节完全相同的长度。

  • 不要使用NSInputStream ,而是使用NSData对象作为主体,并通过属性HTTPBody设置。 将主体设置为NSData对象时, NSURLConnection可以自己确定内容长度,并且会自动添加正确长度的Content-Length标头,除非您自己将其设置在请求中。

Interesting Posts