`
ssxxjjii
  • 浏览: 951052 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HttpClient4.x应用指南

阅读更多

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.        // HTTP请求
16.        HttpUriRequest request =
17.                new HttpGet("http://localhost/index.html");
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(
2.        "http://localhost/index.html");

HTTP请求格式告诉我们,有两个位置或者说两种方式可以为request提供参数:request-line方式与request-body方式。

request-line

request-line方式是指在请求行上通过URI直接提供参数。
(1)
我们可以在生成request对象时提供带参数的URI,如:

 
1.HttpUriRequest request = new HttpGet(
2.        "http://localhost/index.html?param1=value1&;param2=value2");

(2)
另外,HttpClient程序包为我们提供了URIUtils工具类,可以通过它生成带参数的URI,如:

 
1.URI uri = URIUtils.createURI("http", "localhost", -1, "/index.html",
2.    "param1=value1&param2=value2", null);
3.HttpUriRequest request = new HttpGet(uri);
4.System.out.println(request.getURI());

上例的打印结果如下:

http://localhost/index.html?param1=value1&param2=value2

(3)
需要注意的是,如果参数中含有中文,需将参数进行URLEncoding处理,如:

 
1.String param = "param1=" + URLEncoder.encode("中国", "UTF-8") + "&param2=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&param2=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&param2=value2

request-body

与request-line方式不同,request-body方式是在request-body中提供参数,此方式只能用于POST请求。在HttpClient程序包中有两个类可以完成此项工作,它们分别是UrlEncodedFormEntity类与MultipartEntity类。这两个类均实现了HttpEntity接口。
(1)
使用最多的是UrlEncodedFormEntity类。通过该类创建的对象可以模拟传统的HTML表单传送POST请求中的参数。如下面的表单:

 
1.<form action="http://localhost/index.html" method="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://localhost/index.html”);
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&param2=value2

(2)
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是MultipartEntity类。此类同样实现了HttpEntity接口。如下面的表单:

 
1.<form action="http://localhost/index.html" method="POST"
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://localhost/index.html”);
7.request.setEntity(entity);

HTTP响应

HttpClient程序包对于HTTP响应的处理较之HTTP请求来说是简单多了,其过程同样使用了HttpEntity接口。我们可以从HttpEntity对象中取出数据流(InputStream),该数据流就是服务器返回的响应数据。需要注意的是,HttpClient程序包不负责解析数据流中的内容。如:

 
01.HttpUriRequest request = ...;
02.HttpResponse response = httpClient.execute(request);
03.  
04.// 从response中取出HttpEntity对象
05.HttpEntity entity = response.getEntity();
06.  
07.// 查看entity的各种指标
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.// 以任意方式操作数据流stream
16.// 调用方式 略
分享到:
评论
1 楼 qljobs 2010-12-23  
请问下为什么我用HttpClient4上传文件报错说文件是空文件(另外一个测试上传的文件报错),在用HttpClient4做文件上传时需不需要设置Header的Content-Type,谢谢?如果需要怎么设置!

相关推荐

    HttpClient 3.x to HttpComponents HttpClient 4.x

    随着技术的发展,从早期的HttpClient 3.x版本迁移到更新的HttpComponents HttpClient 4.x版本是一个常见的需求。这不仅仅是一个简单的升级过程,而是涉及到对API的变化、编程模型的更新以及对网络编程的更深层次理解...

    org.apache.commons.httpclient-3.1.jar

    《Apache Commons HttpClient 3.1:HTTP客户端编程的基石》 ...然而,需要注意的是,HttpClient 3.1已不再维护,最新的稳定版本为HttpClient 4.x,对于新项目建议使用更现代的版本以获取更好的性能和兼容性。

    httpclient 3.1 jar包 手册 源代码

    虽然HttpClient 3.1是一个稳定版本,但随着技术的发展,Apache已经推出了更现代的HTTP客户端库Apache HTTP Components (HttpClient 4.x),提供了更多的功能和改进。开发者应考虑根据项目需求,适时升级到更现代的...

    HttpClient

    `经典教程httpClient4.docx`和`httpclient4中文版帮助文档.pdf`可能是HttpClient 4.x版本的详细教程,包括如何配置HttpClient、创建请求、解析响应、处理异常等内容,对于学习HttpClient的使用非常有帮助。...

    SwooleDistributed 3.X 文档 sd文档 SwooleDistributed文档

    - **代码兼容性**:SD 3.X 兼容大部分2.X版本的代码,使得从2.X迁移到3.X相对容易,并且会提供详细的迁移指南。 - **稳定性**:SD 项目经过多年发展,已经历多个线上项目的迭代,稳定性极佳。 - **功能模块丰富**:...

    httpclient

    8. **HTTP/1.1和HTTP/2支持**:HttpClient 4.x版本开始支持HTTP/2协议,提供更高效的网络通信。 9. **Cookie管理**:HttpClient支持自动处理服务器返回的Cookie,维护会话状态,便于实现登录等功能。 10. **多部分...

    httpClient4.3文档 PDF

    这个压缩包包含两份文档,一份是.docx格式,一份是.pdf格式,两者内容相同,都是关于HttpClient 4.3的中文版指南。 HttpClient的核心功能在于它能够创建和管理HTTP连接,发送请求,接收响应,并支持各种HTTP方法如...

    HttpClient使用教程

    随着 HttpClient 更新至更高版本,例如 HttpClient 4.5.x 或更高,可能会有新的特性和改进。开发者应当关注最新版本的文档以获取更全面、最新的使用指南。 总结,HttpClient 是一个强大且灵活的 Java HTTP 客户端库...

    angular5.x中文手册

    Angular5.x中文手册是一份涵盖了从基础知识到高级主题的全面学习指南。它不仅提供了关于如何安装和设置Angular环境的指导,还深入讲解了Angular的核心概念,如组件、服务、数据绑定、事件绑定、路由和HTTP通信等。本...

    httpclient完美教程

    9. **最新版本特性**:随着技术的发展,HttpClient的最新版本(如4.x或5.x)引入了更多新功能和改进,如HTTP/2支持、连接管理和性能优化等。 10. **实战应用**:本教程将通过一系列实例,演示如何在实际项目中使用...

    Google Android 开发入门指南(第二版).pdf

    本书主要介绍了Android 2.x版本的应用开发技术,适合初学者快速入门Android开发,并逐步进阶至高级主题。内容涵盖Android平台的基本概念、应用设计原理以及具体的开发技巧。 #### 三、核心知识点详解 ##### 1. ...

    jdk-11.0.14_windows-x64_bin

    Java开发工具包(Java Development...在安装和使用JDK 11.0.14_windows-x64_bin.exe时,确保操作系统兼容,并遵循官方的安装指南,以确保顺利进行开发工作。同时,保持对JDK的更新,以便利用最新的性能改进和安全修复。

    Visual Basic网络编程:构建高效网络应用的指南

    ### Visual Basic 网络编程:构建高效网络应用的指南 #### 一、网络编程基础 网络编程是指在计算机之间通过网络发送和接收数据的过程。这通常涉及客户端和服务器之间的通信,其中客户端发起请求,而服务器处理这些...

    C#百度OCR demo

    **C# 百度OCR API 实战指南** 在IT领域,光学字符识别(OCR)技术是一种将图像中的文字转换为可编辑、可搜索文本的重要工具。百度提供了强大的OCR API,可以方便开发者集成到各种应用程序中,包括C#平台。本教程将...

    jdk-11.0.7_windows-x64_bin.zip

    总的来说,"jdk-11.0.7_windows-x64_bin.zip"是Java开发的重要工具,适用于64位Windows系统的开发者,提供了丰富的API和工具,以支持高效、可靠的Java应用程序开发。对于初次接触Java 11的用户,理解其新特性并熟悉...

    [安卓源码]高仿墨迹天气.zip项目安卓应用源码下载

    - **网络请求**:应用可能使用HTTP库,如Apache HttpClient或OkHttp,来从服务器获取天气数据。这涉及到JSON解析,如使用Gson或Jackson将服务器返回的数据转换为Java对象。 - **数据存储**:Android的...

    elasticsearch-analysis-ik-7.3.1.zip

    《Elasticsearch IK 分词器插件详解及安装指南》 Elasticsearch 是一款功能强大的开源搜索引擎,广泛应用于全文检索、数据分析等领域。为了更好地适应中文处理,社区开发了一系列的分词器插件,其中最知名的就是IK...

    Google APIs Client Library for Java

    - **google-api-client-android2-1.8.0-beta-sources.jar** 和 **google-api-client-android2-1.8.0-beta.jar**:这些是专门为Android 2.x版本优化的库文件,包含了适配Android平台的特定功能和优化。 - **LICENSE....

    jdk-11.0.3_windows-x64_bin.zip

    4. **动态类型(VarHandle)**:提供了一种低级别的、类型安全的方式来访问和修改对象的字段,支持内存模型的严格规定,用于实现高效的并发编程。 5. **改进的垃圾收集器(G1 Garbage Collector)**:在JDK 11中,...

    android+https的例子

    这个应用可能包含了初始化`HttpClient`、`HttpURLConnection`,设置`SSLSocketFactory`,以及处理证书验证的代码。通过运行这个应用,开发者可以理解在不同情况下如何在Android中实现HTTPS通信。 总的来说,本项目...

Global site tag (gtag.js) - Google Analytics