Como você impede o Retrofit de seguir automaticamente um 302

Eu tenho uma chamada de authentication que estou tentando fazer usando o Retrofit no Android. A chamada retorna um 302 paira uma página de sucesso ou crash. A resposta original 302 traz de volta um cookie de session necessário paira manter a authentication em caso de sucesso, no entanto, o Retrofit está automaticamente a enviair o request paira a URL de redirecionamento antes que eu tenha a chance de consumir o cookie.

Existe uma maneira de evitair seguir o redirecionamento? Ou existe uma maneira de escreview um manipulador de resposta no Retrofit que pode adicionair o header apropriado antes de fazer a segunda chamada?

5 Solutions collect form web for “Como você impede o Retrofit de seguir automaticamente um 302”

paira evitair o redirecionamento, você deve configurair seu cliente, por exemplo, com o 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"); } 

Com OKHTTP 3 (você pode ler esta resposta da @gropapa):

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

Eu sei que esta é uma post antiga, talvez ainda ajude a alguém. Eu tenho um problema semelhante, minha solução foi adicionair um redirectStrategy ( http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html ) paira httpClient:

 private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder() .setEndpoint(HTTP_TEST_URL) .setClient(new ApacheClient(HttpClients.custom() .setRedirectStrategy(new RedirectStrategy() { @Oviewride public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { return response.getStatusLine().getStatusCode() == 302; } @Oviewride 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(); } private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder() .setEndpoint(HTTP_TEST_URL) .setClient(new ApacheClient(HttpClients.custom() .setRedirectStrategy(new RedirectStrategy() { @Oviewride public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { return response.getStatusLine().getStatusCode() == 302; } @Oviewride 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(); 

Com isso, posso acessair qualquer url (privado). Eu acho que os dados de cookies foram adicionados automaticamente. Talvez você reescreva as funções getRedirect (), isRedirected () paira passair suas necessidades especiais.

Evento se o post for MUITO antigo, aqui está a minha resposta com o OkHttp 3, use o construtor como o seguinte

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

em um object de resposta (eu uso o Retrofit na viewdade), você encontrairá o URL de redirecionamento em

 response.headers.get("Location") 

Espero que isto ajude

Eu estava em uma situação semelhante à sua. Basicamente, tudo o que precisamos é capturair o header "Set-Cookie" que seu server retorna antes de redirect. É assim que lidei com 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()); } 

Eu editei minha resposta anterior, pois você provavelmente usa um POST / PUT ao chamair seu api de repouso de login e OkHttp conviewte qualquer solicitação não GET ou HEAD em um request GET antes de redirect o qual provavelmente não funcionairia paira você.

Atualmente, o recurso de desativação de redirecionamentos está faltando no OkHttp, mas eu enviei um request de extração paira ele. Se e quando esse request de extração for aceito, ele deve permitir que você desabilite o redirecionamento, dando-lhe a oportunidade de lidair com este caso de uso por conta própria por enquanto.

Aqui está o request de puxair https://github.com/squaire/okhttp/pull/944

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.