Android网络框架学习之HttpClient

简介

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

使用

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接

有些博文使用了 org.apache.commons.httpclient.HttpClient ,有些博文用org.apache.http.client.HttpClient 类。原来,httpclient本来是属于apache-commons 项目下的一个子项目,后来是由Apache HttpComponents项目开发了后面的版本以提供更好的性能和更大的灵活性。commons下的这个httpclient最高版本是目前的3.1,支持HTTP协议1.1,继承了java.net.urlConnection,已经足够提供目前测试的大部分rest服务接口,本文介绍一下用法。这里可以查看所有的API - http://hc.apache.org/httpclient-3.x/apidocs/overview-summary.html

但是这里注意的是在Android新版本的API里已经不再集成HttpClient了。不再提供org.apache.http.*
解决方法
1.eclipse:
libs中加入
org.apache.http.legacy.jar
上面的jar包在:**\android-sdk-windows\platforms\android-23\optional下(需要下载android 6.0的SDK)
2.android studio:
在相应的module下的build.gradle中加入:
android {
useLibrary ‘org.apache.http.legacy’
}注意放置的位置:是在android {}中

get方法获取数据

private void HttpClientGet(){
        Log.d(TAG_STRING,"getMethod");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String line = null;
                    //用于存储数据结果
                    StringBuffer sb = new StringBuffer();
                    //得到HttpClient对象
                    HttpClient getClient = new DefaultHttpClient();
                    //得到HttpGet对象
                    HttpGet request = new HttpGet(uri);
                    //客户端使用GET方式执行请教,获得服务器端的回应response
                    HttpResponse response = getClient.execute(request);
                    //判断请求是否成功
                    if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
                        Log.d(TAG_STRING, "请求服务器端成功");
                        //注意getEntity方法只能被调用一次,多次调用会报Content has been consumed异常
                        //Log.d(TAG_STRING,EntityUtils.toString(response.getEntity()));
                        //获得输入流
                        InputStream inStrem = response.getEntity().getContent();

                        BufferedReader br = new BufferedReader(new InputStreamReader(inStrem));

                        while ((line = br.readLine())!=null){
                            sb.append(line);
                        }
                       // Log.d(TAG_STRING,sb.toString());
                        //关闭输入流
                        inStrem.close();
                    }else {
                        Log.d(TAG_STRING, "请求服务器端失败");
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

    }

此处应注意 getEntity方法只能被调用一次,多次调用会报Content has been consumed异常,解决方法是提前在本地创建一个对象把它存储起来。

package com.example.a20256790.httpclientdemo;


import android.os.Bundle;
import android.util.Log;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


import android.app.Activity;

import org.apache.http.HttpVersion;

import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import java.io.IOException;


public class MainActivity extends Activity {
    final String URL_GET = "https://www.baidu.com";
    final String URL_POST = "https://www.baidu.com";
    final String TAG = "zoky";
    final String userName = "zoky";
    final String userPass = "1234";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getDataOnInternet();

    }


    private void getDataOnInternet() {
        new Thread(new Runnable() {
            @Override
            public void run() {
               // doGet(URL_GET);
                doPost(URL_POST);
            }
        }).start();
    }



    private HttpClient createHttpClient() {
        HttpParams mDefaultHttpParams = new BasicHttpParams();
        //连接超时
        HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000);
        //请求超时
        HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000);
        HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true);
        HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true);
        //创建HttpClient客户端
        HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams);
        return mHttpClient;

    }

    private void doGet(String url) {
        HttpGet mHttpGet = new HttpGet(url);
        mHttpGet.addHeader("Connection", "Keep-Alive");
        try {
            HttpClient mHttpClient = createHttpClient();
            HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
            HttpEntity mHttpEntity = mHttpResponse.getEntity();
            int code = mHttpResponse.getStatusLine().getStatusCode();
            if (null != mHttpEntity) {
                InputStream mInputStream = mHttpEntity.getContent();
                String respose = InputStreamToString(mInputStream);
                Log.i(TAG, "StatusCode:" + code + "   result:\n" + respose);
                mInputStream.close();
            } else {
                Log.d(TAG,"请求服务器失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void doPost(String url) {
        HttpPost mHttpPost = new HttpPost(url);
        mHttpPost.addHeader("Connection", "Keep-Alive");
        try {
            HttpClient mHttpClient = createHttpClient();
            List<NameValuePair> postParams = new ArrayList<>();
            //要传递的参数
            postParams.add(new BasicNameValuePair("username", "moon"));
            postParams.add(new BasicNameValuePair("password", "123"));
            mHttpPost.setEntity(new UrlEncodedFormEntity(postParams));
            HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost);
            HttpEntity mHttpEntity = mHttpResponse.getEntity();
            int code = mHttpResponse.getStatusLine().getStatusCode();
            if (null != mHttpEntity) {
                InputStream mInputStream = mHttpEntity.getContent();
                String respose = InputStreamReader(mInputStream);
                Log.i(TAG, "StatusCode:" + code + "    请求结果:\n" + respose);
                mInputStream.close();
            } else {
                Log.d(TAG,"请求服务器失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    private String InputStreamToString(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        String respose = sb.toString();
        return respose;
    }

}

返回结果:
这里写图片描述
以上就是HttpClient的简单使用方法,但是Android官方已经不再推荐用HttpClient进行Android应用的网络通信了,以上很多方法都已经过时,因此,在开发项目时更加推荐使用最新开源的网络框架,如OKHttp、Restrofit等。

参考博客:采用HttpClient的POST方式、GET方式分别实现登陆案例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值