OkHttp使用Get和Post訪問服務器的工具類(一)

首先來簡單介紹一下okttp框架,相似於HttpUrlConnection,Android6.0之後,廢棄了Apache Http Client,只有HttpUrlConnection和OkHttp了,相對而言,OkHttp愈來愈受到開發者的喜好,那麼它的優點在哪呢?java

1,支持SPDY,共享同一個Socket來處理同一個服務器的全部請求
2,若是SPDY不可用,則經過鏈接池來減小請求延時
3,無縫的支持GZIP來減小數據流量
4,緩存響應數據來減小重複的網絡請求android

SPDY(讀做「SPeeDY」)是Google開發的基於TCP的應用層協議,用以最小化網絡延遲,提高網絡速度,優化用戶的網絡使用體驗。SPDY並非一種用於替代HTTP的協議,而是對HTTP協議的加強。新協議的功能包括數據流的多路複用、請求優先級以及HTTP報頭壓縮。谷歌表示,引入SPDY協議後,在實驗室測試中頁面加載速度比原先快64%。json

ZIP最先由Jean-loup Gailly和Mark Adler建立,用於UNⅨ系統的文件壓縮。咱們在Linux中常常會用到後綴爲.gz的文件,它們就是GZIP格式的。現今已經成爲Internet 上使用很是廣泛的一種數據壓縮格式,或者說一種文件格式。
HTTP協議上的GZIP編碼是一種用來改進WEB應用程序性能的技術。大流量的WEB站點經常使用GZIP壓縮技術來讓用戶感覺更快的速度。這通常是指WWW服務器中安裝的一個功能,當有人來訪問這個服務器中的網站時,服務器中的這個功能就將網頁內容壓縮後傳輸到來訪的電腦瀏覽器中顯示出來.通常對純文本內容可壓縮到原大小的40%.這樣傳輸就快了,效果就是你點擊網址後會很快的顯示出來.固然這也會增長服務器的負載. 通常服務器中都安裝有這個功能模塊的。瀏覽器

好了,下面來看封裝類
1.HttpCallBackListener
public  interface  HttpCallbackListener {
    void onFinish(String response);

    void onError(Exception e);
}

2.主體緩存

import android.util.Log;

import com.squareup.okhttp.Callback;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * Created by liang on 2016/8/15.
 */
public class OkHttpUtil {
    public static final MediaType JSON= MediaType.parse("application/json; charset=utf-8");

    public static void sendHttpRequestForGet(final String path, final Map<String, String> params, final HttpCallbackListener listener) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                try {
                    final  StringBuilder response_builder = new StringBuilder();
                    final StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.append(path).append("?");
                    if (params != null && params.size() != 0) {
                        for (Map.Entry<String, String> entry : params.entrySet()) {
                            //轉換成UTF-8
                            stringBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "utf-8"));
                            stringBuilder.append("&");
                        }
                        //刪除最後一個字符&
                        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                    }
                    //此時網址變長了,增長了Map中的內容
                    URL url = new URL(stringBuilder.toString());
                    Request request = new Request.Builder().url(url).build();

                    //必需要有實例化事後的對象!!!
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {

                        }
                        //經過response能夠獲得code,message,url等信息
                        @Override
                        public void onResponse(Response response) throws IOException {
                            //讀取返回的數據
                            InputStream in = response.body().byteStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
                            String line;
                            while ((line = reader.readLine()) != null) {
                                response_builder.append(line);
                            }
                            Log.e("OkHttpUtil", response.toString());
                            //將數據傳進MainActivity
                            if (listener != null) {
                                listener.onFinish(response_builder.toString());
                            }
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void sendHttpRequestForPost(final String path, final Map<String, String> paramsValue, final HttpCallbackListener listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                try{
                    final  StringBuilder response_builder = new StringBuilder();
                    JSONObject jsonObject = new JSONObject();
                    for(Map.Entry<String,String> entry:paramsValue.entrySet()){
                        jsonObject.put(entry.getKey(),entry.getValue());
                    }
                    //請求的主體
                    RequestBody requestBody=RequestBody.create(JSON,jsonObject.toString());
                    Request request=new Request.Builder().url(path).post(requestBody).build();
                    //使用異步的方法
                    okHttpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {
                            Log.e("OkHttpUtil","response fail");
                        }

                        @Override
                        public void onResponse(Response response) throws IOException {
                            //讀取返回的數據
                            InputStream in = response.body().byteStream();
                            BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
                            String line;
                            while ((line = reader.readLine()) != null) {
                                response_builder.append(line);
                            }
                            Log.e("OkHttpUtil", response.toString());

                            if (listener != null) {
                                listener.onFinish(response_builder.toString());
                            }
                        }
                    });

                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

這只是一個小小的例子,適合小白入門使用。服務器

相關文章
相關標籤/搜索