在http://www.cnblogs.com/ITtangtang/p/3968093.html的基础上封装了一下get和post请求的常用方法,

虽然很简单,也晒晒

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.GetMethod;

import java.util.Iterator;
import java.util.Map;
import java.net.ConnectException;
import java.net.SocketTimeoutException;

/**
 *
 * @author zhang jinguang
 * @version $Id: HttpInvoker.java, v 0.1 2016年10月26日 下午2:17:59 zhang jinguang
 *          Exp $
 */
public class HttpInvoker {
    private static Log logger = LogFactory.getLog(HttpInvoker.class);
    // 默认字符集编码
    private final static String DEFAULT_CHARSET = "utf-8";
    // 默认超时时间, 单位为毫秒(ms)
    private final static int DEFAULT_TIMEOUT = 10000;

    /**
     * http的默认get请求,默认超时时间为10s,默认字符集为utf-8,如需定制,请调用
     *
     * @author zhang jinguang 2016年10月26日
     * @param url:get请求的url地址,不要带参数,参数放到params里面
     * @param params:请求的url需要的参数, 没有参数,直接传null
     * @return
     * @throws Exception
     */
    public  static String httpGet(String url, Map<?, ?> params) throws Exception {
        return httpGet(url, params, DEFAULT_TIMEOUT, DEFAULT_CHARSET);
    }

    /**
     * @author zhang jinguang 2016年10月26日
     * @param url:get请求的url地址,不要带参数,参数放到params里面
     * @param params
     * @param timeout
     * @param charset
     * @return
     * @throws Exception
     */
    public static String httpGet(String url, Map<?, ?> params, int timeout, String charset) throws Exception {
        return invokeGet(url, params, timeout, charset);
    }

    /**
     * http post请求
     *
     * @author zhang jinguang 2016年10月26日
     * @param url:请求的url
     * @param params:post的内容
     * @return
     * @throws Exception
     */
    public static String httpPost(String url, Map<?, ?> params) throws Exception {
        return httpPost(url, params, DEFAULT_TIMEOUT, DEFAULT_CHARSET);
    }

    /**
     * http post请求
     *
     * @author zhang jinguang 2016年10月26日
     * @param url:请求的url
     * @param params:post的内容
     * @param timeout:超时时间
     * @param charset:字符集
     * @return
     * @throws Exception
     */
    public static String httpPost(String url, Map<?, ?> params, int timeout, String charset) throws Exception {
        return invokePost(url, params, timeout, charset);
    }

    /**
     * 实际的post请求
     *
     * @author zhang jinguang 2016年10月26日
     * @param url:请求的url
     * @param params:post的内容
     * @param timeout:超时时间
     * @param charset:字符集
     * @return
     * @throws Exception
     */
    private static String invokePost(String url, Map<?, ?> params, int timeout, String charset) throws Exception {
        logger.debug("HTTP调用POST[" + url + "][" + params + "]");
        HttpMethod httpMethod = null;

        if (params != null && params.size() > 0) {
            Iterator<?> paramKeys = params.keySet().iterator();
            httpMethod = new PostMethod(url);
            NameValuePair[] form = new NameValuePair[params.size()];
            int formIndex = 0;
            while (paramKeys.hasNext()) {
                String key = (String) paramKeys.next();
                Object value = params.get(key);
                if (value != null && value instanceof String && !value.equals("")) {
                    form[formIndex] = new NameValuePair(key, (String) value);
                    formIndex++;
                } else if (value != null && value instanceof String[] && ((String[]) value).length > 0) {
                    NameValuePair[] tempForm = new NameValuePair[form.length + ((String[]) value).length - 1];
                    for (int i = 0; i < formIndex; i++) {
                        tempForm[i] = form[i];
                    }
                    form = tempForm;
                    for (String v : (String[]) value) {
                        form[formIndex] = new NameValuePair(key, (String) v);
                        formIndex++;
                    }
                }
            }
            ((PostMethod) httpMethod).setRequestBody(form);
        }
        
        return executeNetRequest(url, timeout, charset, httpMethod);
    }

    /**
     * 拼接请求参数
     *
     * @author zhang jinguang 2016年10月26日
     * @param url
     * @param params
     * @param timeout
     * @param charset
     * @return
     * @throws Exception
     */
    private static String invokeGet(String url, Map<?, ?> params, int timeout, String charset) throws Exception {
        logger.debug("HTTP调用GET[" + url + "][" + params + "]");
        HttpMethod httpMethod = null;

        // 如果需要拼接请求参数
        if (params != null && params.size() > 0) {
            Iterator<?> paramKeys = params.keySet().iterator();
            StringBuffer getUrl = new StringBuffer(url.trim());
            if (url.trim().indexOf("?") > -1) {
                if (url.trim().indexOf("?") < url.trim().length() - 1
                        && url.trim().indexOf("&") < url.trim().length() - 1) {
                    getUrl.append("&");
                }
            } else {
                getUrl.append("?");
            }
            while (paramKeys.hasNext()) {
                String key = (String) paramKeys.next();
                Object value = params.get(key);
                if (value != null && value instanceof String && !value.equals("")) {
                    getUrl.append(key).append("=").append(value).append("&");
                } else if (value != null && value instanceof String[] && ((String[]) value).length > 0) {
                    for (String v : (String[]) value) {
                        getUrl.append(key).append("=").append(v).append("&");
                    }
                }
            }
            if (getUrl.lastIndexOf("&") == getUrl.length() - 1) {
                httpMethod = new GetMethod(getUrl.substring(0, getUrl.length() - 1));
            } else {
                httpMethod = new GetMethod(getUrl.toString());
            }
        } else {// 没有请求参数
            httpMethod = new GetMethod(url);
        }

        return executeNetRequest(url, timeout, charset, httpMethod);
    }

