基于HttpClient的HttpUtils(后台访问URL)

2023-05-16

      最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题,在网络上g了一把,发现在常用的还是Apache的HttpClient。因为以经常要用到的原故,因此我对其进行了一些简单的封装,在此将代码贴一来,希望对有需要的朋友有所帮助,呵呵...

 

      HttpUtils.java中有两个公共的静态方法,一个是URLPost,另一个是URLGet,一目了然,前者是提供POST方式提交数据的,后者是提供GET方式提交数据的。其中所需要传送的数据以Map的方式传入,剩下的工作就交给我这个HttpUtils吧!当然如果Http服务器端对所提交的数据的编码有要求的话,也没问题,你可以传入UTF-8或者GBK,当然大家还可自行增加。

 

      下面是源代码,如果使用中有什么问题,欢迎大家提出。

Java代码   收藏代码
  1. import java.io.IOException;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.net.URLEncoder;  
  4. import java.util.Iterator;  
  5. import java.util.Map;  
  6. import java.util.Set;  
  7.   
  8. import org.apache.commons.httpclient.HttpClient;  
  9. import org.apache.commons.httpclient.HttpException;  
  10. import org.apache.commons.httpclient.HttpStatus;  
  11. import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;  
  12. import org.apache.commons.httpclient.methods.GetMethod;  
  13. import org.apache.commons.httpclient.methods.PostMethod;  
  14. import org.apache.commons.logging.Log;  
  15. import org.apache.commons.logging.LogFactory;  
  16.   
  17. /** 
  18.  * HTTP工具类 
  19.  *  
  20.  * @author lixiangyang 
  21.  *  
  22.  */  
  23. public class HttpUtils {  
  24.   
  25.     private static Log log = LogFactory.getLog(HttpUtils.class);  
  26.       
  27.     /** 
  28.      * 定义编码格式 UTF-8 
  29.      */  
  30.     public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";  
  31.       
  32.     /** 
  33.      * 定义编码格式 GBK 
  34.      */  
  35.     public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";  
  36.       
  37.     private static final String URL_PARAM_CONNECT_FLAG = "&";  
  38.       
  39.     private static final String EMPTY = "";  
  40.   
  41.     private static MultiThreadedHttpConnectionManager connectionManager = null;  
  42.   
  43.     private static int connectionTimeOut = 25000;  
  44.   
  45.     private static int socketTimeOut = 25000;  
  46.   
  47.     private static int maxConnectionPerHost = 20;  
  48.   
  49.     private static int maxTotalConnections = 20;  
  50.   
  51.     private static HttpClient client;  
  52.   
  53.     static{  
  54.         connectionManager = new MultiThreadedHttpConnectionManager();  
  55.         connectionManager.getParams().setConnectionTimeout(connectionTimeOut);  
  56.         connectionManager.getParams().setSoTimeout(socketTimeOut);  
  57.         connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);  
  58.         connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);  
  59.         client = new HttpClient(connectionManager);  
  60.     }  
  61.       
  62.     /** 
  63.      * POST方式提交数据 
  64.      * @param url 
  65.      *          待请求的URL 
  66.      * @param params 
  67.      *          要提交的数据 
  68.      * @param enc 
  69.      *          编码 
  70.      * @return 
  71.      *          响应结果 
  72.      * @throws IOException 
  73.      *          IO异常 
  74.      */  
  75.     public static String URLPost(String url, Map<String, String> params, String enc){  
  76.   
  77.         String response = EMPTY;          
  78.         PostMethod postMethod = null;  
  79.         try {  
  80.             postMethod = new PostMethod(url);  
  81.             postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);  
  82.             //将表单的值放入postMethod中  
  83.             Set<String> keySet = params.keySet();  
  84.             for(String key : keySet){  
  85.                 String value = params.get(key);  
  86.                 postMethod.addParameter(key, value);  
  87.             }             
  88.             //执行postMethod  
  89.             int statusCode = client.executeMethod(postMethod);  
  90.             if(statusCode == HttpStatus.SC_OK) {  
  91.                 response = postMethod.getResponseBodyAsString();  
  92.             }else{  
  93.                 log.error("响应状态码 = " + postMethod.getStatusCode());  
  94.             }  
  95.         }catch(HttpException e){  
  96.             log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);  
  97.             e.printStackTrace();  
  98.         }catch(IOException e){  
  99.             log.error("发生网络异常", e);  
  100.             e.printStackTrace();  
  101.         }finally{  
  102.             if(postMethod != null){  
  103.                 postMethod.releaseConnection();  
  104.                 postMethod = null;  
  105.             }  
  106.         }  
  107.           
  108.         return response;  
  109.     }  
  110.       
  111.     /** 
  112.      * GET方式提交数据 
  113.      * @param url 
  114.      *          待请求的URL 
  115.      * @param params 
  116.      *          要提交的数据 
  117.      * @param enc 
  118.      *          编码 
  119.      * @return 
  120.      *          响应结果 
  121.      * @throws IOException 
  122.      *          IO异常 
  123.      */  
  124.     public static String URLGet(String url, Map<String, String> params, String enc){  
  125.   
  126.         String response = EMPTY;  
  127.         GetMethod getMethod = null;       
  128.         StringBuffer strtTotalURL = new StringBuffer(EMPTY);  
  129.           
  130.         if(strtTotalURL.indexOf("?") == -1) {  
  131.           strtTotalURL.append(url).append("?").append(getUrl(params, enc));  
  132.         } else {  
  133.             strtTotalURL.append(url).append("&").append(getUrl(params, enc));  
  134.         }  
  135.         log.debug("GET请求URL = \n" + strtTotalURL.toString());  
  136.           
  137.         try {  
  138.             getMethod = new GetMethod(strtTotalURL.toString());  
  139.             getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);  
  140.             //执行getMethod  
  141.             int statusCode = client.executeMethod(getMethod);  
  142.             if(statusCode == HttpStatus.SC_OK) {  
  143.                 response = getMethod.getResponseBodyAsString();  
  144.             }else{  
  145.                 log.debug("响应状态码 = " + getMethod.getStatusCode());  
  146.             }  
  147.         }catch(HttpException e){  
  148.             log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);  
  149.             e.printStackTrace();  
  150.         }catch(IOException e){  
  151.             log.error("发生网络异常", e);  
  152.             e.printStackTrace();  
  153.         }finally{  
  154.             if(getMethod != null){  
  155.                 getMethod.releaseConnection();  
  156.                 getMethod = null;  
  157.             }  
  158.         }  
  159.           
  160.         return response;  
  161.     }     
  162.   
  163.     /** 
  164.      * 据Map生成URL字符串 
  165.      * @param map 
  166.      *          Map 
  167.      * @param valueEnc 
  168.      *          URL编码 
  169.      * @return 
  170.      *          URL 
  171.      */  
  172.     private static String getUrl(Map<String, String> map, String valueEnc) {  
  173.           
  174.         if (null == map || map.keySet().size() == 0) {  
  175.             return (EMPTY);  
  176.         }  
  177.         StringBuffer url = new StringBuffer();  
  178.         Set<String> keys = map.keySet();  
  179.         for (Iterator<String> it = keys.iterator(); it.hasNext();) {  
  180.             String key = it.next();  
  181.             if (map.containsKey(key)) {  
  182.                 String val = map.get(key);  
  183.                 String str = val != null ? val : EMPTY;  
  184.                 try {  
  185.                     str = URLEncoder.encode(str, valueEnc);  
  186.                 } catch (UnsupportedEncodingException e) {  
  187.                     e.printStackTrace();  
  188.                 }  
  189.                 url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);  
  190.             }  
  191.         }  
  192.         String strURL = EMPTY;  
  193.         strURL = url.toString();  
  194.         if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {  
  195.             strURL = strURL.substring(0, strURL.length() - 1);  
  196.         }  
  197.           
  198.         return (strURL);  
  199.     }  
  200. }  

