学习脚步--- HttpClient4.0, multipartEntity (转)

学习脚步--- HttpClient4.0

Apache网络协议网络应用应用服务器HTML

HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。一个最简单的调用如下:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. import java.io.IOException;
  2. import org.apache.http.HttpResponse;
  3. import org.apache.http.client.ClientProtocolException;
  4. import org.apache.http.client.HttpClient;
  5. import org.apache.http.client.methods.HttpGet;
  6. import org.apache.http.client.methods.HttpUriRequest;
  7. import org.apache.http.impl.client.DefaultHttpClient;
  8. public class Test {
  9. public static void main(String[] args) {
  10. // 核心应用类
  11. HttpClient httpClient = new DefaultHttpClient();
  12. // HTTP请求
  13. HttpUriRequest request =
  14. new HttpGet("http://localhost/index.html");
  15. // 打印请求信息
  16. System.out.println(request.getRequestLine());
  17. try {
  18. // 发送请求,返回响应
  19. HttpResponse response = httpClient.execute(request);
  20. // 打印响应信息
  21. System.out.println(response.getStatusLine());
  22. catch (ClientProtocolException e) {
  23. // 协议错误
  24. e.printStackTrace();
  25. catch (IOException e) {
  26. // 网络异常
  27. e.printStackTrace();
  28. }
  29. }
  30. }

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. import java.io.IOException;
  2. import org.apache.http.HttpResponse;
  3. import org.apache.http.client.ClientProtocolException;
  4. import org.apache.http.client.HttpClient;
  5. import org.apache.http.client.methods.HttpGet;
  6. import org.apache.http.client.methods.HttpUriRequest;
  7. import org.apache.http.impl.client.DefaultHttpClient;
  8. public class Test {
  9. public static void main(String[] args) {
  10. // 核心应用类
  11. HttpClient httpClient = new DefaultHttpClient();
  12. // HTTP请求
  13. HttpUriRequest request =
  14. new HttpGet("http://localhost/index.html");
  15. // 打印请求信息
  16. System.out.println(request.getRequestLine());
  17. try {
  18. // 发送请求,返回响应
  19. HttpResponse response = httpClient.execute(request);
  20. // 打印响应信息
  21. System.out.println(response.getStatusLine());
  22. } catch (ClientProtocolException e) {
  23. // 协议错误
  24. e.printStackTrace();
  25. } catch (IOException e) {
  26. // 网络异常
  27. e.printStackTrace();
  28. }
  29. }
  30. }

如果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请求:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. HttpUriRequest request = new HttpPost(
  2. "http://localhost/index.html");

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. HttpUriRequest request = new HttpPost(
  2. "http://localhost/index.html");

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

request-line

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

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

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

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

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

(2)

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

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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());

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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处理,如:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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);

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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=中国&param2=value2

(4)
对于参数的URLEncoding处理,HttpClient程序包为我们准备了另一个工具类:URLEncodedUtils。通过它,我们可以直观的(但是比较复杂)生成URI,如:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List params = new ArrayList();
  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);

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List params = new ArrayList();
  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=中国&param2=value2

request-body

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

Html代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. <</SPAN>form action="http://localhost/index.html" method="POST">  
  2. <</SPAN>input type="text" name="param1" value="中国"/>  
  3. <</SPAN>input type="text" name="param2" value="value2"/>  
  4. <</SPAN>inupt type="submit" value="submit"/>  
  5. </</SPAN>form>  

Html代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. <</SPAN>form action="http://localhost/index.html" method="POST">
  2. <</SPAN>input type="text" name="param1" value="中国"/>
  3. <</SPAN>input type="text" name="param2" value="value2"/>
  4. <</SPAN>inupt type="submit" value="submit"/>
  5. </</SPAN>form>

