我尝试从服务器获取数据。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(需要长度(由服务器作为响应发送,当它拒绝接受没有内容长度标头的消息时,无论出于何种原因。
服务器只是接受也可能不接受没有内容长度标头的内容。
当您通过请求的属性HTTPBodyStream
将NSInputStream
对象设置为请求正文时,NSURLConnection
无法再计算正文本身的长度。(流没有属性length
(。因此,NSURLConnection
使用某种"传输模式",即"分块传输编码"。此传输模式应该可以成功传输任何主体,并且不需要 Content-Legth 标头(实际上不得包含标头(。唉,服务器根本不接受这种类型的传输。
另请参阅:分块传输编码 (wiki(。
要解决客户端问题,请执行以下操作:
-
自己确定正文的长度(如果可能(,并为请求设置"内容长度"标头字段。如果此输入流是从文件或
NSData
对象创建的,则可以轻松确定长度。但请确保设置与实际流内容完全相同的长度(以字节为单位(。 -
不要使用
NSInputStream
,而是使用NSData
对象作为主体并通过属性HTTPBody
进行设置。当您将正文设置为NSData
对象时,NSURLConnection
可以确定内容长度本身,并且它将自动添加具有正确长度的 Content-Length 标头,除非您在请求中自行设置。