转载于:https://www.cnblogs.com/maohuidong/p/8044662.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于HttpClient的HttpUtils(后台访问URL) 的相关文章

随机推荐

  • c++ http请求

    平常我们要访问某个URL一般都是通过浏览器进行 xff1a 提交一个URL请求后 xff0c 浏览器将请求发向目标服务器或者代理服务器 xff0c 目标服务器或者代理服务器返回我们所需要的数据 xff0c 浏览器接收到这些数据后保存成文件并
  • libcurl实现http登录功能

    用Fiddler Web Debugger捕捉http数据包 xff1a 观察看看 xff0c POST请求的地址为http passport cnblogs com login aspx ReturnUrl 61 http 3a 2f 2
  • 服务器机柜和网络机柜的区别

    原文转载自 http www fwqtg net 服务器机柜 xff0c 用来组合安装面板 插件 插箱 电子元件 器件和机械零件与部件 xff0c 使其构成一个整体的安装箱 服务器机柜由框架和盖板 xff08 门 xff09 组成 xff0
  • Eclipse+Maven创建webapp项目<一>

    Eclipse 43 Maven创建webapp项目 lt 一 gt 1 开启eclipse xff0c 右键new other xff0c 如下图找到maven project 2 选择maven project xff0c 显示创建ma
  • java日期格式(年月日时分秒毫秒)

    package test remote tools combine import java text SimpleDateFormat import java util Calendar import java util Date impo
  • 游戏中的帧同步要求的计算一致性——定点数(Fixed Point)

    最近做了一款帧同步游戏 xff0c 其寻路算法采用了RVO算法 但是由于是移动端的游戏 需要在不同的设备上运行 xff0c 其所有运算必须符合一致性 即所有客户端运算出来的结果必须一致 但是由于浮点数的特性 xff0c 具有误差 xff0c
  • 敏捷测试驱动模式-项目质量保障体系

    结合敏捷项目管理 xff0c 测试驱动模式 xff0c 让测试跑起来 我给这套体系的定义就是 保障质量的同时保证项目进度 xff0c 四个节点及时反馈及时沟通 xff0c 有效的让产品 研发和测试都动起来 xff0c 避免任意一方的停滞 质
  • angularjs自定义指令函数传参

    问题描述 在编写导入指令的时候 xff0c 需要将函数绑定到指令中 xff0c 并传入一个参数 初步实现 首先指令的js文件如下 xff0c 基本的绑定参数和绑定函数 xff0c 没有什么说的 xff1a angular module 39
  • 浅谈JSONObject解析JSON数据

    个人博客同步文章 https mr houzi com 2018 06 根据一段天气API来说一下JSONObject如何解析json数据 xff0c 尽管现在在开发中使用Gson等 xff0c 对于像我这样初次使用Java做开发的小白 x
  • 能ping通,但是不能wget或curl

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 当出现http接口请求超时时 xff0c 可以从以下几个方面排查问题 xff1a 检查接口服务本身是否正常 xff1b 检查接口所在服务器的防火墙是否开启 xff0c 尝试
  • R语言选择特定的行,对某一列排序

    R语言的数据框跟MySQL 中的表很像 根据某一列的特定值选择相应的行 d是个数据框 xff0c 有一列的名字是name d d name 61 61 34 95 34 这样就选中了 name为 95 的所有行 m 是个数据框 xff0c
  • excel表格公式无效、不生效的解决方案及常见问题、常用函数

    1 表格公式无效 不生效 使用公式时碰到了一个问题 xff0c 那就是公式明明已经编辑好了 xff0c 但是在单元格里不生效 xff0c 直接把公式显示出来了 xff0c 网上资料说有4种原因 xff0c 但是我4种都不是 xff0c 是第
  • JVM_栈详解一

    1 Java虚拟机栈 2 栈的存储单位 栈中存储什么 xff1f 每个线程都有自己的栈 xff0c 栈中的数据都是以栈帧 xff08 Stack Frame xff09 的格式存在 在这个线程上正在执行的每个方法都各自对应一个栈帧 xff0
  • EntLib 3.1学习笔记(6) : Security Application Block

    http www microsoft com china MSDN library enterprisedevelopment softwaredev dnpag2entlib mspx mfr 61 true http msdn2 mic
  • Delphi文件操作所涉及的一些函数 附例子

    判断文件是否存在 FileExists 判断文件夹是否存在 DirectoryExists 删除文件 DeleteFile Windows DeleteFile 删除文件夹 RemoveDir RemoveDirectory 获取当前文件夹
  • 排序算法

    include lt iostream gt include lt cstdlib gt include lt cstdio gt include lt time h gt using namespace std 插入排序 void Ins
  • C++应用中调用YOLOv3(darknet)进行目标检测

    YOLOv3论文 xff1a https pjreddie com media files papers YOLOv3 pdf 官网和代码 xff1a https pjreddie com darknet yolo属于one stage x
  • DJI开发之航线重叠率的计算

    介绍 无人机在规划一块区域的时候 xff0c 我们需要手动的给予一些参数来影响无人机飞行 xff0c 对于一块地表 xff0c 无人机每隔N秒在空中间隔的拍照地表的一块区域 xff0c 在整个任务执行结束后 xff0c 拍到的所有区域照片能
  • MODBUS MASTER RTU在STM32上的实现

    MODBUS MASTER RTU在STM32上的实现 1 概述 最近需要将几个信号采集模块通过总线串联起来 xff0c 这样便于系统模块化 故将目光关注到了工业上经常使用的modbus协议 modbus协议是一种一主多从的拓扑结构 xff
  • 基于HttpClient的HttpUtils(后台访问URL)

    最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题 xff0c 在网络上g了一把 xff0c 发现在常用的还是Apache的HttpClient 因为以经常要用到的原故 xff0c 因此我对其进行了一些简单的封装 xff0