Comment envoyer multipart/form-data avec de Rénovation?

Je veux envoyer un Article de et Android client à un REPOS serveur. Voici la Python modèle à partir du serveur:

class Article(models.Model):
    author = models.CharField(max_length=256, blank=False)
    photo = models.ImageField()

L'interface suivante décrit l'ancienne mise en œuvre:

@POST("/api/v1/articles/")
public Observable<CreateArticleResponse> createArticle(
        @Body Article article
);

Maintenant, je veux envoyer une image avec le Article de données. Le photo ne fait pas partie de la Article modèle sur le Android client.

@Multipart
@POST("/api/v1/articles/")
public Observable<CreateArticleResponse> createArticle(
        @Part("article") Article article,
        @Part("photo") TypedFile photo
);

L'API est préparé et testé avec succès avec cURL.

$ curl -vX POST http://localhost:8000/api/v1/articles/\
    -H "Content-Type: multipart/form-data" \
    -H "Accept:application/json" \
    -F "author=cURL" \
    -F "photo=@/home/user/Desktop/article-photo.png"

Quand j'ai envoyer des données à travers createArticle() de la Android client, je reçois une HTTP 400 statut indiquant que le les champs sont requis/manquant.

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

C'est ce qui est reçu comme request.data sur le côté serveur:

ipdb> print request.data  
  <QueryDict: {u'article': [u'{"author":"me"}'], \
  u'photo': [<TemporaryUploadedFile: IMG_1759215522.jpg \
  (multipart/form-data)>]}>

Comment convertir le Article objet dans un multipart conformes type de données? J'ai lu que Rénovation pourrait permettre d'utiliser Convertisseurs pour cela. Il devrait être quelque chose qui met en œuvre un retrofit.mime.TypedOutput que j'ai compris pour le la documentation.

Multipart les parties RestAdapter's converter ou ils peuvent mettre en œuvre TypedOutput de gérer leurs propres sérialisation.

Liées

  • N'est-il pas le TypedFile classe qui peut être utilisé pour cela?
  • Votre méthode semble bien se passer. Pourquoi ne pas activer la journalisation sur le RestAdapter et de vérifier exactement ce que les données sont envoyées.
  • Voulez-vous dire que je devrais utiliser TypedFile pour à la fois les données JSON (article) et l'image? Merci de m'indiquer comment faire pour convertir les données. / @corsair992 j'ai mis à jour mon post.
  • Êtes-vous sûr que vous avez besoin multipart demande? J'ai vu certains serveurs qui attend objet JSON en tant que corps POST avec l'image binaire des données publiées en tant que chaîne de caractères. Comme ceci: {"author":"authorNameHere","photo":"base64ImageBytesHere"]}. Si c'est le cas je peux fournir le code sur la façon de le faire avec Okio et de Rénovation.
  • Je viens de voir que vous avez de travail curl demande, pourriez-vous envoyer, s'il vous plaît?
  • J'ai ajouté la commande cURL. J'ai lu sur le base64 option, mais il se sent comme il doit être multipart/form-data ... merci de me convaincre si je me trompe.

InformationsquelleAutor JJD | 2015-04-16