Android中的网络请求之HttpClient

HttpClient简介

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。

HttpClient使用步骤如下

1.创建HttpClient对象

2.如果需要发送GET请求,则创建HttpGet对象;如果需要发送POST请求,则创建HttpPost对象。

3.对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数

4.调用HttpClient对象的execute()方法发送请求,执行该方法返回一个HttpResponse。

5.调用HttpResponse的getAllHeader()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容;程序可通过该对象获取服务器的响应内容。

如下实现一个简单的httpget请求方式的代码

public void requestweather(View v){
new Thread(){
public void run() {

            //1.创建出一个HttpClient
            HttpClient hc=new DefaultHttpClient();

            //2.创建HttpGet对象
            try {
                //对参数进行编码 
                String citydata=URLEncoder.encode("北京", "utf-8");
                HttpGet hg=new HttpGet("http://v.juhe.cn/weather/index?cityname="+citydata+"&dtype=&format=&key=d518c53e9f8bd40ba1784ca8448223b8");

                //3.执行请求
                HttpResponse response = hc.execute(hg);

                //4.得到结果码,并判断 
                int code=response.getStatusLine().getStatusCode();
                if(code==200){

                    //5.得到结果数据
                    HttpEntity result = response.getEntity();

                    //将HttpEntity转换成String字符串
                    String content=EntityUtils.toString(result);
                    Log.d("zzz", content);
                }
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
    }.start();

如下实现一个简单的httppost请求方式的代码:

public class MainActivity extends Activity {

private List<Weixin> lists;

private Handler myHandler=new Handler(){
    public void handleMessage(android.os.Message msg) {

        //接收数据
        lists=(List<Weixin>) msg.obj;

        //更新listview
        MyAdapter adapter=new MyAdapter();
        lv.setAdapter(adapter);

    };

};

private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv = (ListView) findViewById(R.id.lv);
}


class MyAdapter extends BaseAdapter{

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return lists.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2) {

        arg1=View.inflate(MainActivity.this, R.layout.item, null);
        TextView tvS=(TextView) arg1.findViewById(R.id.tv_source);
        TextView tvT=(TextView) arg1.findViewById(R.id.tv_title);

        tvS.setText(lists.get(arg0).getSource());
        tvT.setText(lists.get(arg0).getTitle());


        return arg1;
    }

}
public void requestdata(View v){
    //1.开启子线程
    new Thread(){
        public void run() {

            //1.创建httpclient对象
            HttpClient hc=new DefaultHttpClient();

            //2.使用post请求,HttpPost  get,HttpGet,需要添加请求的网址
            HttpPost hp=new HttpPost("http://v.juhe.cn/weixin/query");


            //将请求的参数放到此集合对象中
            List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
            //BasicNameValuePair:键值对 
            parameters.add(new BasicNameValuePair("key", "88f7bbc507e3ecacfaeab2b47dd8936f"));
            parameters.add(new BasicNameValuePair("pno", "1"));
            parameters.add(new BasicNameValuePair("ps", "10"));
            parameters.add(new BasicNameValuePair("pno", "1"));
            parameters.add(new BasicNameValuePair("dtype", "json"));
        //3.设置参数数据  HttpEntity是接口
            HttpEntity entity;
            try {
                entity = new UrlEncodedFormEntity(parameters, "utf-8");
                hp.setEntity(entity);
                //4.执行请求
                HttpResponse response = hc.execute(hp);
                //5.得到结果码,判断 
                int code=response.getStatusLine().getStatusCode();
                if(code==200){
                    //6.获得结果 
                    HttpEntity result = response.getEntity();
                    String content=EntityUtils.toString(result);
                    Log.d("zzz", content);
                    //进行解析
                    Gson gs=new Gson();
                    Result weixinResult=gs.fromJson(content, Result.class);
                    //发送消息,更新界面
                    Message msg=Message.obtain();
                    msg.obj=weixinResult.getResult().getList();
                    myHandler.sendMessage(msg);
                }
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
    }.start();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值