2014-06-09 8 views
11

Ich habe einen Authentifizierungsanruf, den ich versuche, mit Retrofit auf Android zu machen. Der Aufruf gibt 302 an eine Erfolgs- oder Fehlschlagseite zurück. Die ursprüngliche Antwort von 302 bringt einen Sitzungscookie zurück, der benötigt wird, um die Authentifizierung bei Erfolg aufrecht zu erhalten, jedoch übergibt Retrofit die Anfrage automatisch an die Weiterleitungs-URL, bevor ich eine Chance habe, den Cookie zu konsumieren.Wie verhindern Sie, dass Retrofit automatisch einem 302

Gibt es eine Möglichkeit, die Weiterleitung zu verhindern? Oder gibt es eine Möglichkeit, einen Antworthandler für Retrofit zu schreiben, der vor dem zweiten Aufruf den entsprechenden Header hinzufügen kann?

Antwort

0

Ich war in einer ähnlichen Situation wie Ihre. Im Grunde genommen müssen wir nur den Header "Set-Cookie" erfassen, den der Server vor der Weiterleitung zurückgibt. Dies ist, wie ich behandelt es mit OkHTTP:

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()); 
} 
0

ich meine Antwort bearbeitet haben, da Sie höchstwahrscheinlich eine POST/PUT, wenn Ihr Login Rest api Aufruf und OkHttp wandelt jede nicht GET oder HEAD-Anforderung in eine GET-Anfrage vor der Weiterleitung, die wahrscheinlich nicht für Sie arbeiten würde.

Momentan fehlt die Funktion zur Deaktivierung von Weiterleitungen von OkHttp, aber ich habe eine Pull-Anfrage für sie eingereicht. Wenn und wenn diese Pull-Anforderung akzeptiert wird, sollte es Ihnen ermöglichen, die Weiterleitung zu deaktivieren, wodurch Sie die Möglichkeit erhalten, diesen Anwendungsfall vorerst selbst zu bearbeiten.

Hier ist der Pull-Request https://github.com/square/okhttp/pull/944

2

Ich weiß, dass dies eine alte Post, vielleicht wird es noch für jemand helfen. Ich habe ein ähnliches Problem, war meine Lösung 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 jedem (privat) url bekommen. Ich finde die Cookie-Daten automatisch hinzugefügt. Vielleicht sollten Sie die Funktionen getRedirect(), isRedirected() neu schreiben, um Ihre speziellen Bedürfnisse zu erfüllen.

+0

Und Recht Abhängigkeit zu Ihren App hinzufügen erinnern: https: // hc .apache.org/httpcomponents-client-4.3.x/android-port.html. –

6

zu verhindern, dass die Umleitung Sie Ihren Kunden 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 answer von @gropapa lesen):

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

Dies verursacht Retrofit, einen Fehler zu werfen, anstatt eine Antwort zurückzugeben, die eine 303 hat. Ist das erwartetes Verhalten? –

+0

Ich weiß nicht, in meinem Fall war das Problem eine Umleitung, die auf einem 302 aufgetreten ist. Kein Fehler wurde ausgelöst. Welche Art von Fehler wirft Retrofit in Ihrem Fall auf? – Climbatize

+0

Hey, ich weiß nicht, ob es immer noch relevant ist, aber Sie können einen Versuch hinzufügen fangen und lesen Sie die Antwort von der Ausnahme.Sauen, bis es eine andere Möglichkeit gibt, Redirects nicht zu folgen, aber trotzdem die Antwort zu lesen, können Sie es mit dem Versuch fangen. – neristance

2

Ereignis, wenn der Beitrag ist sehr alt, hier ist meine Antwort mit OkHttp 3 verwenden Sie einfach den Builder wie folgt

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

in einem Response-Objekt (I Retrofit tatsächlich nutzen), werden Sie die Umleitungs-URL in

response.headers.get("Location") 

Hoffnung finden, das hilft

Verwandte Themen