1. 什么是HttpClient
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是Apache HttpComponents 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
2. 功能介绍
- 实现了所有 HTTP 的方法(GET,POST,PUT,DELETE 等)
- 支持自动转向
- 支持 HTTPS 协议
- 支持代理服务器等
3. 版本比较
HttpClient 3 版本和 HttpClient 4 版本差别还是很多大的,基本HttpClient里面的接口都变了,你把 HttpClient 3 版本的代码拿到 HttpClient 4 上面都运行不起来,会报错的。所以一定要注意 HtppClient 的版本问题。
4. HttpClient不能做的事情
HttpClient 不是浏览器,它是一个客户端 HTTP 协议传输类库。HttpClient 被用来发送和接受 HTTP 消息。HttpClient 不会处理 HTTP 消息的内容,不会进行 javascript 解析,不会关心 content type,如果没有明确设置,HttpClient 也不会对请求进行格式化、重定向 url,或者其他任何和 HTTP 消息传输相关的功能。
5. HttpClient使用流程
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
- 创建HttpClient对象。
- 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
- 如果需要发送请求参数,可调用HttpGetsetParams方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。
- 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse对象。
- 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
- 释放连接。无论执行方法是否成功,都必须释放连接
package cn.com.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Properties; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; public class PzyxUtil { private static String pzyx_address; private static String command; private static String systemCode; private static String corpName; private static String serialNumber; private static String limit; private static String baseBoard; private static String fileName; static { InputStream in = PzyxUtil.class.getClassLoader().getResourceAsStream("pzyx.properties"); Properties p = new Properties(); try { p.load(in); pzyx_address = p.getProperty("PZYX_ADDRESS"); command = p.getProperty("COMMAND"); systemCode = p.getProperty("SYSTEMCODE"); corpName = p.getProperty("CORPNAME"); serialNumber = p.getProperty("SERIALNUMBER"); limit = p.getProperty("LIMIT"); baseBoard = p.getProperty("BASEBOARD"); }catch (Exception e) { e.printStackTrace(); } } /** *注册客户端的post请求 * * @param url * @param map * @return * @throws Exception */ private static InputStream getFile(String FileID) throws Exception { //创建注销HttpClient HttpClient httpClient = new HttpClient(); //创建get或post请求方法 PostMethod method = new PostMethod(pzyx_address); //设置编码 httpClient.getParams().setContentCharset("UTF-8"); //设置请求消息头,为表单方式提交 method.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); //注销设置参数 method.setParameter("Command", "Interrupt"); method.setParameter("AccessToken", ""); //执行提交 httpClient.executeMethod(method); if("True".equals(method.getResponseBodyAsString().split("\\|")[0])) { method = new PostMethod(pzyx_address); //注册设置参数 method.setParameter("Command", command); method.setParameter("SystemCode", systemCode); method.setParameter("CorpName", corpName); method.setParameter("SerialNumber", serialNumber); method.setParameter("Limit", limit); method.setParameter("BaseBoard", baseBoard); //执行提交 httpClient.executeMethod(method); String accessToken = method.getResponseBodyAsString().split("\\|")[1]; if("True".equals(method.getResponseBodyAsString().split("\\|")[0])) { method = new PostMethod(pzyx_address); //获取单个文件设置参数 method.setParameter("Command", "GetFileInfo"); method.setParameter("FileID", FileID); method.setParameter("AccessToken", accessToken); //执行提交 httpClient.executeMethod(method); String res = new String(method.getResponseBody()); fileName = res.split("\\|")[2].split(",")[0]; if("True".equals(method.getResponseBodyAsString().split("\\|")[0])) { method = new PostMethod(pzyx_address); //下载图片设置参数 method.setParameter("Command", "Download"); method.setParameter("FileID", FileID); method.setParameter("AccessToken", accessToken); //执行提交 httpClient.executeMethod(method); } } } return method.getResponseBodyAsStream(); } public static void save(String FileID) { try { InputStream fileInputStream = getFile(FileID); String path = AddressUtil.getUpload_address() + "\\" + Constants.PATH_PZYX + "\\" + fileName; File file = new File(path); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } BufferedOutputStream outStream = new BufferedOutputStream(new FileOutputStream(file)); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while( (len= fileInputStream.read(buffer)) != -1 ){ //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输出流 outStream.flush(); outStream.close(); //关闭输入流 fileInputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }