Wie kann man verhindern, dass Retrofit automatisch einem 302 folgt

Ich habe einen Authentifizierungsaufruf, den ich versuche, mit Retrofit auf Android zu machen. Der Anruf gibt eine 302 entweder auf eine Erfolgs- oder Fehlerseite zurück. Die ursprüngliche Antwort von 302 bringt ein Session-Cookie zurück, das benötigt wird, um die Authentifizierung auf Erfolg zu behalten, aber Retrofit übergibt die Anfrage automatisch an die Redirect-URL, bevor ich eine Chance bekomme, das Cookie zu verbrauchen.

Gibt es eine Möglichkeit, das Umleiten zu verhindern? Oder gibt es eine Möglichkeit, einen Response-Handler auf Retrofit zu schreiben, der den entsprechenden Header hinzufügen kann, bevor er den zweiten Anruf macht?

  • Soll ich OkHttp mit Volley-Bibliothek benutzen?
  • Okhttp refresh abgelaufenes Token, wenn mehrere Anfragen an den Server gesendet werden
  • Nachrüsten Sie den benutzerdefinierten Client für die WebTokens-Authentifizierung
  • Handhabung der Authentifizierung in Okhttp
  • Hochladen der dynamischen Anzahl von Dateien mit okHttp3
  • Wie kann ich die Aktualisierung der Cache-Route bei der nächsten Anfrage mit Retrofit und OKHttp ungültig machen?
  • Android OkHttp mit Standardauthentifizierung
  • Wie Retrofit mit OKHttp Cache-Daten verwenden, wenn offline
  • 5 Solutions collect form web for “Wie kann man verhindern, dass Retrofit automatisch einem 302 folgt”

    Um die Umleitung zu verhindern, musst du deinen Client konfigurieren, zB mit OkHttp 2:

    private sendRequest() { OkHttpClient client = new OkHttpClient(); client.setFollowRedirects(false); connectAdapter = new RestAdapter.Builder() .setClient(new OkClient(client)) .setEndpoint("http://yourendpoint") .setLogLevel(RestAdapter.LogLevel.FULL) .build(); connectAdapter.create(YourRequest.class).sendMyRequest("login","password"); } 

    Mit OKHTTP 3 (Sie können diese Antwort von @gropapa lesen):

     OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.followRedirects(false); OkHttpClient httpClient = builder.build(); 

    Ich weiß, das ist eine alte Post, vielleicht wird es immer noch für jemanden helfen. Ich habe ein ähnliches Problem, meine Lösung war, eine redirectStrategy ( http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html ) zu httpClient hinzuzufügen:

     private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder() .setEndpoint(HTTP_TEST_URL) .setClient(new ApacheClient(HttpClients.custom() .setRedirectStrategy(new RedirectStrategy() { @Override public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { return response.getStatusLine().getStatusCode() == 302; } @Override public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { //String cookieValue = response.getFirstHeader("Set-Cookie").getValue(); String location = response.getFirstHeader("location").getValue(); HttpUriRequest request_= new HttpGet(location); return request_; }}).build())) .build(); 

    Damit kann ich Zugang zu einer (privaten) URL bekommen. Ich denke, die Cookie-Daten wurden automatisch hinzugefügt. Vielleicht solltest du die getRedirect (), isRedirected () – Funktionen umschreiben, um deine speziellen Bedürfnisse zu übergeben.

    Event, wenn die Post ist sehr alt, hier ist meine Antwort mit OkHttp 3 nur den Builder als die folgenden verwenden

     OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.followRedirects(false); OkHttpClient httpClient = builder.build(); 

    In einem Response-Objekt (ich benutze Retrofit eigentlich), findest du die Umleitung url in

     response.headers.get("Location") 

    Hoffe das hilft

    Ich war in einer ähnlichen Situation zu deinem. Grundsätzlich ist alles, was wir brauchen, um den "Set-Cookie" -Header zu erfassen, den dein Server vor der Umleitung zurückgibt. So habe ich es mit OkHTTP behandelt:

     final OkHttpClient client = new OkHttpClient(); CookieHandler handler = client.getCookieHandler(); CookieManager manager = new CookieManager(); handler.setDefault(manager); //boilerplate: RequestBody formData = new FormEncodingBuilder() .add("req_username", username) .add("req_password", password).build(); Request request = new Request.Builder().url(LOGIN_URL).post(formData).build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); // print our cookies: List <HttpCookie> cookies = manager.getCookieStore().getCookies(); for(HttpCookie cookie : cookies) { Log.v(TAG, cookie.getName() + "=" + cookie.getValue()); } 

    Ich habe meine vorherige Antwort bearbeitet, da du dich am ehesten mit einem POST / PUT bearbeite, wenn du deine Anmelde-Rest-API anrufst und OkHttp jede Nicht-GET- oder HEAD-Anfrage in eine GET-Anfrage umwandelt, bevor du umgeleitet hast, was wohl nicht für dich funktionieren würde.

    Derzeit ist das Merkmal der Deaktivierung von Umleitungen von OkHttp fehl, aber ich habe eine Pull-Anfrage für sie eingereicht. Wenn und wann diese Pull-Anforderung akzeptiert wird, sollte es Ihnen erlauben, die Umleitung zu deaktivieren, die Ihnen die Möglichkeit gibt, mit diesem Gebrauchsfall auf eigene Faust für die Zeit zu beschäftigen.

    Hier ist die Pull-Anforderung https://github.com/square/okhttp/pull/944

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.