1

我正在尝试将我的 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 服务时,也会引发相同的异常。

有人遇到过类似的问题并知道解决方案吗?

4

0 回答 0