NSMutableURLRequest 发送部分帖子正文
Posted
技术标签:
【中文标题】NSMutableURLRequest 发送部分帖子正文【英文标题】:NSMutableURLRequest sends partial post body 【发布时间】:2013-01-14 17:41:06 【问题描述】:我正在使用 NSMutableURLRequest 将 base64 编码图像作为发布请求的一部分发送到服务器。我作为帖子正文记录的内容和服务器收到的内容不是一回事。服务器似乎得到了一个截断的版本,就好像连接在中途中止一样。请看下面的代码:
NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",reqStr];
NSLog(@"datastr is %@",dataStr);
NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"nsdata length is: %i",[dataForUrl length]);
[urlRequest setHTTPBody:dataForUrl];
[urlRequest setValue:[NSString stringWithFormat:@"%d", [dataForUrl length]] forHTTPHeaderField:@"Content-Length"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *res, NSData *data, NSError *err)
// ...
第一个日志语句显示正确的数据。我什至把字符串的base64部分取到http://www.motobit.com/util/base64-decoder-encoder.asp,解码为jpg,就是正确的图像。第二条日志语句显示长度是正确的大小(例如,当图片为 422480 时为 422624)。
我找不到连接详细信息或数据有任何问题。电话建立连接,发送一些数据,然后电话停止发送或服务器停止接收。是什么原因造成的?
编辑:链接到示例数据http://pastebin.com/BS9HjKhg
Edit2:服务器或 ios 正在将 + 从图像转换为空格。当我找到正确的发送方式时,我会发布答案。
【问题讨论】:
您的客户端连接是否以错误或成功结束? 我实际上从服务器得到了成功的响应,这意味着它得到了数据并且至少有一些数据在那里。由于图像数据位于字符串的末尾,因此会被截断,并且服务器会根据接收到的 base64 字符串的大小给出各种错误。 我怀疑这与服务器有关...服务器日志是否显示任何内容? 它确实显示了一些信息,但长度超过 255 个字符的条目会被截断。通常错误是 base64 字符串的长度无效,假设为它传输了超过 201 个字符。否则,它只接受数据并稍后在仪表板中显示图像错误。我需要使用任何 http 标头吗? 【参考方案1】:我能够将来自服务器的完整示例与 xcode 记录的内容进行比较,发现 +
转换为 [space]
。由于这是唯一有问题的字符,而且 iOS 中的 url 编码有问题,所以我只是这样做了
NSString *dataStr = [NSString stringWithFormat:@"request_data=%@",[reqStr stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]];
服务器再次接受它们。我仍然不确定服务器是问题还是iOS。连接的其他操作系统使用相同的 application/x-www-form-urlencoded 作为其内容类型,没有问题。
【讨论】:
如果您需要 Swift ***.com/a/57476743/1470374,请查看我的回答,描述更通用的方式【参考方案2】:我建议将 Base64 字符串转换为 NSData
到 Nick Lockwood's Base64 class。
那个
NSData *dataForUrl = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
让我有点担心(在查看 Base64 是如何实现转换之后更担心)...
【讨论】:
我只是尝试写入文件并使用 NSInputStream,并尝试使用 [NSURLConnection sendSynchronousRequest:] 得到相同的结果。 “相同的结果”是什么意思?你试过 Base64 并产生与dataUsingEncoding:
相同的输出吗?
事实上,我真的不知道发生了什么。我认为可能使用dataUsingEncoding:
将您的NSString
(其中一部分是Base64 数据)转换为NSData
不是正确的方法。可能问题出在您发送的字符串中,也许您可以尝试发布其中的一部分...
在我的问题中添加了指向示例数据的链接。里面没有什么敏感的,所以没有修改。可以将base64部分转成jpg来查看原图。
服务器如何知道图像数据从哪里开始?您不应该对字符串的非 base64 部分进行 url 编码吗?以上是关于NSMutableURLRequest 发送部分帖子正文的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中使用“Body Requests”发送 NSMutableURLRequest 请求
NSMutableURLRequest 在大约 15 秒后超时。超时设置为 240 秒
如何使用 NSMutableURLRequest 请求查找上传到服务器的图像百分比
如何在注销期间取消所有 NSMutableURLRequest?