1

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 サービスに渡すと、同じ例外がスローされます。

誰かが同様の問題を経験し、解決策を知っていますか?

4

0 に答える 0