OkHttpClient 基礎方法封裝

背景

原本使用org.apache.commons.httpclient 方法封裝進行http接口測試,由於支持異步請求和H2不易,因此研究採用 OkHttpClient方式進行替換
爲了保證兼容性,採用的方法調用盡量與原來的org.apache.commons.httpclient 使用方法保持一致

OkHttpClient的強大大家大可百度瞅瞅

踩坑

1.響應結果response.body().string一直不能正常顯示,後來改用原有封裝的讀byte流轉String方式解決

封裝

構造方法

    /**
     * 構造函數初始化
     */
    private OkHttpClientMethod(){

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.readTimeout(30, TimeUnit.SECONDS);//讀取超時
        builder.connectTimeout(10,TimeUnit.SECONDS);//連接超時
        builder.writeTimeout(60,TimeUnit.SECONDS);//寫入超時

        //協議
        List<Protocol> protocols = new ArrayList<Protocol>();
        protocols.add(Protocol.HTTP_1_1);
        protocols.add(Protocol.HTTP_2);


        builder.protocols(protocols);

        //ssl
        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
        builder.hostnameVerifier(new HostnameVerifier() {
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
        builder.sslSocketFactory(sslParams.sSLSocketFactory,sslParams.trustManager);

        //cookie 自動存儲
        builder.cookieJar(new CookieJar() {
            public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                cookieStore.put(url.host(),cookies);
            }

            public List<Cookie> loadForRequest(HttpUrl url) {
                List<Cookie> cookies = cookieStore.get(url.host());
                return cookies != null ? cookies : new ArrayList<Cookie>();
            }
        });

        mOkHttpClient = builder.build();
    }

單例實現

    /**
     * 單例實現
     * @return
     */
    public static OkHttpClientMethod getInstance(){
        if(mInstance == null){
            synchronized (OkHttpClientMethod.class){
                if(mInstance == null){
                    mInstance = new OkHttpClientMethod();
                }
            }
        }
        return mInstance;
    }

設置Header頭

  /**
     * 設置Header頭
     * @param headersParams
     * @return
     */
    private Headers setHeaders(Map<String,Object> headersParams){
        Headers headers = null;

        Headers.Builder headerBuilder = new Headers.Builder();

        if(headersParams != null){
            for (String key:headersParams.keySet()){
                headerBuilder.add(key,headersParams.get(key).toString());
            }
        }

        headers = headerBuilder.build();

        return headers;
    }

設置url參數拼接

    /**
     * 設置get連接拼接參數
     * @param params
     * @return
     */
    private String setUrlParams(Map<String,Object> params){
        StringBuffer param = new StringBuffer();
        int i = 0;
        if(params == null){
            return param.toString();
        }
        for (String key : params.keySet()) {
            if (i == 0)
                param.append("?");
            else
                param.append("&");
            try {
                param.append(key).append("=").append(URLEncoder.encode(params.get(key).toString(),"UTF-8"));  //字符串拼接
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            i++;
        }
        return param.toString();
    }

設置Post表單請求

    /**
     * 設置post表單請求
     * @param params
     * @return
     */
    private RequestBody setPostBody(Map<String,Object> params){

        RequestBody body = null;

        FormBody.Builder formBodyBuilder = new FormBody.Builder();

        if(params != null){
            for (String key:params.keySet()){
                formBodyBuilder.add(key,params.get(key).toString());
            }
        }

        body = formBodyBuilder.build();

        return body;
    }

get方法封裝

    /**
     * Get請求
     * @param url
     * @param urlParams
     * @param headerParams
     * @return
     */
    public Object getMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams){
        Request request = new Request.Builder()
                .url(url + setUrlParams(urlParams))
                .headers(setHeaders(headerParams))
                .get()
                .build();

        Call call = mOkHttpClient.newCall(request);

        JSONObject jsonResult = new JSONObject();
        log.info("Http info:" + request.toString());
        log.info("Http Header:" + request.headers().toString());
        try {
            Response response = call.execute();
            String result = InputStreamUtils.inputStreamTOString(response.body().byteStream(),"UTF-8");
            log.info("Http Result:" + result);
            if (response.isSuccessful()){
                jsonResult =  JSONObject.fromObject(result);
                return jsonResult;
            }

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

        return jsonResult;

    }

異步Get方法封裝

    /**
     * 異步Get請求
     * @param url
     * @param urlParams
     * @param headerParams
     * @return
     */
    public void getAsyncMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){
        Request request = new Request.Builder()
                .url(url + setUrlParams(urlParams))
                .headers(setHeaders(headerParams))
                .get()
                .build();

        Call call = mOkHttpClient.newCall(request);

        log.info("Http info:" + request.toString());
        log.info("Http Header:" + request.headers().toString());

        try {

            call.enqueue(okHttpRequestCallBack);

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

    }

異步Get原生封裝

    /**
     * 異步Get請求 原生
     * @param url
     * @param urlParams
     * @param headerParams
     * @return
     */
    public void getAsyncNativeMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams,Callback callback){
        Request request = new Request.Builder()
                .url(url + setUrlParams(urlParams))
                .headers(setHeaders(headerParams))
                .get()
                .build();

        Call call = mOkHttpClient.newCall(request);

        log.info("Http info:" + request.toString());
        log.info("Http Header:" + request.headers().toString());

        try {

            call.enqueue(callback);

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

異步Post請求

    /**
     * 異步Post請求
     * @param url
     * @param urlParams
     * @param bodyParams
     * @param headerParams
     * @return
     */
    public void postAsyncMethod(String url, Map<String, Object> urlParams, Map<String, Object> bodyParams, Map<String, Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){

        Request request = new Request.Builder()
                .url(url + setUrlParams(urlParams))
                .headers(setHeaders(headerParams))
                .post(setPostBody(bodyParams))
                .build();

        Call call = mOkHttpClient.newCall(request);

        log.info("Http info:" + request.toString());
        log.info("Http Header:" + request.headers().toString());
        log.info("Http params:" + request.body().toString());
        try {
            call.enqueue(okHttpRequestCallBack);

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

    }

異步post JSON請求封裝

    /**
     * 發送JSON 異步post請求
     * @param url
     * @param urlParams
     * @param jsonParams
     * @param headerParams
     * @return
     */
    public void postJsonAsyncMethod(String url,Map<String,Object> urlParams,Object jsonParams,Map<String,Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){
        RequestBody requestBody = FormBody.create(MediaType.parse("application/json"),JSONObject.fromObject(jsonParams).toString());
        Request request = new Request.Builder()
                .url(url + setUrlParams(urlParams))
                .headers(setHeaders(headerParams))
                .post(requestBody)
                .build();

        Call call = mOkHttpClient.newCall(request);


        log.info("Http info:" + request.toString());
        log.info("Http Header:" + request.headers().toString());
        log.info("Http params:" + request.body().toString());
        try {
            call.enqueue(okHttpRequestCallBack);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

調用方式

    /**
     * 測試 JSON 異步JSON請求
     */
    @Test
    public void testPostAsnycJsonHttp() throws Exception{
        //設置url
        String url = "http://192.168.3.14:8980/xxxxxxxxx";


        Map<String,Object> headers = new HashMap<String,Object>();
        headers.put("Content-Type","application/json");
        headers.put("Connection","Upgrade, HTTP2-Settings");
        headers.put("Upgrade","h2c");

        JSONObject params = new JSONObject();
        params.put("searchAll",0);


        OkHttpClientCallBack okHttpClientCallBack = new OkHttpClientCallBack();


        OkHttpClientMethod okHttpClientMethod = OkHttpClientMethod.getInstance();
        okHttpClientMethod.postJsonAsyncMethod(url,null,params,headers,okHttpClientCallBack);


        for (int i = 0; i < 10; i++) {
            System.out.println("我是主線程,線程Id爲:" + Thread.currentThread().getId());
            try {
                Thread.currentThread().sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        Long beforeTime = System.currentTimeMillis();
        System.out.println("你說啥就是啥:" + beforeTime);
        System.out.println(okHttpClientCallBack.getResult());
        Long afterTime = System.currentTimeMillis();
        System.out.println("該幹啥就幹啥:" + Long.toString(afterTime - beforeTime));


    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章