我们可以用下面的代码实现:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List formParams = new ArrayList();
  2. formParams.add(new BasicNameValuePair("param1", "中国"));
  3. formParams.add(new BasicNameValuePair("param2", "value2"));
  4. HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
  5. HttpPost request = new HttpPost(“http://localhost/index.html”);
  6. request.setEntity(entity);

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List formParams = new ArrayList();
  2. formParams.add(new BasicNameValuePair("param1", "中国"));
  3. formParams.add(new BasicNameValuePair("param2", "value2"));
  4. HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
  5. HttpPost request = new HttpPost(“http://localhost/index.html”);
  6. request.setEntity(entity);

当然,如果想查看HTTP数据格式,可以通过HttpEntity对象的各种方法取得。如:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List formParams = new ArrayList();
  2. formParams.add(new BasicNameValuePair("param1", "中国"));
  3. formParams.add(new BasicNameValuePair("param2", "value2"));
  4. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
  5. System.out.println(entity.getContentType());
  6. System.out.println(entity.getContentLength());
  7. System.out.println(EntityUtils.getContentCharSet(entity));
  8. System.out.println(EntityUtils.toString(entity));

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. List formParams = new ArrayList();
  2. formParams.add(new BasicNameValuePair("param1", "中国"));
  3. formParams.add(new BasicNameValuePair("param2", "value2"));
  4. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");
  5. System.out.println(entity.getContentType());
  6. System.out.println(entity.getContentLength());
  7. System.out.println(EntityUtils.getContentCharSet(entity));
  8. System.out.println(EntityUtils.toString(entity));

上例的打印结果如下:

Content-Type: application/x-www-form-urlencoded; charset=UTF-8
39
UTF-8
param1=中国&param2=value2

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

Html代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. <</SPAN>form action="http://localhost/index.html" method="POST"  
  2. enctype="multipart/form-data">
  3. <</SPAN>input type="text" name="param1" value="中国"/>  
  4. <</SPAN>input type="text" name="param2" value="value2"/>  
  5. <</SPAN>input type="file" name="param3"/>  
  6. <</SPAN>inupt type="submit" value="submit"/>  
  7. </</SPAN>form>  

Html代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. <</SPAN>form action="http://localhost/index.html" method="POST"
  2. enctype="multipart/form-data">
  3. <</SPAN>input type="text" name="param1" value="中国"/>
  4. <</SPAN>input type="text" name="param2" value="value2"/>
  5. <</SPAN>input type="file" name="param3"/>
  6. <</SPAN>inupt type="submit" value="submit"/>
  7. </</SPAN>form>

我们可以用下面的代码实现:

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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. HttpPost request = new HttpPost(“http://localhost/index.html”);
  6. request.setEntity(entity);

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  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. HttpPost request = new HttpPost(“http://localhost/index.html”);
  6. request.setEntity(entity);

HTTP响应

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

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. HttpUriRequest request = ...;
  2. HttpResponse response = httpClient.execute(request);
  3. // 从response中取出HttpEntity对象
  4. HttpEntity entity = response.getEntity();
  5. // 查看entity的各种指标
  6. System.out.println(entity.getContentType());
  7. System.out.println(entity.getContentLength());
  8. System.out.println(EntityUtils.getContentCharSet(entity));
  9. // 取出服务器返回的数据流
  10. InputStream stream = entity.getContent();
  11. // 以任意方式操作数据流stream
  12. // 调用方式 略

Java代码 HttpClient4.0, multipartEntity (转)"> HttpClient4.0, multipartEntity (转)">

  1. HttpUriRequest request = ...;
  2. HttpResponse response = httpClient.execute(request);
  3. // 从response中取出HttpEntity对象
  4. HttpEntity entity = response.getEntity();
  5. // 查看entity的各种指标
  6. System.out.println(entity.getContentType());
  7. System.out.println(entity.getContentLength());
  8. System.out.println(EntityUtils.getContentCharSet(entity));
  9. // 取出服务器返回的数据流
  10. InputStream stream = entity.getContent();
  11. // 以任意方式操作数据流stream
  12. // 调用方式 略

附注:

本文说明的是HttpClient 4.0.1 ,该程序包(包括依赖的程序包)由以下几个JAR包组成:
 
commons-logging-1.1.1.jar
commons-codec-1.4.jar
httpcore-4.0.1.jar
httpclient-4.0.1.jar
apache-mime4j-0.6.jar
httpmime-4.0.1.jar

时间: 2024-07-28 14:51:53

学习脚步--- HttpClient4.0, multipartEntity (转)的相关文章

嵌入式Linux学习笔记(0)基础命令。——Arvin

学习记录: 到今天为止ARM裸机开发学习进程:1.2.1-1.2.14 预科班知识Linux介绍学习进程:0.2.1-0.2.6 学习内容笔记: 学习了Linux的开发方式的优劣介绍 学习了常用文件夹命令 ls(list) ls -a 显示所有文件(包括隐藏文件) ls -l 显示所有详细信息 ls -a -l也可以 man(查询命令) man 1 ls(1表示查询命令,ls表示查询的内容) cd(change directory) cd ..代表上一层 cd ../../代表上上层 cd .是

《鸟哥的Linux私房菜》学习笔记(0)

听说Linux已经有很长一段时间了,但是从未系统的学习过Linux.这次把在博客园的处女秀给了Linux,希望能够给自己学习Linux一种坚持的动力,坚持就是胜利,fighting! 在我看来,成为技术大牛之前,写博客主要是对自己所学的东西作以总结,涉及的东西也稍显浅薄,但是却能够为更深一步的学习打下基础,于是我选择了写博客!以前从未写过博客,博客给人第一印象——高大上,现在要写了,顿感压力山大,还好本人的初衷是为了知识的整理,暂时这样安慰一下我自己吧.初期的博客,我想肯定会是非常糟糕的,但是我

网站构建学习笔记(0)&mdash;&mdash;基本概念了解及资源学习(copy自w3school)

一.学习方面 1.WWW - 万维网 什么是 WWW? WWW 指万维网(World Wide Web) 万维网常被称为Web Web 是由遍布全球的计算机所组成的网络 所有 Web 中的计算机都可以彼此通信 所有这些计算机都使用名为 HTTP 的通信标准 WWW 如何工作? Web 信息存储于被称为网页的文档中 网页是存储于被称为 Web 服务器的计算机上 读取网页的计算机称为 Web 客户端 Web 客户端通过称为浏览器的程序来查看网页 主要的浏览器有 Internet Explorer 和

Python学习笔记(0)

Python 是什么类型的语言 Python是脚本语言 Python下载地址:https://www.python.org/downloads/ Python版本:Python 3.4.2 - 64bit 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方式快速完成某些复杂的事情通常是创造脚本语言的重要原则,基于这项原则,使得脚本语言通常比 C语言.C++语言 或 Java 之类的系统编程语言要简单容易.也让脚本语言另有一些

1、Kafka学习分享-V1.0

Kafka学习分享 .1       什么是Kafka Apache Kafka是一个开源的流处理平台,由 Apache Software Foundation使用Scala and Java编写发展而来.Kafka?用于构建实时数据管道和流媒体应用. 它具有水平可扩展性,容错性,快速性,并在数千家公司生产中运行. 它的主要功能:数据流的发布和订阅.数据流的处理.数据流的存储.像一个消息系统一样发布和订阅数据流,有效且实时地处理数据流,在一个分布式备份的集群中安全地处理存储数据流. .2    

OpenGL学习记录(0)

从今天开始学习OpenGL. 首先,环境搭建,VS2013社区版+Freeglut 3.0.0. Freeglut介绍就不用了,自行Google.地址:http://sourceforge.net/projects/freeglut/ 下载之后解压,根据README搭建环境. INSTALLATION============ See README.cmake as a starting point, as well as the other READMEfiles for further inf

Notification的学习,4.0前后的差别

android 4.0 前后很多api都有了较大的差别,不多说现在学习下notification前后实现的差别 public class MainActivity extends ActionBarActivity { private static final int NOTIFY_ID = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

学习OpenCV第0天

自2011年接触OpenCV已经有几年了,一直停留在写一些小程序,利用手册完成一些任务,一直没有深入研究其中代码,如今毕业,但各种原因未能进入图像处理行业,故现重学OpenCV,包括分析代码,学习算法,blog不定时更写,欢迎交流. 搭建环境:VS2010+CV1.0 最新CV是3.0 alpha,但1.0结构简单,基础功能还是有的,而且本人比较熟悉C语言,故选择1.0. 官网下载1.0的安装文件,系统自动安装到C:\Program Files (x86),进入OpenCV目录,会发现有一个C:

淘宝网触屏版 - 学习笔记(0 - 关于dpr)

注:本文是学习笔记,并不是教程,所以会有很多我不理解或猜测的问题,也会有不尽详实之处,望见谅. 对于pc端网页设计师来说,移动端的网页制作,我之前只是简单的加了一个 <meta name="viewport" content="width=device-width initial-scale=1.0 maximum-scale=1.0 user-scalable=none"> 然后再根据实际预览效果,对一些比例或者清晰度问题进行调整,以达到最佳效果.当然