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)
}
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
Funktioniert wie ein Charme! Du kannst deinen Kommentar als Antwort posten und ich werde ihn als korrekt akzeptieren. –