Заявка на Android WebView с пользовательскими заголовками
Я мог видеть, что в документах Android есть два отдельных метода, чтобы опубликовать данные и добавить заголовки.
For setting Headers
public void loadUrl (String url, Map<String, String> additionalHttpHeaders)
For setting Post Data
public void postUrl (String url, byte[] postData)
Но мне действительно нужно отправить данные вместе с заголовками. (Значит, мне нужен единственный метод, который выполняет обе задачи?)
Может кто-нибудь, пожалуйста, помогите мне с этим.
Спасибо:)
Ответы
Ответ 1
Я столкнулся с той же проблемой в последнее время и через пару часов решил ее.
Вот мой фрагмент кода с некоторыми комментариями:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(getPostUrl());
// example of adding extra header "Referer"
httpPost.addHeader("Referer", getReferer());
ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
for (PostItem postItem : getPostItems()) {
// key value post pairs
// add post parameters in array list
postParameters.add(new BasicNameValuePair(postItem.getKey(), postItem.getValue()));
}
HttpResponse response = null;
try {
mWebView.getSettings().setJavaScriptEnabled(true);
httpPost.setEntity(new UrlEncodedFormEntity(postParameters));
response = httpclient.execute(httpPost);
BasicResponseHandler responseHandler = new BasicResponseHandler();
String htmlString = responseHandler.handleResponse(response);
// important!! is to fill base url
mWebView.loadDataWithBaseURL(getPostUrl(), htmlString, "text/html", "utf-8", null);
} catch (Exception e){
// handle errors
}
Ответ 2
Кажется, что структура не обеспечивает эти функции вместе.
Рассматривая исходный код WebViewCore (https://android.googlesource.com/platform/frameworks/base/+/eclair-release%5E2/core/java/android/webkit/WebViewCore.java, строка 889), дополнительные заголовки обрабатываются только в вызове loadUrl
и никогда в postUrl
.
Ответ 3
Вы можете сделать это в два этапа: попросить webview загрузить веб-страницу как пост, обработать этот запрос и обработать его заголовками:
val postData = "password=" + URLEncoder.encode(password, "UTF-8")+"&username=" + URLEncoder.encode(username, "UTF-8")
webView.postUrl(url, postData.toByteArray())
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
val customHeaders = HashMap<String, String>()
customHeaders["header"] = "header"
webView.loadUrl(url, customHeaders)
return true
}
}