基于HttpClient的HttpUtils(后台访问URL)
最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题,在网络上g了一把,发现在常用的还是Apache的HttpClient。因为以经常要用到的原故,因此我对其进行了一些简单的封装,在此将代码贴一来,希望对有需要的朋友有所帮助,呵呵...
HttpUtils.java中有两个公共的静态方法,一个是URLPost,另一个是URLGet,一目了然,前者是提供POST方式提交数据的,后者是提供GET方式提交数据的。其中所需要传送的数据以Map的方式传入,剩下的工作就交给我这个HttpUtils吧!当然如果Http服务器端对所提交的数据的编码有要求的话,也没问题,你可以传入UTF-8或者GBK,当然大家还可自行增加。
下面是源代码,如果使用中有什么问题,欢迎大家提出。
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.net.URLEncoder;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Set;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.HttpException;
- import org.apache.commons.httpclient.HttpStatus;
- import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.commons.httpclient.methods.PostMethod;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * HTTP工具类
- *
- * @author lixiangyang
- *
- */
- public class HttpUtils {
- private static Log log = LogFactory.getLog(HttpUtils.class);
- /**
- * 定义编码格式 UTF-8
- */
- public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";
- /**
- * 定义编码格式 GBK
- */
- public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";
- private static final String URL_PARAM_CONNECT_FLAG = "&";
- private static final String EMPTY = "";
- private static MultiThreadedHttpConnectionManager connectionManager = null;
- private static int connectionTimeOut = 25000;
- private static int socketTimeOut = 25000;
- private static int maxConnectionPerHost = 20;
- private static int maxTotalConnections = 20;
- private static HttpClient client;
- static{
- connectionManager = new MultiThreadedHttpConnectionManager();
- connectionManager.getParams().setConnectionTimeout(connectionTimeOut);
- connectionManager.getParams().setSoTimeout(socketTimeOut);
- connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);
- connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);
- client = new HttpClient(connectionManager);
- }
- /**
- * POST方式提交数据
- * @param url
- * 待请求的URL
- * @param params
- * 要提交的数据
- * @param enc
- * 编码
- * @return
- * 响应结果
- * @throws IOException
- * IO异常
- */
- public static String URLPost(String url, Map<String, String> params, String enc){
- String response = EMPTY;
- PostMethod postMethod = null;
- try {
- postMethod = new PostMethod(url);
- postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
- //将表单的值放入postMethod中
- Set<String> keySet = params.keySet();
- for(String key : keySet){
- String value = params.get(key);
- postMethod.addParameter(key, value);
- }
- //执行postMethod
- int statusCode = client.executeMethod(postMethod);
- if(statusCode == HttpStatus.SC_OK) {
- response = postMethod.getResponseBodyAsString();
- }else{
- log.error("响应状态码 = " + postMethod.getStatusCode());
- }
- }catch(HttpException e){
- log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
- e.printStackTrace();
- }catch(IOException e){
- log.error("发生网络异常", e);
- e.printStackTrace();
- }finally{
- if(postMethod != null){
- postMethod.releaseConnection();
- postMethod = null;
- }
- }
- return response;
- }
- /**
- * GET方式提交数据
- * @param url
- * 待请求的URL
- * @param params
- * 要提交的数据
- * @param enc
- * 编码
- * @return
- * 响应结果
- * @throws IOException
- * IO异常
- */
- public static String URLGet(String url, Map<String, String> params, String enc){
- String response = EMPTY;
- GetMethod getMethod = null;
- StringBuffer strtTotalURL = new StringBuffer(EMPTY);
- if(strtTotalURL.indexOf("?") == -1) {
- strtTotalURL.append(url).append("?").append(getUrl(params, enc));
- } else {
- strtTotalURL.append(url).append("&").append(getUrl(params, enc));
- }
- log.debug("GET请求URL = \n" + strtTotalURL.toString());
- try {
- getMethod = new GetMethod(strtTotalURL.toString());
- getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
- //执行getMethod
- int statusCode = client.executeMethod(getMethod);
- if(statusCode == HttpStatus.SC_OK) {
- response = getMethod.getResponseBodyAsString();
- }else{
- log.debug("响应状态码 = " + getMethod.getStatusCode());
- }
- }catch(HttpException e){
- log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
- e.printStackTrace();
- }catch(IOException e){
- log.error("发生网络异常", e);
- e.printStackTrace();
- }finally{
- if(getMethod != null){
- getMethod.releaseConnection();
- getMethod = null;
- }
- }
- return response;
- }
- /**
- * 据Map生成URL字符串
- * @param map
- * Map
- * @param valueEnc
- * URL编码
- * @return
- * URL
- */
- private static String getUrl(Map<String, String> map, String valueEnc) {
- if (null == map || map.keySet().size() == 0) {
- return (EMPTY);
- }
- StringBuffer url = new StringBuffer();
- Set<String> keys = map.keySet();
- for (Iterator<String> it = keys.iterator(); it.hasNext();) {
- String key = it.next();
- if (map.containsKey(key)) {
- String val = map.get(key);
- String str = val != null ? val : EMPTY;
- try {
- str = URLEncoder.encode(str, valueEnc);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);
- }
- }
- String strURL = EMPTY;
- strURL = url.toString();
- if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {
- strURL = strURL.substring(0, strURL.length() - 1);
- }
- return (strURL);
- }
- }
转载于:https://www.cnblogs.com/maohuidong/p/8044662.html
基于HttpClient的HttpUtils(后台访问URL)相关推荐
- nginx针对某个url限制ip访问,常用于后台访问限制
nginx针对某个url限制ip访问,常用于后台访问限制 假如我的站点后台地址为: http://www.abc.net/admin.php 那么我想限制只有个别ip可以访问后台,那么需要在配置文件中 ...
- Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header { "Author": & ...
- 基于shiro+jwt的真正rest url权限管理,前后端分离
代码地址如下: http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+ ...
- 基于Token的WEB后台认证机制
转载自:基于Token的WEB后台认证机制 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和passwor ...
- 新手必看:访问url到加载全过程详解(看完不会我吃shi)
新手必看:访问url到加载全过程详解(看完不会我吃shi) 1.放在前面:新手必须知道的那些概念 1.1 什么是IP.域名.主机名.url.服务器 1.2 http & https 1.3 O ...
- 基于HttpClient的正方教务系统模拟登录(带验证码)
PS:恩,由于最近在学web和简单的http协议,所以心血来潮想用java写个爬虫来爬取学校官网(正方教务系统)个人主页的基础信息(课程信息.成绩--),其实在之前学过java基础教程的时候就可以写的 ...
- 基于JavaWeb的医疗后台项目药品信息的图片上传和绑定图片路径问题(3)
点击传送-> 基于JavaWeb的医疗后台项目医生信息的分页展示和模糊查询实现(2) -----上篇博客写到了医疗项目的医生信息的分页展示和查询,今天来实现药品的管理----- 1.建表 首先建 ...
- 基于 SpringBoot + jpa + Erupt 后台框架开发的综合签到打卡系统【100010425】
基于 SpringBoot + jpa + Erupt 后台框架开发的综合签到打卡系统 一 .项目背景及需求分析 用户在可靠验证下实现简化身份确认 在已有用户数据库基础上 传统校验方式: 直接选择 = ...
- java后台访问接口
java后台访问接口 // 发送url地址获取信息public static String sendPost(String jsonStr, String path) {String msg = &q ...
最新文章
- NVIDIA GPU自动调度神经网络
- 程序员请收好:10个非常有用的 Visual Studio Code 插件!
- 鸿蒙10.1升级机型,鸿蒙系统的前奏,华为EMUI10.1从底层掏空安卓,20款老机型升级...
- ipython安装教程-CentOS 5安装IPython
- linux 常用命令摘录
- python按列输出_在python中创建漂亮的列输出
- jQuery的位置信息和事件
- 2020年全国儿童青少年总体近视率为52.7%,比上年上升2.5%播
- [css] 如何隐藏没有静音、自动播放的音视频?
- 黑洞内外,时空弯曲的漩涡
- python爬虫解析数据_Python爬虫入门知识:解析数据篇
- Git提交失败之 Updates were rejected because the tip of your current branch is behind
- CSS修改iframe内的样式问题
- win11打开安全中心显示英文怎么办 windows11打开安全中心显示英文的解决方法
- linux开机启动 sogou输入法 xcompmgr .xprofile 黑块
- mysql bing logo_mysqlbing log
- indesign图片规定在左下角_InDesign如何为目录模板设置母版
- 【转】详解vue的diff算法
- habernet备份mysql_harbor 安装
- 台式计算机耗电,台式电脑和笔记本耗电量对比,分别是多少?
热门文章
- SQL SERVER数据库 “可能发生了架构损坏。请运行DBCC CHECKCATALOG。的错误修复
- 【Nginx入门系列】第六章 Nginx+tomcat集群负载均衡部署
- edgesForExtendedLayout、automaticallyAdjustsScrollV
- error: device not found - waiting for device -
- NSURLRequest的超时陷阱
- asp.net 用户控件
- 微软10月起将向安全厂商提前告知安全补丁内容
- C#学习笔记(四):数组
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
- 直流稳压电源的输出特性有哪些