2016-08-08 6 views
1

Ich versuche, die Header einer Antwort von einem API-Aufruf über Retrofit 2.0.2 zu überprüfen, bevor Sie den Inhalt tatsächlich herunterladen.Wie bekomme ich einen HEAD eines Retrofit-Aufrufs von einem API-Endpunkt, der ein Feld im Anfragetext benötigt?

Meine API-Schnittstelle sieht wie folgt aus:

@Headers({"Accept: application/json", "Origin: http://www.example.com"}) 
@HEAD("profiles") 
Call<Void> getProfileHeaders(@Field("puids") String puid); 

Bitte beachten Sie, dass der API-Aufruf mich im Körper ein Feld puids=%{UUID} Liste von UUIDs, um eine Antwort zurück genannt angeben erfordert.

Wenn ich ohne die Daten herunterladen möchte zunächst die Header zu untersuchen, ich würde das eine Schnittstelle wie einfach anrufen:

@Headers({"Accept: application/json", "Origin: http://www.example.com"}) 
@FormUrlEncoded 
@POST("profiles") 
Call<String> getProfile(@Field("puids") String puid); 

Nun ist das Problem, dass, wenn ich den getProfileHeader() Endpunkt zu verwenden versuchen, erhalte ich die folgende Runtime:

java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1) 

um die @Field Parameter verwenden (wie ich eine POST-Methode nehme normalerweise bei Bedarf tun würde, wäre), würde ich explizit müssen angeben, dass ich @FormUrlEncoded verwenden, aber ich kann nicht mach eine @HEAD ruf damit an.

Ich bin ein wenig verwirrt, wie könnte ich erreichen, was ich will und was vermisse ich?

Grundsätzlich würde ich gerne wissen, wie kann ich die Antwort-Header eines Retrofit-Aufrufs überprüfen, bevor Sie den tatsächlichen Körper eines API-Endpunkts herunterladen, der Feldparameter benötigt?

Prost!

Antwort

1

Ok, ich erkannte, dass meine Verwirrung von ein paar Missverständnisse stammt:

  1. @HEAD ist eine HTTP-Methode in der Regel die Hyperlinks Gültigkeit und die Antwort des Servers auf einen GET Anruf zu überprüfen. Es funktioniert nicht mit POST Anfrage und es ist theoretisch falsch.

von RFC2616 der HTTP/1.1 Definitionen Genommen:

Die HEAD-Methode ist identisch mit der Ausnahme, dass der Server darf nicht in der Antwort return einen Message-Körper zu bekommen. Die Metainformation enthielt in den HTTP-Headern als Antwort auf eine HEAD-Anfrage SOLLTE identisch sein mit den Informationen als Antwort auf eine GET-Anfrage gesendet werden. Diese Methode kann verwendet werden, um Metainformationen über die Entität zu erhalten, die durch die Anfrage impliziert wird, ohne den Entity-Body selbst zu übertragen. Diese Methode wird oft zum Testen von Hypertext-Links für die Gültigkeit, Zugänglichkeit, und jüngste Änderung verwendet.

Die Antwort auf eine HEAD-Anforderung kann im Sinne Cache gespeichert werden, dass die Informationen in der Antwort enthalten ist, kann eine zuvor zwischengespeicherte Entität von dieser Ressource zu aktualisieren, verwendet werden. Wenn die neuen Feldwerte angeben, dass sich die zwischengespeicherte Entität von der aktuellen Entität unterscheidet (da durch eine Änderung in Content-Length, Content-MD5, ETag oder Last-Modified angezeigt wird), muss der Cache den Cache-Eintrag behandeln als abgestanden.

  1. Wenn eine POST Anfrage per definitionem machen wir bereits die Antwort serverseitige berechnet und die Zeit genommen, um den Körper in Betracht zum Download bereit.

eine der Funktions der des POST Verfahren, wie es in RFC2616 definiert ist:

  • Bereitstellen eines Blocks von Daten, wie beispielsweise das Ergebnis eines Formulars, an einen Datenhandhabungs verarbeiten;

daher den Header, um die Überprüfung nicht den Körper lade schlägt den Zweck dieses.


Wie oben durch @Radek erwähnt, Abfangjäger auf GET Anfrage mit zu modifizieren und/oder im laufenden Anfragen untersuchen würde die Arbeit machen, aber an diesem Punkt könnten wir initiieren auch eine HEAD Methode Anfrage.

Die Lösung für dieses Problem in RFC2616 definiert wäre, um besser auf die Standarddefinitionen auszurichten, indem Änderungen auf der Server-Seite anstelle dem Zurückbringen Block von Rohdaten als Post-Antwort zu machen, macht es eine Ressource zurück, das wäre dann in einer GET/HEAD Anfrage angerufen. Alle refactored den Serviceanruf, um GET anstelle von POST zu verwenden.

1

Okhttp, das von Retrofit verwendet wird, verfügt über Interceptors, mit denen Sie Anforderungen während des Betriebs ändern oder untersuchen können. Schauen Sie sich die github documentation

Verwandte Themen