web-dev-qa-db-ja.com

HTTPステータスコード411-長さが必要です

サーバーからデータを取得しようとしています。 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];

私は試した

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

しかし、再び「HASH(someAdddress)」

私は何を間違えましたか?私の英語でごめんなさい。ありがとう:)

13
WantToKnow

私は何を間違えましたか?

なし。

HTTPステータスコード411(必要な長さ)は、何らかの理由でコンテンツ長ヘッダーのないメッセージの受け入れを拒否した場合に、サーバーによって応答として送信されます。

サーバーは、Content-Lengthヘッダーのないコンテンツを単に受け入れる場合と受け入れない場合があります。

リクエストのプロパティNSInputStreamを介してHTTPBodyStreamオブジェクトをリクエスト本文として設定すると、NSURLConnectionは本文自体の長さを評価できなくなります。 (ストリームのプロパティlengthはありません)。したがって、NSURLConnectionは特定の「転送モード」、つまり「チャンク転送エンコード」を使用します。この転送モードshouldは、ボディの送信に成功し、Content-Legthヘッダーを必要としません(実際にはmust含まれていません)。残念ながら、サーバーはこのタイプの転送を受け入れません。

参照: チャンク転送エンコーディング (wiki)。

クライアント側の問題を解決するには:

  • 本体の長さを(可能であれば)自分で決定し、リクエストの「Content-Length」ヘッダーフィールドを設定します。この入力ストリームがファイルまたはNSDataオブジェクトから作成されている場合、長さは簡単に決定できます。ただし、実際のストリームコンテンツと正確に同じ長さをバイト単位で設定してください。

  • NSInputStreamを使用せず、NSDataオブジェクトを本体として使用し、プロパティHTTPBodyを介して設定します。ボディをNSDataオブジェクトとして設定すると、NSURLConnectionはコンテンツの長さ自体を決定できます。また、リクエスト。

19
CouchDeveloper