17

我尝试从服务器获取数据。我使用 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];

和“HASH(someAddress)”当我使用

[request setHTTPBody:reqData];

我试过了

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

但又是“哈希(某些地址)”

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

4

1 回答 1

26

我做错了什么?

没有什么。

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

服务器可能会或可能不会接受没有 Content-Length 标头的内容。

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

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

要解决客户端的问题:

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

  • 不要使用 a NSInputStream,而是使用一个NSData对象作为 body 并通过 property 设置它HTTPBody。当你将body设置为NSData对象时,NSURLConnection可以自己确定内容长度,它会自动添加一个长度正确的Content-Length头,除非你在请求中自己设置。

于 2013-10-07T15:28:07.770 回答