Preciso adicionar cabeçalhos personalizados a CADA solicitação proveniente do WebView. Eu sei que loadURL
tem o parâmetro para extraHeaders
, mas eles se aplicam apenas à solicitação inicial. Todas as solicitações subsequentes não contêm os cabeçalhos. Eu olhei todas as substituições emWebViewClient
, mas nada permite adicionar cabeçalhos às solicitações de recursos - onLoadResource(WebView view, String url)
. Qualquer ajuda seria maravilhosa.
Obrigado, Ray
Respostas:
Experimentar
Para adicionar cabeçalhos às solicitações de carregamento de recursos, faça WebViewClient personalizado e substitua:
fonte
view.loadUrl("http://www.facebook.com", extraHeaders)
, há várias solicitações de recursos como'http://static.fb.com/images/logo.png'
etc que são enviadas da webiew. Para essas solicitações, os cabeçalhos extras não são adicionados. E shouldOverrideUrlLoading não é chamado durante essas solicitações de recursos. O retorno de chamada 'OnLoadResource' é chamado, mas não há como definir cabeçalhos neste ponto.WebViewClient.shouldInterceptRequest(android.webkit.WebView view, java.lang.String url)
a API Check-out para mais informações.shouldInterceptRequest
método, você pode explicar como?Você precisará interceptar cada solicitação usando WebViewClient.shouldInterceptRequest
Com cada interceptação, você precisará pegar o url, fazer essa solicitação você mesmo e retornar o fluxo de conteúdo:
Se sua meta de API mínima for o nível 21 , você pode usar o novo shouldInterceptRequest, que fornece informações de solicitação adicionais (como cabeçalhos) em vez de apenas o URL.
fonte
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
vez disso encontre mais aquiTalvez minha resposta seja bem tarde, mas cobre a API abaixo e acima 21 nível.
Para adicionar cabeçalhos, devemos interceptar cada solicitação e criar um novo com os cabeçalhos necessários.
Portanto, precisamos substituir o método shouldInterceptRequest chamado em ambos os casos: 1. para API até o nível 21; 2. para API de nível 21+
Se o tipo de resposta deve ser processado, você pode alterar
para
e adicionar método
fonte
Como mencionado antes, você pode fazer isso:
Eu testei isso e continuei com um controlador MVC que estendi o atributo Authorize para inspecionar o cabeçalho e o cabeçalho está lá.
fonte
Isso funciona para mim:
Primeiro você precisa criar o método, que retornará os cabeçalhos que deseja adicionar à solicitação:
Em segundo lugar, você precisa criar WebViewClient:
Adicione WebViewClient ao seu WebView:
Espero que isto ajude.
fonte
loadUrl(String url, Map<String, String> additionalHttpHeaders)
significa adicionar cabeçalhos de adiçõesVocê deve ser capaz de controlar todos os seus cabeçalhos pulando loadUrl e escrevendo sua própria loadPage usando HttpURLConnection do Java. Em seguida, use o loadData do webview para exibir a resposta.
Não há acesso aos cabeçalhos que o Google fornece. Eles estão em uma chamada JNI, profundamente na origem do WebView.
fonte
Aqui está uma implementação usando HttpUrlConnection:
Observe que isso não funciona para solicitações POST porque WebResourceRequest não fornece dados POST. Há uma biblioteca Request Data - WebViewClient que usa uma solução alternativa de injeção de JavaScript para interceptar dados POST.
fonte
Isso funcionou para mim. Crie WebViewClient como este abaixo e defina o webclient para o seu webview. Eu tive que usar webview.loadDataWithBaseURL como meus urls (em meu conteúdo) não tinha o baseurl, mas apenas urls relativos. Você obterá a url corretamente apenas quando houver uma baseurl definida usando loadDataWithBaseURL.
fonte
Você pode usar isto:
fonte
Eu me deparei com o mesmo problema e resolvi.
Como dito antes, você precisa criar seu WebViewClient personalizado e substituir o método shouldInterceptRequest.
Esse método deve emitir um webView.loadUrl enquanto retorna um WebResourceResponse "vazio".
Algo assim:
fonte
Usa isto:
fonte