2016-07-16 5 views
2
Hinzufügen

Ich brauche einen benutzerdefinierten Header auf eine Seite geladen in WebView hinzuzufügen, aber es funktioniert nicht, wird Header nicht gesetzt:indem Sie Header hinzufügen zu Header WebResourceRequest die in shouldInterceptRequest funktioniert nicht

@Override 
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) 
{ 
    request.getRequestHeaders().add("MyHeader","MyValue"); 
    return super.shouldInterceptRequest(view, request); 
} 

Was mache ich hier falsch? Ich laufe auf Android 5.

Ich habe viele Antworten auf SO gesehen sagen, dass Sie die HTTP-Anfrage zu tun haben und WebResourceResponse selbst zurückgeben. Ist dies, weil selbst wenn Sie Header wie ich ändern, sie ignoriert werden?

Ich versuche auch, den Ort im Android-Quellcode des Anrufs zu finden Wo ist der Ort des Aufrufs an die shallInterceptRequest, so kann ich sehen, wie es mir geht, aber ich konnte es nicht finden.

+0

Ist Ihre minSdkVersion bis 21 gesetzt ist, da 'shouldInterceptRequest (WebView Ansicht, WebResourceRequest Anfrage)' ab Version 21 nur –

+0

ja unterstützt wird. es sollte funktionieren? –

Antwort

4

ich die Antwort selbst gefunden, dann ist es genau dort in docs:

Wenn der Rückgabewert null ist, wird die WebView die Ressource wie gewohnt laden fortzusetzen. Andernfalls werden die Antwortantwort und die Daten verwendet.

Darüber hinaus ist ein einfacher Test zeigt die Basisimplementierung von WebViewClient.shouldInterceptRequest kehrt null. Daher lädt das WebView die Ressource wie gewohnt weiter.

Mit anderen Worten, ich kann nicht einfach einen Wert zum Header hinzufügen und erwarten, dass es verwendet wird. Ich muss eigentlich selbst die Anfrage machen und die Antwort zurückgeben.

Schade, es gibt keine Möglichkeit, nur Kopfzeile zu ändern und die Standardimplementierung verwenden es verwenden.

Ich weiß, ich kann in Headern festlegen, indem Sie loadUrl Methode mit Headern aufrufen, aber die Header werden nicht verwendet, wenn ich zuerst eine lokale Seite laden und dann Online-Seiten laden.

+0

Ich würde nicht erwarten, dass Ihr erster Ansatz funktioniert, weil Sie nur eine Reihe von Headern abrufen und ein weiteres Element zum Set hinzufügen. Sie weisen der Anfrage den neuen Satz nicht zu. Der schwierige Teil ist das Zuweisen der neuen Kopfzeile, da in WebResourceRequest keine setHeaders-Methode vorhanden ist. – Chicowitz

+0

@Chicowitz getRequestHeaders() gibt eine HashMap-Instanz zurück, bei der es sich um dieselbe Instanz in der Anfrage und nicht um eine Kopie handelt. Die Anfrage verweist auf dieselbe Instanz. Wenn Sie Werte hinzufügen, sind die zusätzlichen Werte bereits in der Anfrage enthalten. Sie müssen nicht den "neuen Satz" zuweisen, es gibt keinen neuen Satz, es ist der gleiche Satz. Deshalb funktioniert es nicht. Du verwirrst nur Dinge. Don Box hat bereits genau erklärt, warum es in dieser Antwort nicht funktioniert. – Niall