我尝试从服务器获取数据。我使用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)”
我做错了什么? 对不起我的英语不好。谢谢:))
答案 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标头,除非您在请求中自己设置它。