我想在NSInputStream中添加三个“部件”:一个NSString,一个来自另一个流的输出,然后是另一个NSString。其想法如下:
第一个也是最后一个NSStrings表示SOAP请求的开始和结束,而流的输出是加载一个非常大的文件并将其编码为Base64字符串的结果。因此,最后,我将让最后的NSInputStream保存整个SOAP请求,如下所示:
< soap开始>< Base64编码数据>< soap结束>
我希望将整个请求保存在NSInputStream中的原因有两方面:
确保请求将作为HTTP1.1块发送,而不是作为一个庞大的原始SOAP请求发送。
因此,我想知道如何实现这一点--也就是说,我如何将事情“排队”到一个NSInputStream中?甚至可以完成吗?还有别的办法吗?
仅供参考,在Java中,这可以如下所示
Vector<InputStream> streamVec = new Vector<InputStream>();
BufferedInputStream fStream = new BufferedInputStream(fileData.getInputStream());
Base64InputStream b64stream = new Base64InputStream(fStream, true);
String[] SOAPBody = GenerateSOAPBody(fileInfo).split("CUT_HERE");
streamVec.add(new ByteArrayInputStream(SOAPBody[0].getBytes()));
streamVec.add(b64stream);
streamVec.add(new ByteArrayInputStream(SOAPBody[1].getBytes()));
SequenceInputStream seqStream = new SequenceInputStream(streamVec.elements());因为Java有这些对象可用,但是objects中的NSStreams看起来像非常低级别的对象,很难使用。
注意:我在两天前问的时候完全重写了原来的问题,因为我认为新的编辑更清楚地解释了问题的所在。我希望它能帮助我们更容易地理解和回答
更新2
到目前为止,我已经实现了以下目标:我没有尝试将队列放入流中,而是首先使用临时文件来编写< soap same >,然后设置一个输入流以块形式从文件中读取,将每个块编码为一个Base64字符串并将其写入相同的临时文件,最后,当我的流关闭时,我会将< soap and >写入该temp文件。然后,我用这个文件的内容设置了另一个输入流,并将其传递给NSMutableURLRequest:
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
...
NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
[request setHTTPBodyStream:dataStream];这确保了HTTP1.1块传输文件的内容。连接完成后,删除临时文件。
这似乎很好,但当然这是一个恼人的工作-关于。我不想写到一个临时文件,而这一切都可以由流处理(理想情况下)。如果还有人有更好的建议,请告诉我:)
更新3
好的,另一个更新是有序的。虽然我的文件写作似乎有效,但我现在遇到了一个意外的问题,因为我的一些请求未能上传到服务器。具体来说,一切都是按照计划进行的,我正在将临时文件的内容读入流中,并将请求的HTTP主体设置为此流,它开始按我的意愿发送HTTP1.1块--但由于某种原因,一些数据包被丢弃,最后的请求(这是我的猜测)出现了错误,因此失败了。我认为丢包的问题是随机的,因为我在较大的请求上观察到了它--也就是说,这个问题只是有更多的机会出现--而我的小请求通常处理得很好。这当然是一个独立的问题,而不是原来的问题。如果有人对造成这种情况的原因有很好的了解,我在这里问到了问题:在NSURLConnection发送的块HTTP1.1请求中丢弃的数据包
发布于 2016-07-05 21:26:08
您的解决方案是一个ok选项,但是您可以使用一个流来完成它。这意味着对NSInputStream进行子类化,这并不简单,因为您需要实现许多方法。
基本上,您的子类最初将返回页眉字节,然后将字节从“内部”流返回到文件内容,然后在用完时返回页脚字节。这意味着要记录页眉和页脚的大小以及到目前为止处理了多少,但这不是什么大问题。
有一个创建子类这里的示例,它展示了需要实现的复杂隐藏方法,以使流子类能够正常工作,而不会引发异常。
https://stackoverflow.com/questions/15236133
复制相似问题