Android實戰之HttpClient

fmms 12年前發布 | 29K 次閱讀 Android Android開發 移動開發

最近在看Android的開發,其中用到了HttpClient來提交或者獲取server端的數據,但是Android自帶的API還是有點不好用,所以自己根據自己的需要就做了一個包裝,如下:

 

HttpConnectionUtil類是一個工具類,其中提供了同步和異步方法,并且目前是支持http的Get和Post方法。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.os.Handler;
import android.util.Log;
public class HttpConnectionUtil {
    public static enum HttpMethod {GET, POST}

    public void asyncConnect(final String url, final HttpMethod method, final HttpConnectionCallback callback) {
        asyncConnect(url, null, method, callback);
    }

    public void syncConnect(final String url, final HttpMethod method, final HttpConnectionCallback callback) {
        syncConnect(url, null, method, callback);
    }

    public void asyncConnect(final String url, final Map<String, String> params, 
            final HttpMethod method, final HttpConnectionCallback callback) {
        Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            public void run() {
                syncConnect(url, params, method, callback);
            }
        };
        handler.post(runnable);
    }

    public void syncConnect(final String url, final Map<String, String> params, 
            final HttpMethod method, final HttpConnectionCallback callback) {
        String json = null;
        BufferedReader reader = null;

        try {
            HttpClient client = new DefaultHttpClient();
            HttpUriRequest request = getRequest(url, params, method);
            HttpResponse response = client.execute(request);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuilder sb = new StringBuilder();
                for (String s = reader.readLine(); s != null; s = reader.readLine()) {
                    sb.append(s);
                }
                json = sb.toString();
            }
        } catch (ClientProtocolException e) {
            Log.e("HttpConnectionUtil", e.getMessage(), e);
        } catch (IOException e) {
            Log.e("HttpConnectionUtil", e.getMessage(), e);
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                // ignore me
            }
        }
        callback.execute(json);
    }

    private HttpUriRequest getRequest(String url, Map<String, String> params, HttpMethod method) {
        if (method.equals(HttpMethod.POST)) {
            List<NameValuePair> listParams = new ArrayList<NameValuePair>();
            if (params != null) {
                for (String name : params.keySet()) {
                    listParams.add(new BasicNameValuePair(name, params.get(name)));
                }
            }
            try {
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(listParams);
                HttpPost request = new HttpPost(url);
                request.setEntity(entity);
                return request;
            } catch (UnsupportedEncodingException e) {
                // Should not come here, ignore me.
                throw new java.lang.RuntimeException(e.getMessage(), e);
            }
        } else {
            if (url.indexOf("?") < 0) {
                url += "?";
            }
            if (params != null) {
                for (String name : params.keySet()) {
                    url += "&" + name + "=" + URLEncoder.encode(params.get(name));
                }
            }
            HttpGet request = new HttpGet(url);
            return request;
        }
    }
}
HttpConnectionCallback類是一個回調類,用來處理請求完畢后的邏輯。
public interface HttpConnectionCallback {
    /**
     * Call back method will be execute after the http request return.
     * @param response the response of http request. 
     * The value will be null if any error occur.
     */
    void execute(String response);
}

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!