HTTP状态码411 - 需要的长度

时间:2013-10-07 14:13:56

标签: ios objective-c nsurlconnection nsurlrequest http-status-code-411

我尝试从服务器获取数据。我使用NSURLConnectionDelegate,NSURLConnectionDataDelegate。有代码(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)”

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

1 个答案:

答案 0 :(得分:19)

  

我做错了什么?

没有

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