【Android】 HttpClient 發送REST請求

直接po代碼吧,第一個是一個枚舉類型的類,是四種rest http請求,get/post/put/delete:網絡

public enum HttpRequestMethod {
    HttpGet {
        @Override
        public HttpUriRequest createRequest(String url) { return new HttpGet(url); }
    },
    HttpPost {
        @Override
        public HttpUriRequest createRequest(String url) { return new HttpPost(url); }
    },
    HttpPut {
        @Override
        public HttpUriRequest createRequest(String url) { return new HttpPut(url); }
    },
    HttpDelete {
        @Override
        public HttpUriRequest createRequest(String url) { return new HttpDelete(url); }
    };

    public HttpUriRequest createRequest(String url) { return null; }
}

 

接下來是一個HttpUtil類,做用是能夠指定http請求類型、訪問的url和帶的參數:多線程

public class HttpUtil {

    private static final String DEFAULT_LOCAL_ENCODE = "UTF-8";
    private static final String DEFAULT_REMOTE_ENCODE = "UTF-8";
    private static final int HTTP_200 = 200;

    public static HttpClient httpClient = new DefaultHttpClient();
    static {
        httpClient.getParams().setParameter(HttpConnectionParams.SO_TIMEOUT, Integer.valueOf(5000));
        httpClient.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, Integer.valueOf(3000));
    }
    public static final String BASE_URL = "localhost:8080/demo/login";


    public static String sendRequest(HttpRequestMethod requestMethod,
                                     String url,final Map<String ,String> params) throws Exception {

        final HttpUriRequest request = requestMethod.createRequest(url);
        if(params != null) {
            ((HttpEntityEnclosingRequest)request).setEntity(
                    new UrlEncodedFormEntity(MapToPair(params), DEFAULT_REMOTE_ENCODE));
        }
        FutureTask<String> task = new FutureTask<String>(
                new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        HttpResponse response = httpClient.execute(request);
                        if(response.getStatusLine().getStatusCode() == HTTP_200) {
                            return EntityUtils.toString(response.getEntity(), DEFAULT_LOCAL_ENCODE);
                        }
                        return "訪問失敗";
                    }
                }
        );
        new Thread(task).start();
        return task.get();

    }

    static List<NameValuePair> MapToPair(Map<String, String> map) {
        final List<NameValuePair> pairList = new ArrayList<NameValuePair>();
        for (String key : map.keySet()){
            pairList.add(new BasicNameValuePair(key, map.get(key)));
        }
        return pairList;
    }
}

裏面用到了跟多線程有關的FutureTask類,不是很瞭解先用着,感受多線程、併發相關的東西仍是挺多的並且很重要,這裏使用多線程是由於可能會有IO阻塞,這樣會致使主界面掛掉。併發

回想一下,在移動應用程序中,長時間的操做(如網絡、文件或長的計算)不該該在主系統線程上完成。相反,應在一個單獨的工做線程中執行它們。阻塞系統線程會對應用程序的用戶界面的響應能力產生負面影響,有可能致使強行關閉您的應用程序。socket

調用的話很簡單,只須要:ide

HttpUtil.sendRequest(HttpRequestMethod.HttpPost, url, map);

其中map是一個HashMap<String, String>類型的。post

 

 

大功告成~雖然很簡單,可是畢竟第一次寫,學習到很多,固然也想知道HttpClient底層是如何實現的,確定是封裝了socket可是內部必定有一些頗有意思的東西。學習

另外,關於TCP/IP也是水深的能夠,接下來要作聊天了,稍微瞭解了一下長鏈接和短連接,以及心跳機制和輪詢機制,之後會慢慢都寫到博客。url

相關文章
相關標籤/搜索