我尝试从服务器获取数据。我使用 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];
I tried
[request setHTTPBodyStream:stream];
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
但还是“HASH(某个地址)”
我做错了什么?
对不起我的英语不好。谢谢 :)
我做错了什么?
Nothing.
当服务器出于某种原因拒绝接受没有内容长度标头的消息时,服务器会发送 HTTP 状态代码 411(需要长度)作为响应。
服务器可能会或可能不会接受没有内容长度标头的内容。
当您设置NSInputStream
对象通过属性作为请求主体HTTPBodyStream
对于请求,NSURLConnection
无法再评估身体本身的长度。 (没有财产length
对于流)。因此,NSURLConnection
使用某种“传输模式”,即“分块传输编码”。这种传输方式should成功传输任何正文,并且不需要 Content-Length 标头(实际上must不包含一个)。唉,服务器根本不接受这种类型的传输。
也可以看看:分块传输编码 http://en.wikipedia.org/wiki/Chunked_transfer_encoding (wiki).
解决客户端问题:
自己确定主体的长度(如果可能)并为请求设置“Content-Length”标头字段。如果此输入流是从文件或从NSData
物体的长度可以很容易地确定。但请务必设置与实际流内容完全相同的长度(以字节为单位)。
不要使用NSInputStream
,但使用NSData
对象作为主体并通过属性设置它HTTPBody
。当您将主体设置为NSData
目的,NSURLConnection
可以自行确定内容长度,并且它会自动添加具有正确长度的 Content-Length 标头,除非您在请求中自行设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)