【发布时间】:2013-02-15 04:21:12
【问题描述】:
我有以下问题:我正在创建一个非常大的 SOAP 请求(数据是一个编码为 Base64 字符串的视频),因此我不能将其作为原始 SOAP 请求发送,而是需要在 HTTP 1.1 中发送块。我似乎无法弄清楚该怎么做。我在这里使用了代码: What are alternatives to NSURLConnection for chunked transfer encoding 但它似乎没有做我认为应该做的事情 - 我可以看到请求作为 single 请求而不是许多块到达服务器(我在服务器上使用 WireShark 来查看传入的流量。)
我知道 Android 上的类似功能可以使用 Java 的 Apache Foundations HTTP 库 - 有了这些,任何未预先指定长度的 HTTP 请求都将作为 HTTP 1.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
【问题讨论】:
-
您链接的主题是关于接收分块数据,而不是关于发布分块数据。 - 据我了解(我可能错了),分块传输编码的唯一优点是您不需要提前知道 Content-Size。但是如果您将
soapBody作为字符串或数据对象,那么您就知道大小,那么为什么要使用分块编码呢? - 但也许我误解了什么。 -
谢谢,马丁,是的,我同意,该线程是关于接收的。我对发送感兴趣的原因是,当请求变得太大并且作为单个“原始”SOAP 请求到达时,服务器无法处理它。我不知道为什么,但这似乎是生活的事实——它只是放弃了它。我还不够先进,无法知道服务器为什么会这样。但我确实知道,当请求被分解成 HTTP 1.1 块时,服务器能够很好地处理它——我有 Android 代码这样做并且它可以工作。所以,我也在尝试做同样的事情。
-
对我来说使用分块请求的另一个原因是,如果视频变得非常大,那么我可以分部分加载,分部分编码,而不是全部加载到内存中编码和发送。将这些部分作为块发送。所以,我不会有在内存中保存巨大对象的问题。
标签: ios objective-c soap nsurlconnection http-chunked