2017-05-28 3 views
1

Es gibt eine Website von Drittanbietern, die HTTPS verwendet und bei der die Startseite beim Anmelden einen POST ausführt. Ich habe diese POST-Anfrage in meinem Browser überprüft und dann konnte ich die Anfrage manuell mit Fiddlers Composer erstellen. So konnte ich mich je nach Anmeldeinformationen entweder erfolgreich oder erfolglos bei Fiddler anmelden. Der Rückkehrcode ist immer 302, was entweder mit einer Umleitung (Kopf "Ort") zur Benutzerverwaltungsseite oder einer fehlgeschlagenen Anmeldungsseite einhergeht.POST-Anforderung von Retrofit funktioniert in unerwarteter Weise

Wenn ich jedoch diese Anforderung mithilfe der Retrofit-Bibliothek erstellen, funktioniert es nicht. Ich erhalte den Antwortcode 200, der in diesem speziellen Fall nicht als Erfolg gewertet werden soll.

Um die POST-Anfrage von Retrospect zu prüfen, habe ich sie an Fiddler (http://localhost:8888) anstatt an die URL des Drittanbieters weitergeleitet. Wenn ich diese Anfrage in den Composer kopiere und die URL als Drittanbieter anpasse, funktioniert die Anfrage. D.h., mit der von Retrofit erstellten Anfrage konnte ich nichts falsch finden.

Hat jemand eine Idee, was könnte falsch sein?

Mein Code ist in Kotlin geschrieben, sollte aber leicht verständlich sein, wenn Sie wissen, Java:

import okhttp3.ResponseBody 
import retrofit2.Call 
import retrofit2.Retrofit 
import retrofit2.http.* 

interface MyApi { 
    @POST("<relative login url>") 
    @FormUrlEncoded 
    @Headers(
     //... 
    ) 
    fun login(
     @Field("username") username: String, 
     @Field("password") password: String 
    ) : Call<ResponseBody>; 
} 

fun main(args: Array<String>) { 
    val baseUrl = "https://<url>" 
    val retrofit = Retrofit.Builder().baseUrl(baseUrl).build() 
    val myApi = retrofit.create(MyApi::class.java) 
    val code = myApi.login("<username>", "<password>").execute().code() 
    println(code) 
} 
+1

Ich denke, man Retrofit verwenden mit '' OkHttp'' die standardmäßig in hat ' 'followRedirects'' wird auf" true "gesetzt, daher erhalten Sie nie einen 302, da der Weiterleitung standardmäßig gefolgt wird. Eine einfache Möglichkeit, dies zu überprüfen, besteht darin, das Nachrüsten mit einem benutzerdefinierten "OkHttpClient" zu initialisieren, indem die Eigenschaften followRedirect auf false gesetzt werden. Es gibt 2, wenn ich mich nicht irre, auch für HTTP-Anfragen, wenn ich mich richtig erinnere. Probieren Sie es aus und lassen Sie es uns wissen. – Fred

+0

Funktioniert wie ein Charme! Du kannst deinen Kommentar als Antwort posten und ich werde ihn als korrekt akzeptieren. –

Antwort

1

Wie bereits in den Kommentaren erwähnt, aber es verständlicher auf andere machen auch hier eine Antwort geht.

Bei Verwendung von retrofit mit okhttp werden standardmäßig Weiterleitungen verwendet. Der Grund dafür ist, dass der Standardclient okhttp so eingestellt ist, dass er Redirects folgt. Deshalb erhalten Sie nie eine 302 - Die Weiterleitung wird automatisch gefolgt und Sie erhalten die 200 von der folgenden URL.

können Sie dieses Verhalten deaktivieren, indem Sie Ihre Retrofit-Instanz mit einem korrekt konfigurierten okhttp Client Aufbau:

OkHttpClient client = new OkHttpClient.Builder() 
      .followRedirects(false) 
      .followSslRedirects(false) 
      .build(); 

Retrofit retrofit = new Retrofit.Builder() 
      .client(client) 
      // other configurations for retrofit 
      .build(); 

Beachten Sie, dass wir hier eine Instanz von Retrofit mit einem Client konfigurieren nicht folgen Umleitungen erstellen. Dadurch erhalten Sie effektiv die 302 und andere Weiterleitungscodes.

(beachten Sie, dass ich nicht vollständig die Nachrüst-Instanz hier konfiguriert haben die Antwort im wichtigen Teil zu konzentrieren)

Verwandte Themen