17

サーバーからデータを取得しようとしています。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 - Length Required」が表示されます

[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(someAddress)」

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

4

1 に答える 1

26

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

何もない。

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

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

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

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

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

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

  • を使用せずNSInputStreamNSDataオブジェクトを本体として使用し、プロパティを介して設定しますHTTPBody。本文をNSDataオブジェクトとして設定NSURLConnectionすると、コンテンツの長さ自体を決定でき、リクエストで自分で設定しない限り、正しい長さの Content-Length ヘッダーが自動的に追加されます。

于 2013-10-07T15:28:07.770 に答える