HttpClient使用详解

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发送请求、接收响应很简单,一般需要如下几步即可。

  1. 创建HttpClient对象。
  2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
  3. 如果需要发送请求参数,可调用HttpGetsetParams方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse对象。
  5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
  6. 释放连接。无论执行方法是否成功,都必须释放连接
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();
        }
    }
    

}
原文地址:https://www.cnblogs.com/sunBinary/p/10729273.html