【重】用 HTTP 协议访问网络

Android 2017-07-30

学习Android,对于 HTTP 协议,
你只需要稍微了解一些就足够了,它的工作原理特别的简单,就是客户端向服务器发出一条
HTTP 请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行
解析和处理就可以了。

比如说 WebView 控件,其实也就是我们向百度的服务器发起了一条 HTTP 请求,
接着服务器分析出我们想要访问的是百度的首页,于是会把该网页的 HTML 代码进行返回,
然后 WebView再调用手机浏览器的内核对返回的 HTML代码进行解析,最终将页面展示出来。

简单来说,WebView 已经在后台帮我们处理好了发送 HTTP 请求、接收服务响应、解析
返回数据,以及最终的页面展示这几步工作,不过由于它封装得实在是太好了,反而使得我
们不能那么直观地看出 HTTP 协议到底是如何工作的。因此,接下来就让我们通过手动发送
HTTP 请求的方式,来更加深入地理解一下这个过程。

使用 HttpURLConnection

在 Android 上发送 HTTP 请求的方式一般有两种,HttpURLConnection 和 HttpClient

HttpURLConnection

首先需要获取到 HttpURLConnection 的实例,一般只需 new 出一个 URL 对象,并传入
目标的网络地址,然后调用一下 openConnection()方法即可,如下所示:

URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

得到了 HttpURLConnection 的实例之后,我们可以设置一下 HTTP 请求所使用的方法。
常用的方法主要有两个,GET 和 POST。GET 表示希望从服务器那里获取数据,而 POST 则
表示希望提交数据给服务器。写法如下:

connection.setRequestMethod("GET");

接下来就可以进行一些自由的定制了,比如设置连接超时、读取超时的毫秒数,以及服
务器希望得到的一些消息头等。这部分内容根据自己的实际情况进行编写,示例写法如下:
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);


(接下来就是IO流的操作)
之后再调用 getInputStream()方法就可以获取到服务器返回的输入流了,剩下的任务就是
对输入流进行读取,如下所示:
InputStream in = connection.getInputStream();
最后可以调用 disconnect()方法将这个 HTTP 连接关闭掉,如下所示:
connection.disconnect();

MainActivity.java

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static final int SHOW_RESPONSE=0;
    private Button sendRequst;
    private TextView responseText;
    private Handler handler=new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what){
                case SHOW_RESPONSE:
                    String response= (String) msg.obj;
                    Log.d("mainaty",response);
                    responseText.setText(response);

            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendRequst= (Button) findViewById(R.id.send_request);
        responseText= (TextView) findViewById(R.id.response_text);
        sendRequst.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.send_request:
                sendRequstWithHttpURLConnection();

        }
    }

    private void sendRequstWithHttpURLConnection(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                String getinfo;
               getinfo= HttpUtils.sendHttpRequest("http://sejila.cn:8080/GasEI2/client?type=top&deviceId=all&topNum=1");//HttpUtils是发送http请求的类
              Message message=new Message();
                message.what=SHOW_RESPONSE;
                message.obj=getinfo;
                Log.d("mainaty", (String) message.obj);

                handler.sendMessage(message);
            }
        }).start();
    }
}

可以看到,我们在 Send Request 按钮的点击事件里调用了 sendRequestWithHttpURLConnection()方法,在这个方法中先是开启了一个子线程,然后在子线程里使用 HttpURLConnection发出一条 HTTP 请求,请求的目标地址就是百度的首页。接着利用 BufferedReader 对服务器
返回的流进行读取,并将结果存放到了一个 Message 对象中。这里为什么要使用 Message 对象呢?当然是因为子线程中无法对 UI 进行操作了。我们希望可以将服务器返回的内容显示到界面上,所以就创建了一个 Message 对象,并使用 Handler 将它发送出去。之后又在 Handler
的 handleMessage()方法中对这条 Message 进行处理,最终取出结果并设置到 TextView 上。


本文由 方方無 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论

shijiebei 365bet manbetx 188bet xinshui caipiao 95zz tongbaoyule beplay 88bifa 18luck betway bwin hg0088 aomenjinshayulecheng ca88 shenbotaiyangcheng vwin w88 weide