package net.oschina.app.api; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; 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; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /** * API客户端接口:用于访问网络数据 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class ApiClient { public static final String UTF_8 = "UTF-8"; public static final String DESC = "descend"; public static final String ASC = "ascend"; private final static int TIMEOUT_CONNECTION = 20000; private final static int TIMEOUT_SOCKET = 20000; 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, String cookie, String userAgent) { GetMethod httpGet = new GetMethod(url); // 设置 请求超时时间 httpGet.getParams().setSoTimeout(TIMEOUT_SOCKET); httpGet.setRequestHeader("Host", "mob.cei.gov.cn"); httpGet.setRequestHeader("Connection","Keep-Alive"); httpGet.setRequestHeader("Cookie", cookie); httpGet.setRequestHeader("User-Agent", userAgent); return httpGet; } /** * 获取网络图片 * @param url * @return */ public static Bitmap getNetBitmap(String url) throws Exception { HttpClient httpClient = null; GetMethod httpGet = null; Bitmap bitmap = null; int time = 0; do{ try { httpClient = getHttpClient(); httpGet = getHttpGet(url, null, null); int statusCode = httpClient.executeMethod(httpGet); if (statusCode != HttpStatus.SC_OK) { throw new Exception(); } InputStream inStream = httpGet.getResponseBodyAsStream(); bitmap = BitmapFactory.decodeStream(inStream); inStream.close(); break; } catch (HttpException e) { time++; if(time < RETRY_TIME) { try { Thread.sleep(1000); } catch (InterruptedException e1) {} continue; } // 发生致命的异常,可能是协议不对或者返回的内容有问题 e.printStackTrace(); throw new Exception(); } catch (IOException e) { time++; if(time < RETRY_TIME) { try { Thread.sleep(1000); } catch (InterruptedException e1) {} continue; } // 发生网络异常 e.printStackTrace(); throw new Exception(); } finally { // 释放连接 httpGet.releaseConnection(); httpClient = null; } }while(time < RETRY_TIME); return bitmap; } }