it-swarm.com.de

HTTP GET mit dem Request Body RETROFIT

Ich benutze Retrofit, um API-Aufrufe in meiner Android-Anwendung zu tätigen ... Ich muss einen @Body von JSON einreichen

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

Ich bekomme eine Fehlermeldung 

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

Hast du eine Idee?

19
user2026760

Um Daten zusammen mit Ihrem Get Request zu senden, haben Sie folgende Möglichkeiten:

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

wie in dieser SO Antwort gesagt, sind Serversemantiken für GET jedoch so eingeschränkt, dass ein Körper, falls vorhanden, keine semantische Bedeutung für die Anforderung Roy Fielding hat.

9
harshitpthk

Die Definition von GET, wie in dieser Antwort hier erklärt, erklärt, dass ein Körper nichts bedeuten soll. Retrofit erlaubt also nicht, einen Körper hinzuzufügen. Das heißt, es ist nicht wahr, dass ein Server diesem Format folgen muss. Es ist durchaus möglich, dass ein Server über einen GET-Endpunkt verfügt, der nicht nur einen Body benötigt, sondern auch einen Body erfordert. Es wäre eine "schlechte" Architektur, aber es scheint ein bisschen dumm für Retrofit, die Möglichkeiten der Bibliothek einzuschränken.

Darüber hinaus haben die verschiedenen HTTP-Methoden unterschiedliche Definitionen für das, was sie tun sollen. Zum Beispiel erhält ein GET Informationen, ein POST erstellt einen neuen Eintrag/ein neues Objekt, indem er Informationen an den Server übermittelt, ein PUT aktualisiert einen vorhandenen Eintrag/ein Objekt usw. Insbesondere bei der Nachrüstung wird mit JSON gearbeitet. Der ideale Weg, um Informationen vom Server abzurufen, während ein komplexer Filter bereitgestellt wird, wäre das Senden eines JSON-Body mit der GET-Anforderung. Leider gibt es keine HTTP-Anforderungsmethode, die dies unter der Spezifikation erlaubt.

7
Guybrush

Dieser Fehler tritt auch auf, wenn die API @POST erfordert und Sie @GET verwenden 

0
satyender