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

来源:互联网 发布:怎么用iwatch解锁mac 编辑:程序博客网 时间:2024/06/05 02:17

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;}}


0 0
原创粉丝点击