Сериализация строки Base64 в полезной нагрузке JSON с помощью HessianKit (Objective-C/Cocoa)
Я пытаюсь подключить свое iOS-приложение к существующему внутреннему серверу Grails. Бэкэнд предоставляет гессенский веб-сервис с помощью плагина удаленного взаимодействия Grails (версия 1.3). Мое приложение для Android успешно вызывает все методы веб-сервиса.
Моя цель - передать изображение jpeg с телефона на сервер (работает с приложением Android). Мой подход состоит в том, чтобы создать объект JSON с помощью JSONKit и включить изображение в виде строки в кодировке base64. Я использую HessianKit в проекте XCode 4 с ARC для iOS 4.2 и категориями Ника Локвуда 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, но версия гессиана, поставляемая с remoting 1.3, - это 4.0.7. 4.0.7, вероятно, использует протокол Hessian 2 и не совместим в обратном направлении. Но это только предположение.
РЕДАКТИРОВАТЬ: На самом деле, проблема не имеет ничего общего с JSON. Такое же исключение выдается, когда я просто передаю строку как обычную строку (а не встроенную в JSON) в веб-сервис.
Кто-нибудь сталкивался с подобной проблемой и знает решение?