HTTP 状态代码 411 - 需要长度



我尝试从服务器获取数据。I use NSURLConnectionDelegate, NSURLConnectionDataDelegate.有代码(目标 - 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];

和"哈希(某地址("当我使用

[request setHTTPBody:reqData];

我试过了

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

但又是"哈希(一些添加(">

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

我做错了什么?

无。

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

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

当您通过请求的属性HTTPBodyStreamNSInputStream对象设置为请求正文时,NSURLConnection无法再计算正文本身的长度。(流没有属性length(。因此,NSURLConnection使用某种"传输模式",即"分块传输编码"。此传输模式应该可以成功传输任何主体,并且不需要 Content-Legth 标头(实际上不得包含标头(。唉,服务器根本不接受这种类型的传输。

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

要解决客户端问题,请执行以下操作:

  • 自己确定正文的长度(如果可能(,并为请求设置"内容长度"标头字段。如果此输入流是从文件或NSData对象创建的,则可以轻松确定长度。但请确保设置与实际流内容完全相同的长度(以字节为单位(。

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

相关内容

  • 没有找到相关文章

最新更新