基于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);
- }
- }
基于HttpClient的HttpUtils(后台访问URL)的更多相关文章
- nginx针对某个url限制ip访问,常用于后台访问限制【转】
假如我的站点后台地址为: http://www.abc.net/admin.php 那么我想限制只有个别ip可以访问后台,那么需要在配置文件中增加: location ~ .*admin.* { al ...
- Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
{ "Author": "tomcat and jerry", "url":"http://www.cnblogs.com/tom ...
- 基于shiro+jwt的真正rest url权限管理,前后端分离
代码地址如下:http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+j ...
- 利用javascript Location访问Url,重定向,刷新页面
网上转来了, 方便以后查询参考 本文介绍怎么使用javascript Location对象读和修改Url.怎么重载或刷新页面.javascript提供了许多方法访问,修改当前用户在浏览器中访问的url ...
- 基于SpringBoot的项目管理后台
代码地址如下:http://www.demodashi.com/demo/13943.html 一.项目简介 在使用本项目之前,需要对SpringBoot,freemaker,layui,flyway ...
- 基于WCF 的远程数据库服务访问技术
原文出处:http://www.lw80.cn/shuji/jsjlw/13588Htm.Htm摘要:本文介绍了使用WCF 建立和运行面向服务(SOA)的数据库服务的系统结构和技术要素,分析了WCF ...
- SpringCloud-Config通过Java访问URL对敏感词加密解密
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 基于vue模块化开发后台系统——准备工作
文章目录如下:项目效果预览地址项目开源代码基于vue模块化开发后台系统--准备工作基于vue模块化开发后台系统--构建项目基于vue模块化开发后台系统--权限控制 前言 本文章是以学习为主,练习一下v ...
- Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
随机推荐
- 笔记本设置 2K 显示屏 Intel HD Graphics 3000
收了一台 32英寸的显示器,接到笔记 本只有 1920x1080,心想没得救了,要换笔记本才能用了. 在网上找了一圈,找到一篇说 Intel HD Graphics 3000 可以支持到 2560x1 ...
- hadoop之 map个数控制
hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...
- Oracle 补丁体系 及 opatch 工具 介绍
一. CPU(Critical Patch Update) 一个CPU内包含了对多个安全漏洞的修复,并且也包括相应必需的非安全漏洞的补丁.CPU是累积型的,只要安装最新发布的CPU即可,其中包括之前发 ...
- 异步FIFO跨时钟域亚稳态如何解决?
跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...
- 线性代数之SVD与PCA
[作者:byeyear Email:east3@163.com 首发www.cnblogs.com 转载请注明] 回忆学校的美好时光,一起来复习下曾经的课程吧. 1. SVD推荐am ...
- BASIC-17_蓝桥杯_矩阵乘法
示例代码: #include <stdio.h>#define N 30 int main(void){ int n = 0 , m = 0 , sum = 0; int i = 0 , ...
- ThinkJava-访问权限控制
6.2.3 private: 你无法访问 关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员.由 于处于同一个包内的其他类是不可以访问private成员的,因此这等于说 ...
- python selenium-5根据unittest组织测试用例
driver:浏览器driver存放地址 testcase:测试用例目录 report:测试结果保存目录 runtest.py:执行文件 test_search1.py搜索selenium,test_ ...
- 关于clearfix和clear的研究
今天领导跟我说到这个问题,我上网找了些资料,已转载一篇文章到本博客(后一篇),摘自百度文库. ps:还有一种写法就是: CSS代码: .clearfix:after { content: " ...
- nginx 限流配置
上配置 http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr ...