ios HTTP 状态代码 411 - 需要长度

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19227142/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 02:10:27  来源:igfitidea点击:

HTTP Status Code 411 - Length Required

iosobjective-cnsurlconnectionnsurlrequesthttp-status-code-411

提问by WantToKnow

I try to get data from server. I use NSURLConnectionDelegate, NSURLConnectionDataDelegate. There is code (Objective - C).

我尝试从服务器获取数据。我使用 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];
}

But I get "411 - Length Required" when I use

但是当我使用时我得到“411 - Length Required”

[request setHTTPBodyStream:stream];

and "HASH (someAddress)" when I use

和“HASH (someAddress)”当我使用

[request setHTTPBody:reqData];

I tried

我试过

[request setHTTPBodyStream:stream];
NSString *postLength = [NSString stringWithFormat:@"%d", [reqData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

but again "HASH (someAdddress)"

但还是“哈希(某个地址)”

What have I done wrong? Sorry for my English. Thanks :)

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

回答by CouchDeveloper

What have I done wrong?

我做错了什么?

Nothing.

没有。

HTTP Status Code 411 (Length Required) is sent by the server as a response when it refuses to accept a message without a content-length header, for whatever reason.

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

A server simply may or may not accept a content without a Content-Length header.

服务器可能会也可能不会接受没有 Content-Length 标头的内容。

When you set an NSInputStreamobject as request body via property HTTPBodyStreamfor the request, NSURLConnectioncannot evaluate the length of the body itself anymore. (there is no property lengthfor a stream). Hence, NSURLConnectionuses a certain "transfer mode", namely "chunked transfer encoding". This transfer mode shouldsucceed to transmit any body and it does not require a Content-Legth header (actually mustnot contain one). Alas, the server simply does not accept this type of transfer.

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

See also: Chunked transfer encoding(wiki).

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

To solve the issue on the client side:

要解决客户端的问题:

  • Determine the length of the body yourself (if possible) and set a "Content-Length" header field for the request. If this input stream has been created from a file or from a NSDataobject, the length can be easily determined. But be sure to set the exact same length as the actual stream content in bytes.

  • Don't use a NSInputStream, but use a NSDataobject as body and set it via property HTTPBody. When you set the body as a NSDataobject, NSURLConnectioncan determine the content length itself, and it will automatically add a Content-Length header with the correct length, unless you set it yourself in the request.

  • 自己确定正文的长度(如果可能)并为请求设置“Content-Length”标头字段。如果此输入流是从文件或NSData对象创建的,则可以轻松确定其长度。但一定要设置与实际流内容完全相同的长度(以字节为单位)。

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