Avant de poster cette question ici, j'ai essayé d'ajouter la méthode d'interface @Multipart
Ci-dessus Et la recherche dans stackoverflow ne trouve toujours pas de problème avec mon problème.
Dans ce cas, j'essaie d'envoyer une image en utilisant TypedFile
au serveur. Ma méthode d'interface ressemble à ceci:
@Headers({"Content-type: application/json"})
@POST("/user/change")
void postChange(@Query("name") String name, @Query("email") String email, @Query("password") String password, @Query("phone") String phone, @Query("user_id") String userId, @Query("address[]") String[] listAddress, @Query("head[]") String[] head, @Part("photo_profile") TypedFile photoProfile, @Body TypedInput jsonObject, Callback<ReceiveDTO> callback);
MODIFIER
Dans cette méthode, nous pouvons voir @Part
Et @Body
. Si j'ajoute @Multipart
Au-dessus de la méthode, cela provoquera une erreur @Body parameters cannot be used with form or multi-part encoding. (parameter #9)
J'utilise Retrofit 1.9
Pour toute personne ayant le même problème, assurez-vous d'ajouter l'annotation @Multipart au-dessus de votre @ POST/@ PUT. J'ai eu la même erreur et mon problème était simplement que cette annotation me manquait
Nous utilisons @ Query uniquement avec Get
Request et en fait @ Query ajouter des paramètres à la fin de l'URL, voir Document exemples.
Si vous devez envoyer un profil utilisateur au serveur, utilisez MultiPart
:
Les pièces en plusieurs parties utilisent l'un des convertisseurs de Retrofit ou peuvent implémenter RequestBody pour gérer leur propre sérialisation.
Par exemple, dans le morceau de code suivant, nous pouvons envoyer une photo de profil avec une description au serveur:
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
Vous pouvez même ajouter d'autres attributs supplémentaires avec @Part. Voir l'exemple complet ici qui explique étape par étape comment procéder.
Edit : Comme l'explique JackWarthon ici , le @ Body l'annotation définit un seul corps de requête.
interface Foo {
@POST("/jayson")
FooResponse postJson(@Body FooRequest body);
}