サーバーからデータを取得しようとしています。 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)」
私は何を間違えましたか?私の英語でごめんなさい。ありがとう:)
私は何を間違えましたか?
なし。
HTTPステータスコード411(必要な長さ)は、何らかの理由でコンテンツ長ヘッダーのないメッセージの受け入れを拒否した場合に、サーバーによって応答として送信されます。
サーバーは、Content-Lengthヘッダーのないコンテンツを単に受け入れる場合と受け入れない場合があります。
リクエストのプロパティNSInputStream
を介してHTTPBodyStream
オブジェクトをリクエスト本文として設定すると、NSURLConnection
は本文自体の長さを評価できなくなります。 (ストリームのプロパティlength
はありません)。したがって、NSURLConnection
は特定の「転送モード」、つまり「チャンク転送エンコード」を使用します。この転送モードshouldは、ボディの送信に成功し、Content-Legthヘッダーを必要としません(実際にはmust含まれていません)。残念ながら、サーバーはこのタイプの転送を受け入れません。
参照: チャンク転送エンコーディング (wiki)。
クライアント側の問題を解決するには:
本体の長さを(可能であれば)自分で決定し、リクエストの「Content-Length」ヘッダーフィールドを設定します。この入力ストリームがファイルまたはNSData
オブジェクトから作成されている場合、長さは簡単に決定できます。ただし、実際のストリームコンテンツと正確に同じ長さをバイト単位で設定してください。
NSInputStream
を使用せず、NSData
オブジェクトを本体として使用し、プロパティHTTPBody
を介して設定します。ボディをNSData
オブジェクトとして設定すると、NSURLConnection
はコンテンツの長さ自体を決定できます。また、リクエスト。