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?

NSMutableURLRequest 处理soap请求中的特殊字符

任何人都可以在这个 POST NSMutableURLRequest 到 PHP 脚本中找到错误吗?