package com.openfire.net; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.multipart.FilePart; import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; import org.apache.commons.httpclient.methods.multipart.Part; import org.apache.commons.httpclient.methods.multipart.StringPart; import org.apache.commons.httpclient.params.HttpMethodParams; public class OHttpClient { public static final String UTF_8 = "UTF-8"; private final static int TIMEOUT_CONNECTION = 20000; private final static int TIMEOUT_SOCKET = 30000; private final static int RETRY_TIME = 3; private static HttpClient getHttpClient() { HttpClient httpClient = new HttpClient(); // 设置 HttpClient 接收 Cookie,用与浏览器一样的策略 httpClient.getParams().setCookiePolicy( CookiePolicy.BROWSER_COMPATIBILITY); // 设置 默认的超时重试处理策略 httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); // 设置 连接超时时间 httpClient.getHttpConnectionManager().getParams() .setConnectionTimeout(TIMEOUT_CONNECTION); // 设置 读数据超时时间 httpClient.getHttpConnectionManager().getParams() .setSoTimeout(TIMEOUT_SOCKET); // 设置 字符集 httpClient.getParams().setContentCharset(UTF_8); return httpClient; } private static GetMethod getHttpGet(String url) { GetMethod httpGet = new GetMethod(url); // 设置 请求超时时间 httpGet.getParams().setSoTimeout(TIMEOUT_SOCKET); return httpGet; } private static PostMethod getHttpPost(String url) { PostMethod httpPost = new PostMethod(url); // 设置 请求超时时间 httpPost.getParams().setSoTimeout(TIMEOUT_SOCKET); return httpPost; } private static String _MakeURL(String p_url, Map<String, Object> params) { StringBuilder url = new StringBuilder(p_url); if (url.indexOf("?") < 0) url.append('?'); for (String name : params.keySet()) { url.append('&'); url.append(name); url.append('='); url.append(String.valueOf(params.get(name))); // 不做URLEncoder处理 // url.append(URLEncoder.encode(String.valueOf(params.get(name)), // UTF_8)); } return url.toString().replace("?&", "?"); } /** * 公用post方法 * * @param url * @param params * @param files * @throws AppException */ private static InputStream _post(String url, Map<String, Object> params, Map<String, File> files) { // System.out.println("post_url==> "+url); HttpClient httpClient = null; PostMethod httpPost = null; // post表单参数处理 int length = (params == null ? 0 : params.size()) + (files == null ? 0 : files.size()); Part[] parts = new Part[length]; int i = 0; if (params != null) for (String name : params.keySet()) { parts[i++] = new StringPart(name, String.valueOf(params .get(name)), UTF_8); // System.out.println("post_key==> "+name+" value==>"+String.valueOf(params.get(name))); } if (files != null) for (String file : files.keySet()) { try { parts[i++] = new FilePart(file, files.get(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } // System.out.println("post_key_file==> "+file); } String responseBody = ""; int time = 0; do { try { httpClient = getHttpClient(); httpPost = getHttpPost(url); httpPost.setRequestEntity(new MultipartRequestEntity(parts, httpPost.getParams())); int statusCode = httpClient.executeMethod(httpPost); if (statusCode != HttpStatus.SC_OK) { // throw AppException.http(statusCode); } else if (statusCode == HttpStatus.SC_OK) { Cookie[] cookies = httpClient.getState().getCookies(); String tmpcookies = ""; for (Cookie ck : cookies) { tmpcookies += ck.toString() + ";"; } } responseBody = httpPost.getResponseBodyAsString(); // System.out.println("XMLDATA=====>"+responseBody); break; } catch (HttpException e) { time++; if (time < RETRY_TIME) { try { Thread.sleep(1000); } catch (InterruptedException e1) { } continue; } // 发生致命的异常,可能是协议不对或者返回的内容有问题 e.printStackTrace(); // throw AppException.http(e); } catch (IOException e) { time++; if (time < RETRY_TIME) { try { Thread.sleep(1000); } catch (InterruptedException e1) { } continue; } // 发生网络异常 e.printStackTrace(); // throw AppException.network(e); } finally { // 释放连接 httpPost.releaseConnection(); httpClient = null; } } while (time < RETRY_TIME); return new ByteArrayInputStream(responseBody.getBytes()); } /** * 传文件 */ public static InputStream upFile(File file) { Map<String, File> files = new HashMap<String, File>(); if (file != null) files.put("amr", file); return _post("http://par.hzparty.com/mobile.php/Public/UpOpenfireFiles", null, files); } }