7

次の問題があります。非常に大きなSOAPリクエストを作成しています(データはBase64文字列としてエンコードされたビデオです)。そのため、生のSOAPリクエストとして送信することはできず、HTTP1.1チャンクで送信する必要があります。どうすればいいのかわからないようです。私はここでコードを使用しました: チャンク転送エンコーディングのNSURLConnectionの代替手段は何ですか? しかし、それは私が思っていることをしていないようです-リクエストが多くのチャンクではなく単一のリクエストとしてサーバーに到着することがわかります(サーバーでWireSharkを使用して、着信トラフィックを確認しています。)

Androidの同様の機能がJava用のApacheFoundationsHTTPライブラリを使用して機能することを知っています-これらを使用すると、事前に長さが指定されていないHTTPリクエストはHTTP1.1チャンクリクエストとして送信されます-実際にそれらのリクエストが個々のチャンクとしてのサーバー...私はそれをエミュレートしたいと思います。

(更新:AFNetworkingには機能があるように思われますが、その使用方法に関する例は見つかりません。)

これが私のコードです、多かれ少なかれ:

NSString *soapBody = ....; //some correctly formed SOAP request XML here 


NSURL *url = [NSURL URLWithString:...];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
[request addValue: ... forHTTPHeaderField:@"SOAPAction"];
[request setHTTPMethod:@"POST"];
[request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];
ChunkedTransferConnection* connection = [ChunkedTransferConnection alloc];
[connection establishConnectionWithRequest:request];

ここで、ChunkedTransferConnectionの実装は次のとおりです。

@implementation ChunkedTransferConnection

    @synthesize p_connection;
    @synthesize p_responseData;

    - (void)establishConnectionWithRequest:(NSMutableURLRequest *)request
    {
        self.p_responseData = [[NSMutableData alloc] initWithLength:0] ;
        self.p_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    }
...
@end
4

1 に答える 1

5

理解した:

    NSInputStream *dataStream = [NSInputStream inputStreamWithData:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBodyStream:dataStream];

これにより、リクエストは自動的に HTP 1.1 チャンクになります!

于 2013-03-01T16:51:31.103 に答える