我正在尝试将我的 iOS 应用程序连接到现有的 Grails 后端服务器。后端通过使用 grails 远程处理插件(1.3 版)公开了一个 hessian 网络服务。我的 Android 应用程序成功调用了所有 web 服务方法。
我的目标是将 jpeg 图像从手机传输到服务器(适用于 Android 应用程序)。我的方法是使用 JSONKit 创建一个 JSON 对象,并将图像作为 base64 编码字符串包含在内。我在 XCode 4 项目中使用 HessianKit,ARC 针对 iOS 4.2 和 Nick Lockwood 的 NSData+Base64 类别用于 Base64 编码 (https://github.com/nicklockwood/Base64)。
这是我的代码:
NSMutableDictionary *jsonPayload = [NSMutableDictionary dictionary];
[jsonPayload setObject:[theImage base64EncodedString] forKey:@"photo"];
NSString* jsonString = [jsonPayload JSONString];
NSURL* url = server_URL;
id<BasicAPI> proxy = (id<BasicAPI>)[CWHessianConnection proxyWithURL:url protocol:@protocol(BasicAPI)];
[proxy addImage:jsonString];
问题是服务器在被应用调用时会抛出一个期望:
threw exception [Hessian skeleton invocation failed; nested exception is com.caucho.hessian.io.HessianProtocolException: addImage__1: expected string at 0x7b ({)] with root cause
Message: addImage__1: expected string at 0x7b ({)
Line | Method
->> 1695 | error in com.caucho.hessian.io.HessianInput
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 1681 | expect in ''
| 1473 | parseChar in ''
| 792 | readString in ''
| 181 | readObject in com.caucho.hessian.io.BasicDeserializer
| 1078 | readObject in com.caucho.hessian.io.HessianInput
| 300 | invoke . . in com.caucho.hessian.server.HessianSkeleton
| 221 | invoke in ''
| 886 | runTask . in java.util.concurrent.ThreadPoolExecutor$Worker
| 908 | run in ''
^ 680 | run . . . in java.lang.Thread
我的应用程序中的所有其他 JSON 有效负载(字符串、日期、数字等)都可以由服务器反序列化而没有任何问题,反之亦然,即将 base64 编码图像作为 json 有效负载从服务器作为响应发送到应用程序也有效。
在花了几个小时阅读错误报告和邮件列表之后,我怀疑问题可能是 HessianKit 仅支持 Hessian 1 协议,但远程处理 1.3 附带的 hessian 版本是 4.0.7。4.0.7 可能使用 Hessian 2 协议并且不向后兼容。但这只是猜测。
编辑:实际上,这个问题与 JSON 无关。当我将字符串作为普通字符串(而不是嵌入在 JSON 中)传递给 Web 服务时,也会引发相同的异常。
有人遇到过类似的问题并知道解决方案吗?