HTTP状态码411 - 需要的长度

Wan*_*now 13 objective-c nsurlconnection nsurlrequest ios http-status-code-411

我试图从服务器获取数据.我使用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];
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用时,我得到"411 - 长度要求"

[request setHTTPBodyStream:stream];
Run Code Online (Sandbox Code Playgroud)

我用的时候是"HASH(someAddress)"

[request setHTTPBody:reqData];
Run Code Online (Sandbox Code Playgroud)

我试过了

[request setHTTPBodyStream:stream];
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
Run Code Online (Sandbox Code Playgroud)

但又一次"HASH(someAdddress)"

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

Cou*_*per 19

我做错了什么?

没有.

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

服务器可以接受或不接受没有Content-Length头的内容.

当您NSInputStream通过请求的属性将对象设置为请求主体时HTTPBodyStream,NSURLConnection无法再评估主体本身的长度.(length流没有属性).因此,NSURLConnection使用某种"传输模式",即"分块传输编码".这种传递方式应该成功传输任何机构,它不需要内容Legth头(其实一定不能包含一个).唉,服务器根本不接受这种类型的转移.

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

要在客户端解决问题:

  • 自己确定身体的长度(如果可能),并为请求设置"Content-Length"标头字段.如果已从文件或NSData对象创建此输入流,则可以容易地确定长度.但一定要设置与实际流内容完全相同的长度(以字节为单位).

  • 不要使用a NSInputStream,而是使用NSData对象作为body并通过property设置它HTTPBody.当您将主体设置为NSData对象时,NSURLConnection可以自行确定内容长度,并且它将自动添加具有正确长度的Content-Length标头,除非您在请求中自己设置它.