目录

前言

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。

虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

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

HttpClient 功能介绍

以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。

  1. 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
  2. 支持自动转向
  3. 支持 HTTPS 协议
  4. 支持代理服务器等

下面将逐一介绍怎样使用这些功能。首先,我们必须安装好 HttpClient。

  • HttpClient 可以在http://jakarta.apache.org/commons/httpclient/downloads.html下载
  • HttpClient 用到了 Apache Jakarta common 下的子项目 logging 和 codec

HttpClient 基本功能的使用

GET 方法
使用 HttpClient 需要以下 6 个步骤:

  1. 创建 HttpClient 的实例
  2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
  3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
  4. 读 response
  5. 释放连接。无论执行方法是否成功,都必须释放连接
  6. 对得到后的内容进行处理

实例

  1. 这个是封装好的工具类
public class HttpClientUtils {
    private static Logger log = Logger.getLogger(HttpClientUtils.class);

    public static String post(String url, Map<String, String> params) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String body = null;
        try {
            log.info("create httppost:" + url);
            HttpPost post = postForm(url, params);
            body = invoke(httpclient, post);
            httpclient.close();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return body;
    }

    public static String get(String url) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        String body = null;
        try {
            log.info("create httppost:" + url);
            HttpGet get = new HttpGet(url);
            body = invoke(httpclient, get);
            httpclient.close();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return body;
    }

    private static String invoke(HttpClient httpclient, HttpUriRequest httpost) {
        HttpResponse response = sendRequest(httpclient, httpost);
        String body = paseResponse(response);
        return body;
    }

    private static String paseResponse(HttpResponse response) {
        log.info("get response from http server..");
        HttpEntity entity = response.getEntity();
        log.info("response status: " + response.getStatusLine());
        String charset = ContentType.get(entity).getCharset().displayName();
        log.info(charset);
        String body = null;
        try {
            body = EntityUtils.toString(entity);
            log.info(body);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

        return body;
    }

    private static HttpResponse sendRequest(HttpClient httpclient,
            HttpUriRequest httpost) {
        log.info("execute post...");
        HttpResponse response = null;

        try {
            response = httpclient.execute(httpost);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return response;
    }

    private static HttpPost postForm(String url, Map<String, String> params) {
        HttpPost httpost = new HttpPost(url);
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();

        Set<String> keySet = params.keySet();
        for (String key : keySet) {
            nvps.add(new BasicNameValuePair(key, params.get(key)));
        }
        try {
            log.info("set utf-8 form entity to httppost");
            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

        return httpost;
    }
}
  1. 调用方法
Map<String, String> params = new HashMap<String, String>();  
params.put("name", name);  
params.put("password", password);
      
String result= HttpClientUtil.post(loginUrl, params);  
log.info(result);  

参考资料

官方httpclient使用指南
官方httpclient Examples