前言

 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.URLConnection和Apache 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支持4和5

认证(Authorization)

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

支持Basic、Digest 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-Alive,JDK1.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取代,提供更好的性能和更大的灵活性。

apache.http.client.HttpClient的更多相关文章

  1. org.apache.http.client.HttpClient使用方法

    一.org.apache.commons.httpclient和org.apache.http.client区别(转)   官网说明: http://hc.apache.org/httpclient- ...

  2. org.apache.http.client.HttpClient; HttpClient 4.3超时设置

    可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...

  3. android studio没有org.apache.http.client.HttpClient;等包问题 解决方案

    以前用Eclipse做Android开发工具一直使用apache的http做网络请求,最近换用了Android studio发现没有办法引用apache的包,下面是我引用的步骤

  4. Apache HttpComponents Client 4.0快速入门/升级-2.POST方法访问网页

    Apache HttpComponents Client 4.0已经发布多时,httpclient项目从commons子项目挪到了HttpComponents子项目下,httpclient3.1和 h ...

  5. org.apache.commons.httpclient和org.apache.http.client区别(转)

    官网说明: http://hc.apache.org/httpclient-3.x/ Commons HttpClient项目现已结束,不再开发.它已被其HttpClient和HttpCore模块中的 ...

  6. org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决

      org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决 ...

  7. JAVA中使用Apache HttpComponents Client的进行GET/POST请求使用案例

    一.简述需求 平时我们需要在JAVA中进行GET.POST.PUT.DELETE等请求时,使用第三方jar包会比较简单.常用的工具包有: 1.https://github.com/kevinsawic ...

  8. java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig

    java 错误.java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig 本质上是httpClient的j ...

  9. 【apache】使用HttpClient,进行简单网页抓取

    1 package com.lw.httpclient.test; 2 import org.apache.http.client.methods.CloseableHttpResponse; 3 i ...

随机推荐

  1. node.js和express.js安装和使用步骤 [windows]

    PS: NODEJS:https://nodejs.org NPM:https://www.npmjs.com/ 一.node.js安装与配置 到https://nodejs.org/en/downl ...

  2. android学习笔记53——自动朗读TTS

    自动朗读TTS android提供了自动朗读功能--其指的是支持可以对指定文本内容进行朗读,从而发出声音: 同时android的自动朗读支持还允许把文本对应的音频录制成音频文件,方便后续播放. 这种自 ...

  3. Hibernate5.2关联关系之单向一对多(一)

    Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibe ...

  4. ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )

    把apress.pro.asp.net.mvc.4.framework里的CHAPTER 13翻译过来罢了. XD 首先说URL的构造. 其实这个也谈不上构造,只是语法特性吧. 命名参数规范+匿名对象 ...

  5. java io流(字符流) 文件打开、读取文件、关闭文件

    java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public sta ...

  6. Windows下PHP版本选取

    1. 下载地址 http://windows.php.net/download/ 2. PHP大版本 PHP4:由于太古老.对OO支持不力已基本被淘汰. PHP5:分为三个分支——PHP5.2之前的版 ...

  7. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  8. Farey Sequence

    Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rationa ...

  9. ubuntu14.04配置impala的odbc连接

    cdh hive和impala的odbc驱动 http://www.cloudera.com/downloads.html.html 选择 SLES 11 64-bit下载: http://www.c ...

  10. sudo用户管理

    合理分配用户权限 分配方法-sudo /etc/sudoers 用户名 主机名=(运行用户名) 可运行的命令 例1 smb ALL=(ALL) /usr/sbin/useradd 例2 smb ALL ...