zoukankan      html  css  js  c++  java
  • apache.http.client.HttpClient

    前言

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

    java.net.HttpURLConnection

    HttpURLConnection是java的标准类,HttpURLConnection继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

    • int getResponseCode():获取服务器的响应代码。

    • String getResponseMessage():获取服务器的响应消息。

    • String getResponseMethod():获取发送请求的方法。

    • void setRequestMethod(String method):设置发送请求的方法。

      在一般情况下,如果只是需要Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。

      为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。

     

    Org.apache.http.client

    使用HttpClient发送请求、接收响应很简单,只要如下几步即可。

    1. 创建HttpClient对象。

    2. 如果需要发送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对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

    另外,Android已经成功地集成了HttpClient,这意味着开发人员可以直接在Android应用中使用Httpclient来访问提交请求、接收响应。

    扩展知识:了解HttpCore

    项目示例

    /**

     * 向远程的url服务器进行post一个数据包

     *

     * @param url

     *            需要进行post的服务器

     * @param paras

     *            数据包中的参数

     * @return

     * @throws Exception

     */

    public static String postData(String url, String data,

    String uploadEncoding, String responseEncoding) throws Exception {

    RequestConfig config = RequestConfig.custom().build();

    HttpClient client = HttpClients.custom()

    .setDefaultRequestConfig(config).build();

    HttpClientContext context = HttpClientContext.create();

    HttpPost post = new HttpPost(url);

    if (StringUtils.isNotBlank(data)) {

    post.setEntity(new StringEntity(data, uploadEncoding));

    }

    CloseableHttpResponse response = (CloseableHttpResponse) client

    .execute(post, context);

    return EntityUtils.toString(response.getEntity(), responseEncoding);

    }

    2.URLConnection

    Java自带java.net

    public static String getFromSpecialUrl(String str,String param) throws Exception{

    log.info("request   core   zy    ++++++++++++++++++++++++++++++++++++++++++");

    URL url = null;

    URLConnection conn = null;

    BufferedReader bufferedReader = null;

    InputStream inputStream = null;

    StringBuffer responseXml = null;

    PrintWriter output = null;

    String result;

    try {

    url = new URL(str);

    log.info("url   "+url);

    conn = (URLConnection) url.openConnection();

    conn.setDoInput(true);

    conn.setDoOutput(true);

    conn.setConnectTimeout(1000);

    output = new PrintWriter(conn.getOutputStream());

    output.print(param.toString());

    output.close();

    responseXml = new StringBuffer();

    inputStream = conn.getInputStream();

    bufferedReader = new BufferedReader(new InputStreamReader(

    inputStream, "GBK"));

    String s;

    while ((s = bufferedReader.readLine()) != null) {

    responseXml.append(s);

    }

    bufferedReader.close();

    } catch (IOException e) {

    e.printStackTrace();

    System.out.println("系统处理异常!");

    }

    result = responseXml.toString();

    System.out.println("接收到的报文:" + result);

    return result;

    }

    Java.net.URLConnectionApache HTTPClient的主要区别对比

    对比项目

    URLConnection

    HTTPClient

    提交方式(Methods)

    HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS

    HEAD, GET, POST, PUT, DELETE, TRACE, OPTIONS, WEBDav, IPP, 甚至各种自定义提交方式

    响应(Response Codes)

    只能获取http状态码小于400的状态码,响应头信息(headers),响应内容.对于响应状态码为4xx或者5xx获取response的任何信息都只会抛出IOException

    任何时候都可以获取响应的任何信息:响应状态码,响应头信息,响应内容信息等等。

    代理和SOCKS

    支持,SOCKS仅支持4

    支持,SOCKS支持45

    认证(Authorization)

    支持Basic、早期的Digest JDK1.2+(不支持现在的Digest authentication),甚至不能处理apache返回的Digest信息

    支持BasicDigest Authentication、自定义的其他认证方案

    Cookies

    不支持

    支持

    请求输出流
    (True request output streams)

    请求发送之前,所有的数据都被缓存起来

    通过socket直接输出HttpOutputStream

    响应输入流
    (True response input streams)

    JDK1.2-支持,1.3+不支持chunked encoding(不支持大多数推送服务器的响应)

    支持

    长连接
    (Persistent Connections)

    JDK1.2- HTTP/1.0 Keep-AliveJDK1.3+  HTTP/1.1 Persistent

    支持HTTP/1.0 Keep-Alive HTTP/1.1 Persistent

    Pipelining of Requests

    不支持

    支持

    设置超时

    不支持

    支持

    处理HTTP之外的协议

    支持如:ftp, gopher, mailto,文件系统

    不支持

    开源

    处理HTTP之外的协议

    支持如:ftp, gopher, mailto,文件系统

    不支持

    apache.commons.Httpclient.HttpClient与apache.http.client.HttpClient区别

    Commons的HttpClient项目现在是生命的尽头,不再被开发。它已被Apache HttpComponents项目HttpClient和HttpCore取代,提供更好的性能和更大的灵活性。
  • 相关阅读:
    关于selenium中的三种等待方式与EC模块的知识
    re.findall用法
    链表及链表的逆置
    通过两个队列实现一个栈
    flask与Django框架的区别
    http协议与https协议
    Maven系列教材 (四)- 通过命令行创建Maven风格的Java项目
    Maven系列教材 (三)- 仓库概念,下载与配置
    Maven系列教材 (二)- 下载与配置Maven
    Maven系列教材 (一)- 什么是Maven
  • 原文地址:https://www.cnblogs.com/liuyandeng/p/5824041.html
Copyright © 2011-2022 走看看