Necesito agregar encabezados personalizados a CADA solicitud proveniente de WebView. Sé que loadURL
tiene el parámetro para extraHeaders
, pero esos solo se aplican a la solicitud inicial. Todas las solicitudes posteriores no contienen los encabezados. He analizado todas las anulaciones WebViewClient
, pero nada permite agregar encabezados a las solicitudes de recursos - onLoadResource(WebView view, String url)
. Cualquier ayuda sería maravillosa.
Gracias Ray
Respuestas:
Tratar
Para agregar encabezados a las solicitudes de carga de recursos, cree WebViewClient personalizado y anule:
fuente
view.loadUrl("http://www.facebook.com", extraHeaders)
, hay varias solicitudes de recursos como,'http://static.fb.com/images/logo.png'
etc., que se envían desde la vista web. Para estas solicitudes, no se agregan los encabezados adicionales. Y shouldOverrideUrlLoading no se llama durante tales solicitudes de recursos. Se llama a la devolución de llamada 'OnLoadResource', pero no hay forma de establecer encabezados en este punto.WebViewClient.shouldInterceptRequest(android.webkit.WebView view, java.lang.String url)
Consulte la API para obtener más información.shouldInterceptRequest
método, ¿podría explicar cómo?Deberá interceptar cada solicitud mediante WebViewClient.shouldInterceptRequest
Con cada intercepción, deberá tomar la URL, realizar esta solicitud usted mismo y devolver el flujo de contenido:
Si su objetivo de API mínimo es el nivel 21 , puede usar el nuevo shouldInterceptRequest que le brinda información de solicitud adicional (como encabezados) en lugar de solo la URL.
fuente
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
en su lugar busque más aquíQuizás mi respuesta sea bastante tarde, pero cubre API por debajo y por encima del nivel 21.
Para agregar encabezados, debemos interceptar cada solicitud y crear una nueva con los encabezados requeridos.
Así que necesitamos anular el método shouldInterceptRequest llamado en ambos casos: 1. para API hasta el nivel 21; 2. para API nivel 21+
Si se debe procesar el tipo de respuesta, puede cambiar
a
y agregue el método
fuente
Como se mencionó anteriormente, puede hacer esto:
Probé esto y con un controlador MVC que extendí el atributo de autorización para inspeccionar el encabezado y el encabezado está allí.
fuente
Esto funciona para mi:
Primero debe crear un método, que devolverá los encabezados que desea agregar a la solicitud:
En segundo lugar, debe crear WebViewClient:
Agregue WebViewClient a su WebView:
Espero que esto ayude.
fuente
loadUrl(String url, Map<String, String> additionalHttpHeaders)
significa agregar encabezados adicionalesDebería poder controlar todos sus encabezados omitiendo loadUrl y escribiendo su propia página de carga usando HttpURLConnection de Java. Luego use loadData de la vista web para mostrar la respuesta.
No hay acceso a los encabezados que proporciona Google. Están en una llamada JNI, en lo profundo de la fuente de WebView.
fuente
Aquí hay una implementación usando HttpUrlConnection:
Tenga en cuenta que esto no funciona para las solicitudes POST porque WebResourceRequest no proporciona datos POST. Existe una biblioteca de Solicitud de datos: WebViewClient que utiliza una solución alternativa de inyección de JavaScript para interceptar datos POST.
fuente
Esto funcionó para mí. Cree WebViewClient como este a continuación y configure el cliente web en su vista web. Tuve que usar webview.loadDataWithBaseURL ya que mis URL (en mi contenido) no tenían la baseurl sino solo las URL relativas. Obtendrá la URL correctamente solo cuando haya un conjunto de baseurl usando loadDataWithBaseURL.
fuente
Puedes usar esto:
fuente
Me encontré con el mismo problema y lo resolví.
Como se dijo antes, debe crear su WebViewClient personalizado y anular el método shouldInterceptRequest.
Ese método debería emitir un webView.loadUrl mientras devuelve un WebResourceResponse "vacío".
Algo como esto:
fuente
Utilizar este:
fuente