从WebView到http协议
WebView--->>
package com.app.cceasy.webviewtest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.web_view); //设置浏览器的一些属性 webView.getSettings().setJavaScriptEnabled(true); //让webview支持javascript脚本 //加载网页的方式 webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //根据传入的参数加载新的网页 return true; //表示当前webview可以处理打开新网页的请求,不用借助系统浏览器 } }); webView.loadUrl("http://www.baidu.com"); } }
实际界面:
对于 HTTP 协议,你只需要稍微了解一些就足够了,它的工作原理特别的简单,就是客户端向服务器发出一条HTTP 请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。是不是非常简单?一个浏览器的基本工作原理也就是如此了。
比如说上一节中使用到的 WebView 控件,其实也就是我们向百度的服务器发起了一条 HTTP 请求,接着服务器分析出我们想要访问的是百度的首页,于是会把该网页的 HTML 代码进行返回,
然后 WebView再调用手机浏览器的内核对返回的 HTML代码进行解析, 最终将页面展示出来。
简单来说,WebView 已经在后台帮我们处理好了发送 HTTP 请求、接收服务响应、解析
返回数据,以及最终的页面展示这几步工作,不过由于它封装得实在是太好了,反而使得我
们不能那么直观地看出 HTTP 协议到底是如何工作的。因此,接下来就让我们通过手动发送
HTTP 请求的方式,来更加深入地理解一下这个过程。
在 Android 上发送 HTTP 请求的方式一般有两种,HttpURLConnection 和 HttpClient,
HttpURLConnection
package com.app.cceasy.httptest; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity { public static final int SHOW_RESPONSE = 0; Handler handler; TextView tw4Response; Button bn4GetResponse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tw4Response = (TextView) findViewById(R.id.id_textview_show_response); bn4GetResponse = (Button) findViewById(R.id.button_get_response); bn4GetResponse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendRequestWithHttpURLConnection(); } }); handler = new Handler() { @Override public void handleMessage(Message msg) { String msgStr = (String) msg.obj; if(msg.what == SHOW_RESPONSE){ tw4Response.setText(msgStr); } super.handleMessage(msg); } }; } private void sendRequestWithHttpURLConnection(){ new Thread(){ @Override public void run() { HttpURLConnection connection = null; try{ URL url = new URL("http://www.baidu.com/"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); //connection.setRequestMethod("POST"); //BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); //bufferedWriter.write("username=admin&password=123456"); String line; StringBuilder response = new StringBuilder(); while ((line = bufferedReader.readLine()) != null){ System.out.print("-------------"); response.append(line); } Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response.toString(); handler.sendMessage(message); }catch (Exception e){ e.printStackTrace(); }finally { if(connection != null){ connection.disconnect(); } } } }.start(); } }
实际界面: