最近公司有需求:webview需要以post形式获取页面,并且要自定义header。
跟查了一下api,发现webview有
loadData(String url,Map<String,String> header)
,但是post形式只有 postUrl(String url,byte[] body) 。
查询方案后,明确方案大致有2种:
1重写webViewClient的
shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
方法,拦截指定url,重新发起请求。
2 自己使用网络请求方法,将请求结果给webivew加载。
第一种我自己未测试通过,这里贴上第二种方法代码。
自己测试可用
protected void postURL(final String url, String postData) {
X509TrustManager xtm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] x509Certificates = new X509Certificate[0];
return x509Certificates;
}
};
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
Request request = new Request.Builder()
.url(url)
.addHeader("Cache-Control", "max-age=0")
.addHeader("Origin", "null") //Optional
.addHeader("Upgrade-Insecure-Requests", "1")
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.addHeader("User-Agent", webview.getSettings().getUserAgentString())
.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
.addHeader("Accept-Language", Locale.getDefault().getLanguage())
.post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), postData))
.build();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory())
.hostnameVerifier(DO_NOT_VERIFY)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure: ");
// Timber.e(e.getMessage());
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String htmlString = response.body().string();
webview.post(new Runnable() {
@Override
public void run() {
webview.clearCache(true);
webview.loadDataWithBaseURL(url, htmlString, "text/html", "utf-8", null);
}
});
}
});
}
网友评论