在Objective-C中发送分块的HTTP 1.1请求

时间:2013-02-28 20:04:47

标签: ios objective-c soap nsurlconnection http-chunked

我有以下问题:我正在创建一个非常大的SOAP请求(数据是一个编码为Base64字符串的视频),因此我无法将其作为原始SOAP请求发送,而是需要在HTTP 1.1中发送它块。我似乎无法弄明白该怎么做。我在这里使用了代码: What are alternatives to NSURLConnection for chunked transfer encoding 但它似乎没有做我认为应该做的事情 - 我可以看到请求作为单个请求到达服务器而不是很多块(我在服务器上使用WireShark来查看传入的流量。)

我知道Android上的类似功能可以使用Apache Foundations HTTP库进行Java - 有了这些,任何预先未指定长度的HTTP请求都会作为HTTP 1.1 Chunked Request传输 - 我确实可以看到这些请求作为单独的块到达服务器...我想模仿它。

(更新:似乎我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

1 个答案:

答案 0 :(得分:5)

想出来:

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

这会导致请求自动处于HTTP 1.1块中!