zoukankan      html  css  js  c++  java
  • 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();
            }
        }
        
    
    }
  • 相关阅读:
    FastDFS的简单使用
    KindEditor的简单使用
    rpc
    SDS——动态字符串
    图的深度优先遍历和广度优先遍历
    innodb和myisam原理
    cap理论
    冒泡排序
    桥接模式
    适配器模式
  • 原文地址:https://www.cnblogs.com/sunBinary/p/10729273.html
Copyright © 2011-2022 走看看