我有以下问题:我正在创建一个非常大的SOAP请求(数据是一个编码为Base64字符串的视频),因此我不能将其作为原始SOAP请求发送,而是需要在HTTP 1.1块中发送它.我似乎无法弄明白该怎么做.我在这里使用了代码:
What are alternatives to NSURLConnection for chunked transfer encoding
但它似乎没有做我认为应该做的事情 – 我可以看到请求作为单个请求到达服务器而不是很多块(我在服务器上使用WireShark来查看传入的流量.)
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
解决方法
弄清楚了:
NSInputStream *dataStream = [NSInputStream inputStreamWithData:[soapBody dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBodyStream:dataStream];
这会导致请求自动处于HTP 1.1块中!