C'è un modo per visualizzare le intestazioni delle risposte http in un'attività una volta che una pagina Web è stata caricata in una WebView? Sembra che questo dovrebbe essere possibile, ma non riesco a trovare alcun metodo che esponga le intestazioni.Accedere alle intestazioni delle risposte http in una WebView?
risposta
Né WebView
né WebViewClient
fornire metodi per farlo, Tuttavia, è possibile provare a implementarlo manualmente. Si può fare qualcosa di simile:
private WebView webview;
public void onCreate(Bundle icicle){
// bla bla bla
// here you initialize your webview
webview = new WebView(this);
webview.setWebViewClient(new YourWebClient());
}
// this will be the webclient that will manage the webview
private class YourWebClient extends WebViewClient{
// you want to catch when an URL is going to be loaded
public boolean shouldOverrideUrlLoading (WebView view, String urlConection){
// here you will use the url to access the headers.
// in this case, the Content-Length one
URL url;
URLConnection conexion;
try {
url = new URL(urlConection);
conexion = url.openConnection();
conexion.setConnectTimeout(3000);
conexion.connect();
// get the size of the file which is in the header of the request
int size = conexion.getContentLength();
}
// and here, if you want, you can load the page normally
String htmlContent = "";
HttpGet httpGet = new HttpGet(urlConection);
// this receives the response
HttpResponse response;
try {
response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
// la conexion fue establecida, obtener el contenido
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = entity.getContent();
htmlContent = convertToString(inputStream);
}
}
} catch (Exception e) {}
webview.loadData(htmlContent, "text/html", "utf-8");
return true;
}
public String convertToString(InputStream inputStream){
StringBuffer string = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
try {
while ((line = reader.readLine()) != null) {
string.append(linea + "\n");
}
} catch (IOException e) {}
return string.toString();
}
}
non posso provarlo in questo momento, ma questo è fondamentalmente ciò che si potrebbe fare (è molto pazzo però :).
Dovresti essere in grado di controllare tutte le intestazioni saltando loadUrl e scrivendo il tuo loadPage utilizzando l'HttpURLConnection di Java. Quindi visualizza le intestazioni, fai le tue cose e usa loadData della webview per visualizzare la risposta.
Potresti per favore elaborare la tua risposta? Da 4 anni spero che ci sia un modo migliore per farlo. –
@MW Apparentemente no. Forse nei prossimi 4 anni – Arthur
ispirato a Cristiananswer Avevo bisogno di intercettare le chiamate AJAX che sta facendo webview, dove dovevo intercettare le intestazioni di risposta per ottenere alcune informazioni (numero di elementi del carrello nell'app di e-commerce), che dovevo sfruttare in app. Poiché l'applicazione sta usando okhttp ho finito per fare questo e sta funzionando:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
Log.i(TAG,"shouldInterceptRequest path:"+request.getUrl().getPath());
WebResourceResponse returnResponse = null;
if (request.getUrl().getPath().startsWith("/cart")) { // only interested in /cart requests
returnResponse = super.shouldInterceptRequest(view, request);
Log.i(TAG,"cart AJAX call - doing okRequest");
Request okRequest = new Request.Builder()
.url(request.getUrl().toString())
.post(null)
.build();
try {
Response okResponse = app.getOkHttpClient().newCall(okRequest).execute();
if (okResponse!=null) {
int statusCode = okResponse.code();
String encoding = "UTF-8";
String mimeType = "application/json";
String reasonPhrase = "OK";
Map<String,String> responseHeaders = new HashMap<String,String>();
if (okResponse.headers()!=null) {
if (okResponse.headers().size()>0) {
for (int i = 0; i < okResponse.headers().size(); i++) {
String key = okResponse.headers().name(i);
String value = okResponse.headers().value(i);
responseHeaders.put(key, value);
if (key.toLowerCase().contains("x-cart-itemcount")) {
Log.i(TAG,"setting cart item count");
app.setCartItemsCount(Integer.parseInt(value));
}
}
}
}
InputStream data = new ByteArrayInputStream(okResponse.body().string().getBytes(StandardCharsets.UTF_8));
Log.i(TAG, "okResponse code:" + okResponse.code());
returnResponse = new WebResourceResponse(mimeType,encoding,statusCode,reasonPhrase,responseHeaders,data);
} else {
Log.w(TAG,"okResponse fail");
}
} catch (IOException e) {
e.printStackTrace();
}
}
return returnResponse;
}
Spero che questo può essere utile per gli altri e se qualcuno ha un suggerimento per il miglioramento sarei grato. Sfortunatamente è compatibile solo con LOLLIPOP e versioni successive, poiché da questa versione è possibile accedere/restituire le intestazioni utilizzando WebResourceRequest, che era necessario per il mio caso.
Non c'è alternativa a WebResourceRequest per le versioni precedenti di Android? Non è possibile catturare le richieste Ajax nelle vecchie versioni di Android? – Sohaib
in alternativa è possibile utilizzare http://developer.android.com/guide/webapps/webview.html#BindingJavaScript se è possibile modificare ciò che sta facendo sito Web/webapp – ursimon
Sto cercando di farlo anche su versioni precedenti di Android. Un modo per farlo? – clu
come la risposta accettata funziona solo con HttpGet, ecco un trucco thet attualmente sto usando (in questo momento sembra funzionare)
In gestore onPageFinished, se si verifica un errore, il titolo di la pagina sarà come "ERROR_NUM - ERROR_DESCRIPTION", come "500 - Errore interno del server", quindi tutto quello che faccio è ottenere il titolo da webview nella funzione, e quindi controllare il titolo.
view.getTitle()
Questo non ha nulla a che fare con ottenere le intestazioni di risposta. –
- 1. Mappatura delle richieste HTTP alle risposte HTTP
- 2. Come accedere alle intestazioni HTTP nell'endpoint di Spring-ws?
- 3. Angolare 2: impossibile accedere alle intestazioni di risposta in una richiesta http
- 4. Come ottenere l'elenco delle intestazioni delle risposte HTTP attualmente impostate in Node/Express?
- 5. Modifica delle risposte HTTP nell'estensione per Firefox
- 6. È possibile impostare intestazioni HTTP personalizzate nella WebView
- 7. L'ordine delle intestazioni in una risposta HTTP è sempre importante?
- 8. Come posso accedere alle intestazioni delle richieste che non compaiono in $ _SERVER?
- 9. Come accedere alle intestazioni HTTP per la richiesta al gateway API AWS utilizzando Lambda?
- 10. Come accedere al nome host, alle intestazioni http, ecc. Da un server websocket Java?
- 11. Accesso alle intestazioni delle richieste personalizzate nodo express
- 12. accesso alle intestazioni delle richieste su django/python
- 13. Eccezione SoapFault: Errore [HTTP] Recupero delle intestazioni http
- 14. Come si può accedere alle intestazioni di una richiesta in arrivo in tritio?
- 15. Come evitare la memorizzazione nella cache in Internet Explorer 9 attraverso le intestazioni delle risposte http in java?
- 16. HTML5 video: modifica delle intestazioni delle richieste dell'intervallo http
- 17. Char SP in intestazioni HTTP?
- 18. Intestazioni HTTP multilinea Confusione
- 19. Impostazione delle intestazioni HTTP a livello di applicazione in AngularJS
- 20. Impostazione delle intestazioni HTTP in Play 2.0 (scala)?
- 21. Test delle risposte in node.js?
- 22. Comprimere le intestazioni Http
- 23. Ottieni intestazioni HTTP in richiesta asincrona WebClient
- 24. Heroku tronca le risposte HTTP?
- 25. Aggiungendo l'autorizzazione alle intestazioni
- 26. Risposte SignalR che sovrascrivono le intestazioni
- 27. Come si elaborano risposte http multipart in Ruby Net: HTTP?
- 28. Intestazioni Angular2/Http (POST)
- 29. Codifica delle intestazioni in MIMEText
- 30. Come rilevare le modifiche alle intestazioni nella lista delle dipendenze
No. Che cosa stai cercando di fare esattamente? Se si desidera esaminare la richiesta/risposta, è necessario effettuare la richiesta utilizzando HttpClient. –
Sto provando a leggere un'intestazione della risposta http dalla pagina caricata nella mia WebView. Ho avuto la sensazione che avrei dovuto utilizzare HttpClient e quindi inviare la risposta al WebView. Più lavoro di quello che dovrebbe essere richiesto per leggere una risposta di intestazione ... – tronman