2017-11-20 2 views
1

Ich habe eine Web-Service-Methode namens . Ich schicke UpdateStatusRequest Objekte zu diesem Web-Dienst, der wie unten definiert:Retrofit2: Verwendung Körper vs Abfrage

public class UpdateStatusRequest { 

    private String Status; 

    public UpdateStatusRequest(String status) { 
     Status = status; 
    } 
    public String getStatus() { 
     return Status; 
    } 
} 

Wenn ich unter API Verzögerung verwenden:

@POST("StatusUpdate") 
Call<Status> change(@Query("Status") String status); 

und dann statusApi.change(request.getStatus()) Aufruf, es funktioniert gut. Es wird http://server-url/StatusUpdate?Status=Ready aufrufen, wenn ich Ready als Status übergebe.

Aber mit folgenden Erklärung

@POST("StatusUpdate") 
Call<Status> change(@Body UpdateStatusRequest status); 

und dann statusApi.change(request) ruft, wird es http://server-url/StatusUpdate rufen und sendet Status in Anfrage Körper. Dies führt zu 404 Statuscode mit Fehleraufforderung Not Found.

Ich möchte wissen, was ist falsch mit meinem zweiten Anruf (seit ich vermutete @Body wirkt wie mehrere @Query Parameter, die im selben Objekt gebündelt)?

+0

Erhält Ihr Dienst POST oder GET? – diegoveloper

+0

'@ Body' verhält sich nicht wie mehrere '@ Query'-Parameter. Dies sind zwei verschiedene Arten, Daten zu senden, und es sieht so aus, als ob die von Ihnen verwendete API erwartet, dass sie im letzteren Format vorliegen ('@ Query'). –

+0

@diegoveloper Es empfängt POST-Anfrage. – VSB

Antwort

0

@Body verhält sich nicht wie mehrere @Query Parameter. Dies sind zwei verschiedene Möglichkeiten, Daten in einer Anfrage zu senden.

Die Unterschiede sind in Ihrer Frage ziemlich genau beschrieben. Mit @Query wird die URL an die von Ihnen übergebenen Abfrageparameter angehängt, wie in http://server-url/StatusUpdate?Status=Ready. Wenn Sie stattdessen @Body verwenden, werden die Parameter der Textkörperanforderung hinzugefügt, sodass Ihre URL keine Parameter hat, wie in http://server-url/StatusUpdate, und Ihre Textkörperanforderung lautet Status=Ready.

Basierend auf den Ergebnissen erwartet Ihr Server, dass die Parameter in der URL (@Query) übergeben werden.

1

Im Nachrüstsatz @Body ist nicht dasselbe wie @Query.

  • @Body - Sendet Java-Objekte als Anfragetext.
  • @Query - Abfrageparameter an die URL angehängt. null Werte werden ignoriert.

Aber @Field ist ähnlich wie @Body Tag.

  • @Field - Senden Sie Daten als Form-Urlencodiert. Der Parameter @Field funktioniert nur mit einem POST.

Beispiel:

@POST("StatusUpdate") 
Call<Status> change(@Field("Status") String Status); 

Aber in Ihrem Fall Ihr Server erwartet die params in die URL(@Query) weitergegeben werden.

Ich hoffe, diese Erklärung hilft.

+0

Gibt es Möglichkeiten, alle Felder eines Objekts als separate Parameter zu senden (wie zum Beispiel, was '@ Body' mit einem Objekt tut, sondern als ein Bündel von Abfrageparametern)? – VSB

+0

Ja, übergeben Sie die Menge der Abfrageparameter, die Sie @Field verwenden können. like (Call register (@Field ("userName") String Benutzername, @Field ("Passwort") String Passwort);) –