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 œuvreTypedOutput
de gérer leurs propres sérialisation.
Liées
- La Spécification HTML 4.01 - soumission de Formulaire de type multipart/form-data
- Rénovation Type d'Annotation Partie de la documentation
- Téléchargement en plusieurs parties de l'image des données en JSON avec de Rénovation?
- RESTE - HTTP Post Multipart avec JSON
- Rénovation Multipart Télécharger l'Image a échoué
- Rénovation question n ° 178: Créer un manuel pour l'envoi de fichiers avec rénovation
- Rénovation question n ° 531: Problème de téléchargement de fichier via la POSTE/Multipart
- Rénovation question n ° 658: Pas en mesure d'envoyer des paramètres de la chaîne de l'image lors de l'utilisation de plusieurs parties
- Rénovation question n ° 662: Rénovation Forme Codée et en plusieurs parties dans une seule demande
- 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 êtremultipart/form-data
... merci de me convaincre si je me trompe.
Vous devez vous connecter pour publier un commentaire.
Selon votre demande curl vous essayez de créer qch comme ceci:
Avec la rénovation de l'adaptateur cette demande peut être créé de la manière suivante:
Utilisation:
Qui crée de sortie similaire:
La principale différence ici est que vous avez utilisé POJO
Article article
multipartie, param, qui, par défaut, est converti parConverter
en json. Et que votre serveur s'attend à chaîne simple à la place. Avec curl vous envoyezcURL
, pas{"author":"cURL"}
.Typed..
à la fois et de passer à l'API au lieu de sortir de chaque membre? Peut-être un convertisseur peut le faire?Le serveur s'attend à un "auteur" à la chaîne, mais que vous essayez de transmettre un "article" de l'objet. Passer "Chaîne de l'auteur" au lieu de "l'Article de l'article."
Aussi, je pense que le "pas de fichier soumis erreur" est un leurre, car le fichier est clairement présente dans votre demande.les données".