web-dev-qa-db-fra.com

HTTP GET avec corps de requête RETROFIT

J'utilise Retrofit pour passer des appels API dans mon application Android . Je dois soumettre un @Body of JSON.

@GET("api/")
void getData(@Body UserPostRequestBody request)

Je reçois un message d'erreur 

retrofit.RetrofitError: apiCall: Non-body HTTP method cannot contain @Body or @TypedOutput.

As-tu une idée?

19
user2026760

Pour envoyer des données avec votre Get Request, vous pouvez procéder comme suit:

//sending data as a url parameter
@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId);

comme indiqué dans ce SO answer , la sémantique de serveur pour GET est toutefois limitée de sorte qu'un corps, s'il en existe un, n'a pas de signification sémantique pour la requête - Roy Fielding.

9
harshitpthk

La définition de GET telle qu’expliquée ici dans cette réponse explique qu’un corps n’est pas censé avoir un sens, donc la modification ne vous permet pas d’ajouter un corps. Cela dit, il n’est pas vrai qu’un serveur DOIT suivre ce format. Il est tout à fait possible qu'un serveur ait un point d'extrémité GET qui prend non seulement, mais EXIGE un corps. Ce serait une "mauvaise" architecture, mais il semble un peu ridicule pour Retrofit de limiter ce que la bibliothèque peut faire inutilement.

En outre, les différentes méthodes HTTP ont des définitions différentes de ce qu’elles sont censées faire. Par exemple, un GET obtient des informations, un POST crée une nouvelle entrée/un objet en fournissant des informations au serveur, un PUT met à jour une entrée/un objet existant, etc. Le problème est que le moyen le plus simple de transmettre des données complexes au serveur , en particulier lors de l’utilisation de la modification, consiste à utiliser JSON. Ainsi, le moyen idéal pour obtenir des informations du serveur tout en fournissant un filtre complexe serait d'envoyer un corps JSON avec la demande GET. Malheureusement, il n’existe pas de méthode de requête HTTP permettant cela sous la spécification.

7
Guybrush

Cette erreur se produit également lorsque l'API requiert @POST et que vous utilisez @GET. 

0
satyender