Отправка UIImage в веб-службу, которая принимает только JSON (через RestKit)

У меня возникли проблемы с отправкой объекта UIImage в мою веб-службу REST, которая принимает только JSON в качестве входных данных. У меня все сопоставления объектов настроены, и он отлично работает для генерации JSON, пока не доберется до любого UIImages.

Я прочитал эту страницу о загрузке изображения отдельно: https://github.com/RestKit/RestKit/wiki/Attach-a-File-to-an-RKObjectLoader, но это всегда меняет тип содержимого с application/json на application/xxx-form-url-encoded ( или что это такое).

Итак, как лучше всего это сделать без использования RKParams?

Я нашел еще одну ссылку здесь: https://groups.google.com/forum/#!msg/restkit/QcTPucXXn4o/41IcKDCeoGAJ, в котором говорилось о более ранней версии RestKit, где вы могли использовать propertiesForSerialization из протокола RKObjectMappable, но этот протокол и метод больше не доступны в 0.10.0.

Есть ли в новой версии какой-то способ, который позволит вам заменить содержимое UIImage данными, закодированными в base64 (следовательно, безопасным для JSON), прежде чем пытаться его сериализовать?

Или есть другие решения? Любая помощь приветствуется. Спасибо


person valheru    schedule 26.04.2012    source источник


Ответы (3)


Я сделал это с помощью RestKit, сохранив в свойстве «imageData» и закодировав изображение в base64.

Однако это не очень хорошо для CoreData, поэтому вместо этого я написал так, чтобы при получении изображений с сервера (закодированных в base64) он сохранял изображение на диск, а затем вместо этого сохранял путь в Core Data. Затем при отправке изображения на сервер он находит файл на диске, кодирует его в base64, а затем включает его в JSON.

Это не идеальный метод, но если вы не часто отправляете изображения туда и обратно, он работает довольно хорошо.

person Evan Cordell    schedule 27.04.2012
comment
Хорошая отличная идея. Так как же найти файл на диске и закодировать его в base64? Это все только что сделано до того, как вы вызовете postObject, а postObject просто знает, что нужно использовать поле imageData? - person valheru; 30.04.2012
comment
Я добавил метод willSave в управляемый объект. В основном у меня есть свойство imagePath на моем объекте. RestKit сопоставляет закодированные данные изображения с imagePath, но затем в willSave я перехватываю данные, сохраняю их на диск, а затем сохраняю путь к изображению вместо самих данных изображения в imagePath. Это помогает? - person Evan Cordell; 04.05.2012

Вы пытались использовать RKParams и просто изменить свой тип сериализацииMIMEType?

    RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];;
    objectManager.serializationMIMEType = RKMIMETypeJSON;
person Paul Cezanne    schedule 27.04.2012
comment
да. Кажется, что RKParams переопределяет любые настройки диспетчера объектов с кодировкой multipart/form. это очень раздражает. - person valheru; 27.04.2012

Ну, я придумал один способ сделать это.

В итоге я создал дополнительное свойство NSString для каждого UIImage, и это то, что я использую для сопоставления вместо фактического UIImage. Затем, прежде чем отправлять объект, я генерирую код base64 для каждого изображения и соответствующим образом заполняю свойства NSString.

Не лучший способ, и все же любопытно посмотреть, что придумают другие.

person valheru    schedule 27.04.2012