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标头,除非您自己将其设置在请求中。