HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。一个最简单的调用如下:
01.
import
java.io.IOException;
02.
import
org.apache.http.HttpResponse;
03.
import
org.apache.http.client.ClientProtocolException;
04.
import
org.apache.http.client.HttpClient;
05.
import
org.apache.http.client.methods.HttpGet;
06.
import
org.apache.http.client.methods.HttpUriRequest;
07.
import
org.apache.http.impl.client.DefaultHttpClient;
08.
09.
public
class
Test {
10.
public
static
void
main(String[] args) {
11.
12.
13.
HttpClient httpClient =
new
DefaultHttpClient();
14.
15.
16.
HttpUriRequest request =
18.
19.
20.
System.out.println(request.getRequestLine());
21.
try
{
22.
23.
HttpResponse response = httpClient.execute(request);
24.
25.
26.
System.out.println(response.getStatusLine());
27.
}
catch
(ClientProtocolException e) {
28.
29.
e.printStackTrace();
30.
}
catch
(IOException e) {
31.
32.
e.printStackTrace();
33.
}
34.
}
35.
}
如果HTTP服务器正常并且存在相应的服务,则上例会打印出两行结果:
GET http://localhost/index.html HTTP/1.1
HTTP/1.1 200 OK
核心对象httpClient的调用非常直观,其execute方法传入一个request对象,返回一个response对象。使用httpClient发出HTTP请求时,系统可能抛出两种异常,分别是ClientProtocolException和IOException。第一种异常的发生通常是协议错误导致,如在构造HttpGet对象时传入的协议不对(例如不小心将”http”写成”htp”),或者服务器端返回的内容不符合HTTP协议要求等;第二种异常一般是由于网络原因引起的异常,如HTTP服务器未启动等。
从实际应用的角度看,HTTP协议由两大部分组成:HTTP请求和HTTP响应。那么HttpClient程序包是如何实现HTTP客户端应用的呢?实现过程中需要注意哪些问题呢?
HTTP请求
HTTP 1.1由以下几种请求组成:GET, HEAD, POST, PUT, DELETE, TRACE and OPTIONS, 程序包中分别用HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions 这几个类创建请求。所有的这些类均实现了HttpUriRequest接口,故可以作为execute的执行参数使用。
所有请求中最常用的是GET与POST两种请求,与创建GET请求的方法相同,可以用如下方法创建一个POST请求:
1.
HttpUriRequest request =
new
HttpPost(
HTTP请求格式告诉我们,有两个位置或者说两种方式可以为request提供参数:request-line方式与request-body方式。
request-line
request-line方式是指在请求行上通过URI直接提供参数。
(1)
我们可以在生成request对象时提供带参数的URI,如:
1.
HttpUriRequest request =
new
HttpGet(
(2)
另外,HttpClient程序包为我们提供了URIUtils工具类,可以通过它生成带参数的URI,如:
1.
URI uri = URIUtils.createURI(
"http"
,
"localhost"
, -
1
,
"/index.html"
,
2.
"param1=value1¶m2=value2"
,
null
);
3.
HttpUriRequest request =
new
HttpGet(uri);
4.
System.out.println(request.getURI());
上例的打印结果如下:
http://localhost/index.html?param1=value1¶m2=value2
(3)
需要注意的是,如果参数中含有中文,需将参数进行URLEncoding处理,如:
1.
String param =
"param1="
+ URLEncoder.encode(
"中国"
,
"UTF-8"
) +
"¶m2=value2"
;
2.
URI uri = URIUtils.createURI(
"http"
,
"localhost"
,
8080
,
3.
"/sshsky/index.html"
, param,
null
);
4.
System.out.println(uri);
上例的打印结果如下:
http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2
(4)
对于参数的URLEncoding处理,HttpClient程序包为我们准备了另一个工具类:URLEncodedUtils。通过它,我们可以直观的(但是比较复杂)生成URI,如:
1.
List<NAMEVALUEPAIR> params =
new
ArrayList<NAMEVALUEPAIR>();
2.
params.add(
new
BasicNameValuePair(
"param1"
,
"中国"
));
3.
params.add(
new
BasicNameValuePair(
"param2"
,
"value2"
));
4.
String param = URLEncodedUtils.format(params,
"UTF-8"
);
5.
URI uri = URIUtils.createURI(
"http"
,
"localhost"
,
8080
,
6.
"/sshsky/index.html"
, param,
null
);
7.
System.out.println(uri);
上例的打印结果如下:
http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD¶m2=value2
request-body
与request-line方式不同,request-body方式是在request-body中提供参数,此方式只能用于POST请求。在HttpClient程序包中有两个类可以完成此项工作,它们分别是UrlEncodedFormEntity类与MultipartEntity类。这两个类均实现了HttpEntity接口。
(1)
使用最多的是UrlEncodedFormEntity类。通过该类创建的对象可以模拟传统的HTML表单传送POST请求中的参数。如下面的表单:
2.
<
input
type
=
"text"
name
=
"param1"
value
=
"中国"
/>
3.
<
input
type
=
"text"
name
=
"param2"
value
=
"value2"
/>
4.
<
inupt
type
=
"submit"
value
=
"submit"
/>
5.
</
form
>
我们可以用下面的代码实现:
1.
List<NAMEVALUEPAIR> formParams =
new
ArrayList<NAMEVALUEPAIR>();
2.
formParams.add(
new
BasicNameValuePair(
"param1"
,
"中国"
));
3.
formParams.add(
new
BasicNameValuePair(
"param2"
,
"value2"
));
4.
HttpEntity entity =
new
UrlEncodedFormEntity(formParams,
"UTF-8"
);
5.
6.
HttpPost request =
new
HttpPost(“http:
7.
request.setEntity(entity);
当然,如果想查看HTTP数据格式,可以通过HttpEntity对象的各种方法取得。如:
01.
List<NAMEVALUEPAIR> formParams =
new
ArrayList<NAMEVALUEPAIR>();
02.
formParams.add(
new
BasicNameValuePair(
"param1"
,
"中国"
));
03.
formParams.add(
new
BasicNameValuePair(
"param2"
,
"value2"
));
04.
UrlEncodedFormEntity entity =
new
UrlEncodedFormEntity(formParams,
"UTF-8"
);
05.
06.
System.out.println(entity.getContentType());
07.
System.out.println(entity.getContentLength());
08.
System.out.println(EntityUtils.getContentCharSet(entity));
09.
System.out.println(EntityUtils.toString(entity));
上例的打印结果如下:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
39
UTF-8
param1=%E4%B8%AD%E5%9B%BD¶m2=value2
(2)
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是MultipartEntity类。此类同样实现了HttpEntity接口。如下面的表单:
2.
enctype
=
"multipart/form-data"
>
3.
<
input
type
=
"text"
name
=
"param1"
value
=
"中国"
/>
4.
<
input
type
=
"text"
name
=
"param2"
value
=
"value2"
/>
5.
<
input
type
=
"file"
name
=
"param3"
/>
6.
<
inupt
type
=
"submit"
value
=
"submit"
/>
7.
</
form
>
我们可以用下面的代码实现:
1.
MultipartEntity entity =
new
MultipartEntity();
2.
entity.addPart(
"param1"
,
new
StringBody(
"中国"
, Charset.forName(
"UTF-8"
)));
3.
entity.addPart(
"param2"
,
new
StringBody(
"value2"
, Charset.forName(
"UTF-8"
)));
4.
entity.addPart(
"param3"
,
new
FileBody(
new
File(
"C:\\1.txt"
)));
5.
6.
HttpPost request =
new
HttpPost(“http:
7.
request.setEntity(entity);
HTTP响应
HttpClient程序包对于HTTP响应的处理较之HTTP请求来说是简单多了,其过程同样使用了HttpEntity接口。我们可以从HttpEntity对象中取出数据流(InputStream),该数据流就是服务器返回的响应数据。需要注意的是,HttpClient程序包不负责解析数据流中的内容。如:
01.
HttpUriRequest request = ...;
02.
HttpResponse response = httpClient.execute(request);
03.
04.
05.
HttpEntity entity = response.getEntity();
06.
07.
08.
System.out.println(entity.getContentType());
09.
System.out.println(entity.getContentLength());
10.
System.out.println(EntityUtils.getContentCharSet(entity));
11.
12.
13.
InputStream stream = entity.getContent();
14.
15.
16.
分享到:
相关推荐
随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...
《Apache Commons HttpClient 3.1:HTTP客户端编程的基石》 ...然而,需要注意的是,HttpClient 3.1已不再维护,最新的稳定版本为HttpClient 4.x,对于新项目建议使用更现代的版本以获取更好的性能和兼容性。
虽然HttpClient 3.1是一个稳定版本,但随着技术的发展,Apache已经推出了更现代的HTTP客户端库Apache HTTP Components (HttpClient 4.x),提供了更多的功能和改进。开发者应考虑根据项目需求,适时升级到更现代的...
`经典教程httpClient4.docx`和`httpclient4中文版帮助文档.pdf`可能是HttpClient 4.x版本的详细教程,包括如何配置HttpClient、创建请求、解析响应、处理异常等内容,对于学习HttpClient的使用非常有帮助。...
- **代码兼容性**:SD 3.X 兼容大部分2.X版本的代码,使得从2.X迁移到3.X相对容易,并且会提供详细的迁移指南。 - **稳定性**:SD 项目经过多年发展,已经历多个线上项目的迭代,稳定性极佳。 - **功能模块丰富**:...
8. **HTTP/1.1和HTTP/2支持**:HttpClient 4.x版本开始支持HTTP/2协议,提供更高效的网络通信。 9. **Cookie管理**:HttpClient支持自动处理服务器返回的Cookie,维护会话状态,便于实现登录等功能。 10. **多部分...
这个压缩包包含两份文档,一份是.docx格式,一份是.pdf格式,两者内容相同,都是关于HttpClient 4.3的中文版指南。 HttpClient的核心功能在于它能够创建和管理HTTP连接,发送请求,接收响应,并支持各种HTTP方法如...
随着 HttpClient 更新至更高版本,例如 HttpClient 4.5.x 或更高,可能会有新的特性和改进。开发者应当关注最新版本的文档以获取更全面、最新的使用指南。 总结,HttpClient 是一个强大且灵活的 Java HTTP 客户端库...
Angular5.x中文手册是一份涵盖了从基础知识到高级主题的全面学习指南。它不仅提供了关于如何安装和设置Angular环境的指导,还深入讲解了Angular的核心概念,如组件、服务、数据绑定、事件绑定、路由和HTTP通信等。本...
9. **最新版本特性**:随着技术的发展,HttpClient的最新版本(如4.x或5.x)引入了更多新功能和改进,如HTTP/2支持、连接管理和性能优化等。 10. **实战应用**:本教程将通过一系列实例,演示如何在实际项目中使用...
本书主要介绍了Android 2.x版本的应用开发技术,适合初学者快速入门Android开发,并逐步进阶至高级主题。内容涵盖Android平台的基本概念、应用设计原理以及具体的开发技巧。 #### 三、核心知识点详解 ##### 1. ...
Java开发工具包(Java Development...在安装和使用JDK 11.0.14_windows-x64_bin.exe时,确保操作系统兼容,并遵循官方的安装指南,以确保顺利进行开发工作。同时,保持对JDK的更新,以便利用最新的性能改进和安全修复。
### Visual Basic 网络编程:构建高效网络应用的指南 #### 一、网络编程基础 网络编程是指在计算机之间通过网络发送和接收数据的过程。这通常涉及客户端和服务器之间的通信,其中客户端发起请求,而服务器处理这些...
**C# 百度OCR API 实战指南** 在IT领域,光学字符识别(OCR)技术是一种将图像中的文字转换为可编辑、可搜索文本的重要工具。百度提供了强大的OCR API,可以方便开发者集成到各种应用程序中,包括C#平台。本教程将...
总的来说,"jdk-11.0.7_windows-x64_bin.zip"是Java开发的重要工具,适用于64位Windows系统的开发者,提供了丰富的API和工具,以支持高效、可靠的Java应用程序开发。对于初次接触Java 11的用户,理解其新特性并熟悉...
- **网络请求**:应用可能使用HTTP库,如Apache HttpClient或OkHttp,来从服务器获取天气数据。这涉及到JSON解析,如使用Gson或Jackson将服务器返回的数据转换为Java对象。 - **数据存储**:Android的...
《Elasticsearch IK 分词器插件详解及安装指南》 Elasticsearch 是一款功能强大的开源搜索引擎,广泛应用于全文检索、数据分析等领域。为了更好地适应中文处理,社区开发了一系列的分词器插件,其中最知名的就是IK...
- **google-api-client-android2-1.8.0-beta-sources.jar** 和 **google-api-client-android2-1.8.0-beta.jar**:这些是专门为Android 2.x版本优化的库文件,包含了适配Android平台的特定功能和优化。 - **LICENSE....
4. **动态类型(VarHandle)**:提供了一种低级别的、类型安全的方式来访问和修改对象的字段,支持内存模型的严格规定,用于实现高效的并发编程。 5. **改进的垃圾收集器(G1 Garbage Collector)**:在JDK 11中,...
这个应用可能包含了初始化`HttpClient`、`HttpURLConnection`,设置`SSLSocketFactory`,以及处理证书验证的代码。通过运行这个应用,开发者可以理解在不同情况下如何在Android中实现HTTPS通信。 总的来说,本项目...