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.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 |
不支持 |
支持 |
|
请求输出流 |
请求发送之前,所有的数据都被缓存起来 |
通过socket直接输出HttpOutputStream |
|
响应输入流 |
JDK1.2-支持,1.3+不支持chunked encoding(不支持大多数推送服务器的响应) |
支持 |
|
长连接 |
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的更多相关文章
- org.apache.http.client.HttpClient使用方法
一.org.apache.commons.httpclient和org.apache.http.client区别(转) 官网说明: http://hc.apache.org/httpclient- ...
- org.apache.http.client.HttpClient; HttpClient 4.3超时设置
可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...
- android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
以前用Eclipse做Android开发工具一直使用apache的http做网络请求,最近换用了Android studio发现没有办法引用apache的包,下面是我引用的步骤
- Apache HttpComponents Client 4.0快速入门/升级-2.POST方法访问网页
Apache HttpComponents Client 4.0已经发布多时,httpclient项目从commons子项目挪到了HttpComponents子项目下,httpclient3.1和 h ...
- org.apache.commons.httpclient和org.apache.http.client区别(转)
官网说明: http://hc.apache.org/httpclient-3.x/ Commons HttpClient项目现已结束,不再开发.它已被其HttpClient和HttpCore模块中的 ...
- org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决
org.apache.http.client.CircularRedirectException: Circular redirect to "http://xxx"问题解决 ...
- JAVA中使用Apache HttpComponents Client的进行GET/POST请求使用案例
一.简述需求 平时我们需要在JAVA中进行GET.POST.PUT.DELETE等请求时,使用第三方jar包会比较简单.常用的工具包有: 1.https://github.com/kevinsawic ...
- java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig
java 错误.java.lang.NoClassDefFoundError: org/apache/http/client/config/RequestConfig 本质上是httpClient的j ...
- 【apache】使用HttpClient,进行简单网页抓取
1 package com.lw.httpclient.test; 2 import org.apache.http.client.methods.CloseableHttpResponse; 3 i ...
随机推荐
- DB设计原则(二)如何拆、分表
不要盲目为了减少表的数量,而使某一张表的字段过多,而导致表冗余列存在
- 【转】前端精选文摘:BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- 5、Linux 系统基本文件管理
1.Linux系统目录结构 /etc ----> 配置文件 /boot ----> 引导分区/挂载点, boot loader 的静态链接文件,存放与Linux启动相关的程序 ...
- Android广播机制简介
为什么说Android中的广播机制更加灵活呢?这是因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来 ...
- FW开发代码规范---小任性(1)
---恢复内容开始--- 使代码容易理解的方法无非是准确地注释和增强代码一致性. 一个好的准确的注释让代码容易理解是显然的.而代码的一致性,使编程风格统一,容易在内部形成一些共识.习惯用语和模式. 一 ...
- MySQL-(Master-Slave)配置
1.两台机器,安装好版本一致的MySQL 192.168.29.128 (master) MySQL-5.6.21 192.168.29.129 (slave) MySQL-5.6.21 2.配置ma ...
- 35. Binary Tree Level Order Traversal && Binary Tree Level Order Traversal II
Binary Tree Level Order Traversal OJ: https://oj.leetcode.com/problems/binary-tree-level-order-trave ...
- CultureInfo 类
https://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo(VS.80).aspx 区域性名称 区域性标识符 语 ...
- 简单实用的Windows命令(一)
前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...
- 洛谷P3367 【模板】并查集
P3367 [模板]并查集 293通过 551提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 不知道哪错了 为啥通不过最后三个节点 题解 不懂为什么MLE 最后一个数 ...