webView之post请求携带请求头及打印日志等剖析
关于viewView大家经常使用的往往是get请求,加载页面信息(这里不做详解),本片博客主要post请求添加请求头及相关问题扩展。
附demo如下
package net.meyki.app.activity.order;
import android.annotation.SuppressLint;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.uzmap.pkg.uzkit.request.HttpPost;
import net.meyki.app.R;
import net.meyki.app.utils.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EncodingUtils;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Set;
public class WebViewDemo extends AppCompatActivity {
public Map
public String urls;
public TextView button;
public WebView web;
public String ss;
public String postData;
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view_demo);
button = (TextView) findViewById(R.id.click);
web = (WebView) findViewById(R.id.webview);
webViewTest();
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
private void webViewTest() {
String url = "http://****/api/validate/mobile?token=******";
//json 数据(入参)
postData = "{\n" +
" \"bid\": \"******\",\n" +
" \"sn\": \"\",\n" +
"\t\"depNo\": \"\",\n" +
"\t\"token\": \"********\",\n" +
" \"metas\": [\n" +
" {\n" +
" \"name\": \"编号\",\n" +
" \"value\": \"12321\",\n" +
" \"seq\": \"1\"\n" +
" },\n" +
" {\n" +
" \"name\": \"名称\",\n" +
" \"value\": \"测试\",\n" +
" \"seq\": \"2\"\n" +
" }\n" +
" ],\n" +
" \"files\": [\n" +
" {\n" +
" \"name\": \"1.png\",\n" +
" \"hash\": \"1e53f08a55fef2e97808ccd7bb2bf4da7cc86a4ea94179ead1dc14b1e030855e\",\n" +
" \"seq\": \"1\"\n" +
" },\n" +
" {\n" +
" \"name\": \"测试5.pdf\",\n" +
" \"hash\": \"5ad73b9346f9dbaf40be8adf99c031e39f119923b578154192fa673443736b14\",\n" +
" \"seq\": \"2\"\n" +
" }\n" +
" ]\n" +
"}";
Log.i("====postData====", "====postData====" + postData);
headerMap = new HashMap<>();
headerMap.put("Content-Type", "application/x-www-form-urlencoded");
StringEntity se = null;
try {
se = new StringEntity(postData);
} catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
byte[] result = null;
try {
result = EntityUtils.toByteArray(se);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
web.getSettings().setJavaScriptEnabled(true);
web.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
web.setWebViewClient(new WebViewClient() {
@SuppressLint("NewApi")
@Override//拦截器添加请求头
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
if (request != null && request.getUrl() != null && request.getMethod().equalsIgnoreCase("post")) {
String scheme = request.getUrl().getScheme().trim();
if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")) {
try {
URL url = new URL(request.getUrl().toString());
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-type", "application/json");
Log.i("====postData====ll", "====postData====" + postData);
connection.getOutputStream().write(postData.getBytes());
return new WebResourceResponse("text/html", connection.getHeaderField("encoding"), connection.getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override//打印web页面数据(html)
public void onPageFinished(WebView view, String url) {
Log.d("WebView", "onPageFinished ");
view.loadUrl("javascript:window.local_obj.showSource(''+" +
"document.getElementsByTagName('html')[0].innerHTML+'');");
super.onPageFinished(view, url);
}
});
web.setWebChromeClient(new WebChromeClient() {
@Override//开启打印js log功能
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
String message = consoleMessage.message();
int lineNumber = consoleMessage.lineNumber();
String sourceID = consoleMessage.sourceId();
String messageLevel = consoleMessage.message();
ConsoleMessage.MessageLevel messageLevel1 = consoleMessage.messageLevel();
Log.i("app3cs", String.format("[%s] sourceID: %s lineNumber: %n message: %s",
messageLevel, sourceID, lineNumber, message));
return super.onConsoleMessage(consoleMessage);
}
});
web.postUrl(url, EncodingUtils.getBytes(postData.toString(), "UTF-8"));
}
final class InJavaScriptLocalObj {
@JavascriptInterface
public void showSource(String html) {
Log.d("HTML", html);
}
}
}