    /**
     * 执行网络请求
     *
     * @author zhang jinguang 2016年10月26日
     * @param url
     * @param timeout
     * @param charset
     * @param httpMethod
     * @return
     * @throws SocketTimeoutException
     * @throws ConnectException
     * @throws Exception
     */
    private static String executeNetRequest(String url, int timeout, String charset, HttpMethod httpMethod)
            throws SocketTimeoutException, ConnectException, Exception {
        HttpClient client = new HttpClient();
        client.getParams().setSoTimeout(timeout);
        client.getParams().setContentCharset(charset);

        String result = "";
        try {
            client.executeMethod(httpMethod);
            result = httpMethod.getResponseBodyAsString();
        } catch (SocketTimeoutException e) {
            logger.error("连接超时[" + url + "]");
            throw e;
        } catch (java.net.ConnectException e) {
            logger.error("连接失败[" + url + "]");
            throw e;
        } catch (Exception e) {
            logger.error("连接时出现异常[" + url + "]");
            throw e;
        } finally {
            if (httpMethod != null) {
                try {
                    httpMethod.releaseConnection();
                } catch (Exception e) {
                    logger.error("释放网络连接失败[" + url + "]");
                    throw e;
                }
            }
        }
        
        return result;
    }
}

参考博文:http://www.cnblogs.com/ITtangtang/p/3968093.html

http请求,普通的get和post方法的更多相关文章

  1. ASP模拟POST请求异步提交数据的方法

    这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...

  2. Ajax设置自定义请求头的两种方法

    用自定义请求头token为例 方法一 $.ajax({ type: "post", url:"http://127.0.0.1:4564/bsky-app/templat ...

  3. Spring MVC 3 表单中文提交post请求和get请求乱码问题的解决方法

    在spring mvc 3.0 框架中,通过JSP页面.HTML页面以POST方式提交表单时,表单的参数传递到对应的servlet后会出现中文显示乱码的问题.解决办法可采用spring自带的过滤技术, ...

  4. AJAX跨域请求json数据的实现方法

    这篇文章介绍了AJAX跨域请求json数据的实现方法,有需要的朋友可以参考一下 我们都知道,AJAX的一大限制是不允许跨域请求. 不过通过使用JSONP来实现.JSONP是一种通过脚本标记注入的方式, ...

  5. file_get_contents无法请求https连接的解决方法 php开启curl

    file_get_contents无法请求https连接的解决方法 方法1: PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fo ...

  6. React 中的 AJAX 请求:获取数据的方法

    React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 st ...

  7. SpringMVC的请求转发的三种方法

    SpringMVC请求转发的三种方法 首先明白请求转发是一次请求,地址栏不会发生变化,区别于重定向.springmvc环境自行配置. 以下举例中存在如下文件/WEB-INF/pages/success ...

  8. GET和POST是HTTP请求的两种基本方法,区别是什么!?

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  9. 模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]

    1.axios 函数对象(可以作为函数使用去发送请求,也可以作为对象调用request方法发送请求) ❀ 一开始axios是一个函数,但是后续又给它添加上了一些属性[ 方法属性] ■ 举例子(axio ...

随机推荐

  1. java 深入技术四(Set)

    1)Set接口 set接口的父接口-Collection set接口的重要子类-HashSet set接口的重要子类 -TreeSet set 接口的特别子类-LinkedHashSet 2)Hash ...

  2. yii中的cookie的发送和读取

    cookies: //新创建的cookie会从本地传到服务器上,然后从服务器获取. (1) cookie的发送 $cookies = Yii::$app->response->cookie ...

  3. .NET LINQ 聚合操作

    聚合操作      聚合运算从值集合计算单个值. 从一个月的日温度值计算日平均温度就是聚合运算的一个示例. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 ...

  4. 伪随机数(线性同余法)C语言

    /**Keil Lib*2015.6.12*Pass*by lort*/uint32 Srandx ; uint32 SrandK = 1103515245;//0x41C64E6D;uint32 S ...

  5. Oracle行转列、列转行的Sql语句总结(转)

    多行转字符串 这个比较简单,用||或concat函数可以实现 select concat(id,username) str from app_userselect id||username str f ...

  6. MySQL存储引擎之Myisam和Innodb总结性梳理

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...

  7. Ubuntu下Sublime Text 3解决无法输入中文的方法

    Ubuntu下Sublime Text 3解决无法输入中文的方法_百度经验http://jingyan.baidu.com/article/f3ad7d0ff8731609c3345b3b.html ...

  8. C# 读取大型Xml文件

    这篇博客将介绍在C#中如何读取数据量很大的Xml文件.请看下面的Xml文件, <?xml version="1.0" encoding="utf-8"?& ...

  9. [C++][数据结构]队列(queue)的实现

    对于队列的定义,前人之述备矣. 队列的实现方法与栈非常相似.我直接在我实现的那个栈的代码上加了一点东西,全局替换了一些标识符,就实现了这个队列. 我实现的是一个queue<value>容器 ...

  10. java基础之——DecimalFormat格式化数字

    DecimalFormat可以用来格式化数字,例如用来设定保留多少位小数.设定数字分隔符等. 说方法之前,先介绍一下其常用的几个模式占位符: 0 一个数字# 一个数字,不包括 0. 小数的分隔符的占位 ...