iOS アプリを既存の Grails バックエンド サーバーに接続しようとしています。バックエンドは、grails リモート処理プラグイン (バージョン 1.3) を使用して、ヘシアン Web サービスを公開します。私の Android アプリは、すべての Web サービス メソッドを正常に呼び出します。
私の目標は、電話からサーバーに jpeg 画像を送信することです (Android アプリで動作します)。私のアプローチは、JSONKit で JSON オブジェクトを作成し、画像を base64 でエンコードされた文字列として含めることです。iOS 4.2 をターゲットとする ARC と Base64 エンコーディング用の Nick Lockwood の NSData+Base64 カテゴリ (https://github.com/nicklockwood/Base64) を使用する XCode 4 プロジェクトで HessianKit を使用しています。
これが私のコードです:
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 プロトコルのみをサポートしているのに、remoting 1.3 に同梱されている hessian バージョンが 4.0.7 であることにあるのではないかと思います。4.0.7 はおそらく Hessian 2 プロトコルを使用しており、下位互換性がありません。しかし、それは単なる推測です。
編集: 実際、この問題は JSON とは何の関係もありません。文字列を通常の文字列 (JSON に埋め込まれていない) として Web サービスに渡すと、同じ例外がスローされます。
誰かが同様の問題を経験し、解決策を知っていますか?