为什么使用apache-httpclient而不是jdk-urlconnection

urlconnection不能管理连接,比如:在交易网站中,用户余额查询,如果使用urlconnection可能照成频繁创建scoket,浪费资源,最后导致tomca没有反应,连个静态图片都打不开了,但是tomcat进程还依然存在,因此推荐使用httpclient,特性如下:

1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

       18. 源代码基于Apache License 可免费获取。

具体httpclient封装如下:

package net.zkbc.p2p.fep.util.pay;

import java.util.Map;

public class WebUtils {

    public static String sendHttp(String url, Map<String, String> parameters)
            throws Exception {
        String outStr = "";
        try {
            String charSet = "UTF-8";
            String timeOut = "200000";// 自行配置
            outStr = HttpClientHelper.doHttp(url, charSet, parameters, timeOut);
            if (outStr == null) {
                throw new Exception("请求接口失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("请求接口失败!");
        }
        return outStr;
    }
}

package net.zkbc.p2p.fep.util.pay;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

public class HttpClientHelper {

	@SuppressWarnings("deprecation")
	public static String doHttp(String urlStr, String charSet,
			Map<String, String> parameters, String timeOut) throws Exception {
		String responseString = "";
		PostMethod xmlpost;
		int statusCode = 0;
		HttpClient httpclient = new HttpClient();
		httpclient.setConnectionTimeout(new Integer(timeOut).intValue());
		xmlpost = new PostMethod(urlStr);
		httpclient.getParams().setParameter(
				HttpMethodParams.HTTP_CONTENT_CHARSET, charSet);
		try {
			// 组合请求参数
			List<NameValuePair> list = new ArrayList<NameValuePair>();
			for (String key : parameters.keySet()) {
				NameValuePair nvp = new NameValuePair(key,
						String.valueOf(parameters.get(key)));
				list.add(nvp);
			}
			NameValuePair[] nvps = new NameValuePair[list.size()];
			xmlpost.setRequestBody(list.toArray(nvps));
			statusCode = httpclient.executeMethod(xmlpost);
			responseString = xmlpost.getResponseBodyAsString();
			if (statusCode < HttpURLConnection.HTTP_OK
					|| statusCode >= HttpURLConnection.HTTP_MULT_CHOICE) {
				System.err.println("失败返回码[" + statusCode + "]");
				throw new Exception("请求接口失败,失败码[ " + statusCode + " ]");
			}
		} catch (IOException e) {
			e.printStackTrace();
			System.err.println(e.toString());
			throw e;
		}
		return responseString;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值