Android使用HTTP协议访问网络——HttpClient

套路篇

1.HttpClient是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient的实例

HttpClient httpClient=new DefaultHttpClient();

2.如果想要发起一条GET请求,就创建一个HttpGet对象,并传入目标网络的对象,然后调用HtttpClient中的excute()方法:

HttpGet httpGet=new HttpGet("http://www.baidu.com");
HttpResponse httpResponse=httpClient.execute(httpGet);

如果想发起一条POST请求会比GET复杂一点,首先创建一个HttpPost对象,并传入目标网址

HttpPost httpPost=new HttpPost("http/:www.baidu.com");

然后通过NameValuePair集合来存放待提交的数据,并将这个参数传入到一个UrlEncodedFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlEncodedFormEntity传入

List<NameValuePair> params=new ArrayList<NameValuePair>();

params.add(new BasicNameValuePair("username","admin"));

params.add(new BasicNameValuepair("password","123456"));

UrlEncodeFormEntity entity=new UrlEncodeFormEntity(params,"utf-8");

httpPost.setEntity(entity);

接下来就和GET方法一样啦,httpClient.execute(httpPost);

3.执行完execute()方法后会返回一个HttpResponse对象,服务器返回的数据都在里面,通常我们会先取出服务器返回的状态码,如果等于200,则说明请求响应成功

if(httpResponse.getStatusLine().getStatueCode()==200){

  //请求和响应都成功了

}

4.读取服务器返回的具体内容,可以调用getEntity()访问获取到一个HttpEntity实例,然后调用EntityUtils.toString()这个静态类将HttpEntity转换成字符串

HttpEntity entity=httpResponse.getEntity();

String response=EntityUtils.toString(entity);

如果返回的数据带有中文,转换的时候需要将字符集指定为utf-8

String response=EntityUtils.toString(entity,"utf-8");

实战篇

MainActivity

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    public static final int SHOW_RESPONSE=0;//用于更新操作
    private Button sendRequest_Button;
    private TextView responseText;




    //用于处理和发送消息的Handler
    private Handler handler=new Handler(){
        public void handleMessage(Message msg){
            switch (msg.what){
                case SHOW_RESPONSE:
                    String response=(String)msg.obj;
                    responseText.setText(response);
            }
        }
    };




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendRequest_Button=(Button)findViewById(R.id.sendrequest);
        responseText=(TextView)findViewById(R.id.response_text);
        sendRequest_Button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.sendrequest){
            sendRequestWithHttpClient();
        }
    }

    public void sendRequestWithHttpClient(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    HttpClient httpClient=new DefaultHttpClient();
                    HttpGet httpGet=new HttpGet("http://www.baidu.com");
                    HttpResponse httpResponse=httpClient.execute(httpGet);
                    if(httpResponse.getStatusLine().getStatusCode()==200){
                        //请求和响应都成功了
                        HttpEntity entity=httpResponse.getEntity();
                        String response= EntityUtils.toString(entity, "utf-8");

                        Message message=new Message();
                        message.what=SHOW_RESPONSE;
                        //将服务器返回的结果保存到Message中
                        message.obj=response.toString();
                        handler.sendMessage(message);

                    }

                }catch(Exception e){

                }finally {

                }

            }
        }).start();

    }

}

AndroidManifest

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/sendrequest"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Send Request"/>

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/response_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>
</LinearLayout>

 

posted @ 2016-08-12 01:08  因吹斯汀  阅读(1519)  评论(0编辑  收藏  举报