Я хочу отправить статью и клиент Android на сервер REST. Вот модель Python с сервера:
class Article(models.Model):
author = models.CharField(max_length=256, blank=False)
photo = models.ImageField()
Следующий интерфейс описывает предыдущую реализацию:
@POST("/api/v1/articles/")
public Observable<CreateArticleResponse> createArticle(
@Body Article article
);
Теперь я хочу отправить изображение с данными Статьи. photo
не является частью модели статьи на клиенте Android.
@Multipart
@POST("/api/v1/articles/")
public Observable<CreateArticleResponse> createArticle(
@Part("article") Article article,
@Part("photo") TypedFile photo
);
API подготовлен и успешно протестирован с помощью cURL.
$ curl -vX POST http://localhost:8000/api/v1/articles/ \
-H "Content-Type: multipart/form-data" \
-H "Accept:application/json" \
-F "author=cURL" \
-F "[email protected]/home/user/Desktop/article-photo.png"
Когда я отправляю данные через createArticle()
из клиента Android, я получаю статус HTTP 400
, указывающий, что поля обязательны/отсутствуют.
D <--- HTTP 400 http://192.168.1.1/articles/ (2670ms)
D Date: Mon, 20 Apr 2015 12:00:00 GMT
D Server: WSGIServer/0.1 Python/2.7.8
D Vary: Accept, Cookie
D X-Frame-Options: SAMEORIGIN
D Content-Type: application/json
D Allow: GET, POST, HEAD, OPTIONS
D OkHttp-Selected-Protocol: http/1.0
D OkHttp-Sent-Millis: 1429545450469
D OkHttp-Received-Millis: 1429545453120
D {"author":["This field is required."],"photo":["No file was submitted."]}
D <--- END HTTP (166-byte body)
E 400 BAD REQUEST
Это то, что получено как request.data
на стороне сервера:
ipdb> print request.data
<QueryDict: {u'article': [u'{"author":"me"}'], \
u'photo': [<TemporaryUploadedFile: IMG_1759215522.jpg \
(multipart/form-data)>]}>
Как преобразовать объект Article в тип данных, совместимый с multipart? Я читал, что Retrofit может позволить использовать Converters для этого. Это должно быть то, что реализует retrofit.mime.TypedOutput
, насколько я понял для документации.
Многостраничные части используют преобразователь
RestAdapter
, или они могут реализоватьTypedOutput
для обработки своей собственной сериализации.
Связанные
- HTML 4.01 Спецификация - представление формы - данные о multipart/form
- Модернизация Тип аннотации Документация по формату
- Загрузка данных мультифайлового изображения в JSON с помощью Retrofit?
- REST - HTTP-сообщение с многопользовательским сообщением с JSON
- Не удалось загрузить изображение с несколькими путями
- Проблема с обновлением # 178: создайте руководство для отправки файлов с модификацией
- Проблема с обновлением # 531: проблема загрузки файла через POST/Multipart
- Проблема с обновлением # 658: Не удается отправить строковые параметры с изображением при использовании Multipart
- Проблема с обновлением # 662: переформатированная форма с кодировкой и многостраничным соединением в одном запросе