我试图从服务器获取数据.我使用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)”
我做错了什么?
对不起我的英语不好.谢谢 :)
解决方法
What have I done wrong?
没有.
HTTP状态码411(需要长度)由于任何原因而被拒绝接受没有内容长度头的消息的服务器作为响应.
服务器简单地可能接受也可能不接受没有Content-Length头部的内容.
当通过属性HTTPBodyStream为请求设置NSInputStream对象作为请求体时,NSURLConnection不能再评估身体本身的长度. (流的没有属性长度).因此,NSURLConnection使用一定的“传输模式”,即“分块传输编码”.此传输模式应成功传输任何主体,并且不需要Content-Legth标题(实际上不能包含一个).唉,服务器根本不接受这种转移.
参见:Chunked transfer encoding(wiki).
在客户端解决问题:
>自己确定身体的长度(如果可能),并为请求设置“Content-Length”头域.如果这个输入流是从一个文件或一个NSData对象创建的,那么可以很容易地确定这个长度.但请确保设置与实际流内容完全相同的长度(以字节为单位).>不要使用NSInputStream,而是使用NSData对象作为body,并通过属性HTTPBody进行设置.当您将主体设置为NSData对象时,NSURLConnection可以自己确定内容长度,并且会自动添加具有正确长度的Content-Length头,除非您在请求中自行设置.