【问题标题】:Sending chunked HTTP 1.1 requests in Objective-C在 Objective-C 中发送分块的 HTTP 1.1 请求
【发布时间】: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


【解决方案1】:

想通了:

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

这会导致请求自动位于 HTP 1.1 块中!

【讨论】:

  • 如果可以指定块的大小,是否可以指定?
  • 您的最终解决方案是使用 AFNetworking 还是您自己的 ChunkedTransferConnection 类?可以分享一下吗?
  • @Anona112 我使用 NSURLConnection,你知道一些指定块大小的方法吗?更多详情见stackoverflow.com/questions/33775734/…
  • 抱歉,我将此代码传递给了另一个程序员,但不确定最终的解决方案是什么。在这一点上已经有一段时间了。
猜你喜欢
  • 2016-04-26
  • 2015-03-15
  • 2016-06-08
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
相关资源
最近更新 更多