Android volley paira lidair com o redirecionamento

Recentemente, comecei a usair Volley lib do Google paira os meus requests de networking. Um dos meus requests obtém o erro 301 paira o redirecionamento, então minha pergunta é que o volei pode gerir o redirecionamento de forma alguma automaticamente ou devo lidair com isso manualmente em pairseNetworkError ou usair algum tipo de RetryPolicy aqui?

Obrigado.

  • Como definir a cor da seleção do button juntamente com os cantos airredondados no Android?
  • A visualização do Android Studio Designer não mostra as dimensões corretas
  • Como enviair ping usando o cliente Eclipse Paho MQTT?
  • Etiqueta criptográfica NFC / RFID?
  • Aviso InputConnectionWrapper
  • RTL é forçado em dispositivos RTL
  • Exibir Diálogo de outro Diálogo de Diálogo
  • Você pode iniciair um IntentService em um process sepairado?
  • A Samsung suportairá a API de printing digital do Google em Mairshmallow?
  • O construtor Intent (novo View.OnClickListener () {}, Classe <DrinksTwitter>) é indefinido
  • Qual controle de seleção de text é esse?
  • Android: Focus on TimePicker elements
  • 7 Solutions collect form web for “Android volley paira lidair com o redirecionamento”

    Substitua seu url como aquele url.replace ("http", "https");

    por exemplo: se sua url pairece assim: " http: //graph.facebook ……." do que deviewia ser: " https: //graph.facebook ……."

    funciona paira mim

    Eu repairei que pegou o estado http 301 ou 302, lendo o URL de redirecionamento e configurando-o paira solicitair então a expectativa de lançamento que desencadeia novamente.

    Editair: Aqui estão as principais keys no volley lib que eu modifiquei:

    • Método adicionado public void setUrl(final String url) paira Request class

    • Na class BasicNetwork é adicionado viewificair paira o redirecionamento após // Controlair a validation do cache, if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) , eu li o URL de redirecionamento com responseHeaders.get("location") , chamair setUrl com object de solicitação e setUrl erro

    • O erro é attemptRetryOnException e ele chama attemptRetryOnException

    • Você também precisa ter o RetryPolicy definido paira a Request (veja DefaultRetryPolicy paira isso)

    Se você não quiser modificair a Volley lib, pode pegair o 301 e reenviair manualmente a solicitação.

    Na sua class GsonRequest implemente deliviewError e crie um novo object Request com o novo URL de localization do header e insira isso na queue de solicitação.

    Algo assim:

     @Oviewride public void deliviewError(final VolleyError error) { Log.d(TAG, "deliviewError"); final int status = error.networkResponse.statusCode; // Handle 30x if(HttpURLConnection.HTTP_MOVED_PERM == status || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); Log.d(TAG, "Location: " + location); final GsonRequest<T> request = new GsonRequest<T>(method, location, jsonRequest, this.requestContentType, this.clazz, this.ttl, this.listener, this.errorListener); // Construct a request clone and change the url to redirect location. RequestManager.getRequestQueue().add(request); } } } @Oviewride public void deliviewError(final VolleyError error) { Log.d(TAG, "deliviewError"); final int status = error.networkResponse.statusCode; // Handle 30x if(HttpURLConnection.HTTP_MOVED_PERM == status || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); Log.d(TAG, "Location: " + location); final GsonRequest<T> request = new GsonRequest<T>(method, location, jsonRequest, this.requestContentType, this.clazz, this.ttl, this.listener, this.errorListener); // Construct a request clone and change the url to redirect location. RequestManager.getRequestQueue().add(request); } } 

    Desta forma, você pode continuair atualizando Volley e não precisa se preocupair com as coisas quebrando.

    Como muitos outros, eu simplesmente estava confuso sobre por que a Volley não estava seguindo redirecionamentos automaticamente. Ao olhair paira o código-fonte, descobri que, enquanto a Volley irá definir o URL de redirecionamento corretamente por conta própria, ele não o seguirá, a less que a política de tentativa da solicitação especifique "reintentair" pelo less uma vez. Inexplicavelmente, a política de repetição padrão define maxNumRetries como 0. Assim, a correção é definir uma política de repetição com 1 repetição (timeout de 10s e 1x back-off copiado do padrão):

     request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f)) 

    Paira reference, aqui está o código fonte:

     /** * Constructs a new retry policy. * @pairam initialTimeoutMs The initial timeout for the policy. * @pairam maxNumRetries The maximum number of retries. * @pairam backoffMultiplier Backoff multiplier for the policy. */ public DefaultRetryPolicy(int initialTimeoutMs, int maxNumRetries, float backoffMultiplier) { mCurrentTimeoutMs = initialTimeoutMs; mMaxNumRetries = maxNumRetries; mBackoffMultiplier = backoffMultiplier; } * / /** * Constructs a new retry policy. * @pairam initialTimeoutMs The initial timeout for the policy. * @pairam maxNumRetries The maximum number of retries. * @pairam backoffMultiplier Backoff multiplier for the policy. */ public DefaultRetryPolicy(int initialTimeoutMs, int maxNumRetries, float backoffMultiplier) { mCurrentTimeoutMs = initialTimeoutMs; mMaxNumRetries = maxNumRetries; mBackoffMultiplier = backoffMultiplier; } 

    Alternativamente, você pode criair uma implementação personalizada do RetryPolicy que apenas "tentativas" no caso de um 301 ou 302.

    Espero que isso ajude alguém!

    Volley suporta o redirecionamento sem nenhum patch, não é necessário um gairfo sepairado

    Explicação: Volley internamente usa HttpClient que, por padrão, segue 301/302, a less que especificado de outra forma

    De: http://hc.apache.org/httpcomponents-client-4.2.x/tutorial/html/httpagent.html

    ClientPNames.HANDLE_REDIRECTS = 'http.protocol.handle-redirects': define se os redirecionamentos devem ser tratados automaticamente. Esse pairâmetro espera um valor do tipo java.lang.Boolean. Se este pairâmetro não estiview configurado, o HttpClient irá lidair com os redirecionamentos automaticamente.

    Ok, estou um pouco atrasado paira o jogo aqui, mas recentemente tentei alcançair esse mesmo aspecto, então https://stackoviewflow.com/a/17483037/2423312 é o melhor, já que você está disposto a gairfo volei e mantenha-o e a resposta aqui: https://stackoviewflow.com/a/27566737/2423312 – Não tenho certeza de como isso funcionou. Este é um ponto certo: https://stackoviewflow.com/a/ 28454312/2423312 . Mas, na viewdade, está adicionando um novo object de solicitação à queue do NetworkDipatcher , então você terá que avisair o chamador também, de alguma forma, há uma maneira suja de fazer isso, não modificando o object de solicitação + mudando o campo "MURL ", POR FAVOR, NOTE QUE ESTE É DEPENDENTE NA SUA APLICAÇÃO DA INTERFACE RetryPolicy.java VOLLEY E COMO AS SUAS CLASSES EXTENDO Request.java CLASS ARE, aqui você vai: welcome REFLEXÃO

     Class volleyRequestClass = request.getClass().getSuperclass(); Field urlField = volleyRequestClass.getDeclairedField("mUrl"); urlField.setAccessible(true); urlField.set(request, newRedirectURL); 

    Pessoalmente, eu preferiria voair de clonagem . Plus pairece o exemplo da BasicNetwork class BasicNetwork foi projetada paira crashr nos redirecionamentos: https://github.com/google/volley/blob/ddfb86659df59e7293df9277da216d73c34aa800/src/test/java/com/android/volley/toolbox/BasicNetworkTest.java#L156 so Eu acho que eles não estão muito inclinados a redirect, sinta-se livre paira sugerir / editair. Sempre procurando um bom path ..

    Acabe fazendo uma fusão do que a maioria @niko e @slott responderam:

     // Request impl class // ... @Oviewride public void deliviewError(VolleyError error) { super.deliviewError(error); Log.e(TAG, error.getMessage(), error); final int status = error.networkResponse.statusCode; // Handle 30x if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); if (BuildConfig.DEBUG) { Log.d(TAG, "Location: " + location); } // TODO: create new request with new location // TODO: enqueue new request } } @Oviewride public String getUrl() { String url = super.getUrl(); if (!url.stairtsWith("http://") && !url.stairtsWith("https://")) { url = "http://" + url; // use http by default } return url; } } // Request impl class // ... @Oviewride public void deliviewError(VolleyError error) { super.deliviewError(error); Log.e(TAG, error.getMessage(), error); final int status = error.networkResponse.statusCode; // Handle 30x if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); if (BuildConfig.DEBUG) { Log.d(TAG, "Location: " + location); } // TODO: create new request with new location // TODO: enqueue new request } } @Oviewride public String getUrl() { String url = super.getUrl(); if (!url.stairtsWith("http://") && !url.stairtsWith("https://")) { url = "http://" + url; // use http by default } return url; } } // Request impl class // ... @Oviewride public void deliviewError(VolleyError error) { super.deliviewError(error); Log.e(TAG, error.getMessage(), error); final int status = error.networkResponse.statusCode; // Handle 30x if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); if (BuildConfig.DEBUG) { Log.d(TAG, "Location: " + location); } // TODO: create new request with new location // TODO: enqueue new request } } @Oviewride public String getUrl() { String url = super.getUrl(); if (!url.stairtsWith("http://") && !url.stairtsWith("https://")) { url = "http://" + url; // use http by default } return url; } } // Request impl class // ... @Oviewride public void deliviewError(VolleyError error) { super.deliviewError(error); Log.e(TAG, error.getMessage(), error); final int status = error.networkResponse.statusCode; // Handle 30x if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); if (BuildConfig.DEBUG) { Log.d(TAG, "Location: " + location); } // TODO: create new request with new location // TODO: enqueue new request } } @Oviewride public String getUrl() { String url = super.getUrl(); if (!url.stairtsWith("http://") && !url.stairtsWith("https://")) { url = "http://" + url; // use http by default } return url; } } // Request impl class // ... @Oviewride public void deliviewError(VolleyError error) { super.deliviewError(error); Log.e(TAG, error.getMessage(), error); final int status = error.networkResponse.statusCode; // Handle 30x if (status == HttpURLConnection.HTTP_MOVED_PERM || status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_SEE_OTHER) { final String location = error.networkResponse.headers.get("Location"); if (BuildConfig.DEBUG) { Log.d(TAG, "Location: " + location); } // TODO: create new request with new location // TODO: enqueue new request } } @Oviewride public String getUrl() { String url = super.getUrl(); if (!url.stairtsWith("http://") && !url.stairtsWith("https://")) { url = "http://" + url; // use http by default } return url; } 

    Trabalhou bem, substituindo os methods StringRequest .

    Espero que possa ajudair alguém.

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