Android架構(gòu)篇-3 網(wǎng)絡(luò)接口封裝

Android架構(gòu)篇-3 網(wǎng)絡(luò)接口封裝

實(shí)現(xiàn)功能:

1.暴露參數(shù)請(qǐng)求地址url、請(qǐng)求方法method、請(qǐng)求參數(shù)params、請(qǐng)求頭header、請(qǐng)求響應(yīng)response、https請(qǐng)求證書

2.支持get、post、文件上傳下載、https證書

以封裝OKhttp為例:

接口定義

業(yè)務(wù)層接口定義

public class BusinessService {
    public static void login(String account, String password, boolean toastError, ServiceHandle<Resp<User>> callBack) {
        Map<String, Object> params = new HashMap<>();
        params.put("account", account);
        params.put("password", password);
        Service.request(InterfaceSuffix.LOGIN, params, HttpMethod.POST, toastError, callBack);
    }
}

module_app_common層接口定義

接口實(shí)現(xiàn)功能:

1)API環(huán)境切換,如本地靜態(tài)配置文件數(shù)據(jù)、swagger mock數(shù)據(jù)、開發(fā)環(huán)境數(shù)據(jù)、測(cè)試環(huán)境數(shù)據(jù)、灰度環(huán)境數(shù)據(jù)、生產(chǎn)環(huán)境數(shù)據(jù)

2)上層屏蔽網(wǎng)絡(luò)出錯(cuò)、后臺(tái)系統(tǒng)出錯(cuò)、后臺(tái)業(yè)務(wù)錯(cuò)誤等數(shù)據(jù),上層業(yè)務(wù)只關(guān)注正確的接口數(shù)據(jù)

3)接口返回?cái)?shù)據(jù)統(tǒng)一模型,不同業(yè)務(wù)通過范型統(tǒng)一返回

4)debug模式打印接口數(shù)據(jù),方便調(diào)試和數(shù)據(jù)監(jiān)聽

5)所有接口統(tǒng)一加上固定請(qǐng)求頭,登錄后再加上token

package com.wrs.project.module.app.common.service;

import com.google.gson.Gson;
import com.wrs.project.module.app.common.service.entity.Resp;
import com.wrs.project.module.app.common.utils.ToastUtil;
import com.wrs.project.module.common.network.HttpMethod;
import com.wrs.project.module.common.network.NetWorkDownloadCallBack;
import com.wrs.project.module.common.network.NetWorkService;
import com.wrs.project.module.common.network.NetWorkServiceCallBack;
import com.wrs.project.module.common.network.entity.RequestTask;
import com.wrs.project.module.common.utils.activitymgr.ActivityMgr;
import com.wrs.project.module.common.utils.utils.L;


import java.io.InputStream;
import java.util.Map;

public class Service {
    public static String SERVER_HOST = "http://192.168.0.1:8081";
    public static String ERROR_MSG = "網(wǎng)絡(luò)出錯(cuò),請(qǐng)稍后再試...";
    public static Gson gson = new Gson();
    public static final String SERVICETAG = "接口日志";

    /**
     *
     * @param suffix url后綴
     * @param params 參數(shù)
     * @param httpMethod 請(qǐng)求方法
     * @param toastError 請(qǐng)求出錯(cuò)時(shí)是否toast提示用戶
     * @param callBack 回調(diào)
     * @param <T> 返回的業(yè)務(wù)模型
     */
    public static <T> void request(String suffix, Map<String, Object> params, HttpMethod httpMethod, boolean toastError, ServiceHandle<T> callBack) {
        Map<String, String> headers = getCommonHeaders();
        String url = SERVER_HOST + suffix;
        http(url, params, headers, httpMethod, new ServiceHandle<T>() {

            @Override
            public void onFail(Exception e) {
                ActivityMgr.getInstance().getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (toastError) {
                            ToastUtil.showToast(ERROR_MSG);
                        }
                        if (null != callBack) {
                            callBack.onFail(e);
                        }
                    }
                });

            }

            @Override
            public void onSuc(T model) {
                ActivityMgr.getInstance().getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (toastError && model instanceof Resp) {
                            Resp resp = (Resp) model;
                            if (!resp.isSuc()) {
                                String msg = resp.getMsg();
                                if (null != msg && msg.length() > 0) {
                                    ToastUtil.showToast(msg);
                                }
                            }
                        }
                        if (null != callBack) {
                            callBack.onSuc(model);
                        }
                    }
                });
            }

            @Override
            public T converJson(String json) throws Exception {
                if (null != callBack) {
                    return callBack.converJson(json);
                } else {
                    return super.converJson(json);
                }
            }
        });

    }

    private static <T> void http(String url, Map<String, Object> params, Map<String, String> headers, HttpMethod httpMethod, ServiceHandle<T> callBack) {
        NetWorkServiceCallBack serviceCallBack = new NetWorkServiceCallBack() {
            @Override
            public void onFailure(Exception e) {
                L.e(SERVICETAG, "url:" + url);
                L.e(SERVICETAG, "Exception" + e.toString());
                if (null != callBack) {
                    callBack.onFail(e);
                }
            }

            @Override
            public void onResponse(String response) {
                L.e(SERVICETAG, "url:" + url);
                L.e(SERVICETAG, "response:" + response);
                if (null != callBack) {
                    try {
                        T model = callBack.converJson(response);
                        callBack.onSuc(model);
                    } catch (Exception e) {
                        callBack.onFail(e);
                    }
                }
            }
        };
        switch (httpMethod) {
            case GET:
            {
                Map requestParams = null;
                if (null != params && !params.isEmpty()) {
                    requestParams = params;
                }
                NetWorkService.request(url, requestParams, headers, httpMethod, serviceCallBack, new  InputStream[]{});
            }
                break;
            case POST:
            {
                String body = "{}";
                if (null != params) {
                    body = gson.toJson(params);
                }
                NetWorkService.postBody(url, body, headers, serviceCallBack, new  InputStream[]{});
            }
                break;
        }

    }

    public static RequestTask downloadFile(String url, String saveDir, final String fileName, Map<String, String> params, Map<String, String> headers, NetWorkDownloadCallBack callBack, InputStream... certificates) {
        return NetWorkService.downloadFile(url, saveDir, fileName, params, headers, callBack, certificates);
    }

    public static Map<String, String> getCommonHeaders(){
        return null;
    }

}

module_common_network層接口定義

  package com.wrs.project.module.common.network;



import com.wrs.project.module.common.network.entity.RequestTask;
import com.wrs.project.module.common.network.okhttp.OkHttpService;

import java.io.File;
import java.io.InputStream;
import java.util.Map;

import okhttp3.Call;

public class NetWorkService {
    public static int CONNECT_TIMEOUT = 10;
    public static int READ_TIMEOUT = 20;
    public static int WRITE_TIMEOUT = 20;

    public static void request(String url, Map<String, String> params, Map<String, String> headers, HttpMethod httpMethod, NetWorkServiceCallBack callBack, InputStream... certificates) {
        OkHttpService.request(url, params, headers, httpMethod, callBack, certificates);
    }

    public static void postBody(String url, String body, Map<String, String> headers, NetWorkServiceCallBack callBack, InputStream... certificates) {
        OkHttpService.postBody(url, body, headers, callBack, certificates);
    }

    public static void postFile(String url, Map<String, String> params, Map<String, String> headers, File file, String fileName, String fileKey, NetWorkServiceCallBack callBack, InputStream... certificates) {
        OkHttpService.postFile(url, params, headers, file, fileName, fileKey, callBack, certificates);
    }

    public static RequestTask downloadFile(String url, String saveDir, final String fileName, Map<String, String> params, Map<String, String> headers, NetWorkDownloadCallBack callBack, InputStream... certificates) {
        Call call = OkHttpService.downloadFile(url, saveDir, fileName, params, headers, callBack, certificates);
        return new RequestTask(call);
    }

}

封裝okhttp

package com.wrs.project.module.common.network.okhttp;

import android.text.TextUtils;


import com.wrs.project.module.common.network.HttpMethod;
import com.wrs.project.module.common.network.NetWorkDownloadCallBack;
import com.wrs.project.module.common.network.NetWorkService;
import com.wrs.project.module.common.network.NetWorkServiceCallBack;
import com.wrs.project.module.common.network.SSLUtil;
import com.wrs.project.module.common.network.TrustAllCerts;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttpService {
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static OkHttpService okHttpService;//單例模式

    public static void request(String url, Map<String, String> params, Map<String, String> headers, HttpMethod httpMethod, NetWorkServiceCallBack callBack, InputStream... certificates) {
        switch (httpMethod) {
            case GET:
                get(url, params, headers, callBack, certificates);
                break;
            case POST:
                post(url, params, headers, callBack, certificates);
                break;
            default:
                break;
        }
    }

    public static Call downloadFile(String url, String saveDir, final String fileName, Map<String, String> params, Map<String, String> headers, NetWorkDownloadCallBack downloadCallBack, InputStream... certificates) {
        Request.Builder requestBuilder = new Request.Builder();
        HttpUrl.Builder urlBuilder = HttpUrl.parse(url)
                .newBuilder();
        if (null != params && params.keySet().size() > 0) {
            for (String key : params.keySet()) {
                String value = params.get(key);
                urlBuilder.addQueryParameter(key, value);
            }
        }
        requestBuilder.url(urlBuilder.build());
        addHeaders(requestBuilder, headers);
        Request request = requestBuilder.build();

        OkHttpClient.Builder builder = null;
        if (request.isHttps() && null != certificates && certificates.length > 0) {
            builder = getClientBuilder(certificates);
        } else {
            builder = getIgnoreHttpsClientBuilder(request.isHttps());
        }
        OkHttpClient client = builder.build();
    Call call =  client.newCall(request);
    call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
               if (null != downloadCallBack) {
                   downloadCallBack.onFailure(e);
               }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (null != downloadCallBack) {
                    InputStream is = null;
                    byte[] buf = new byte[2048];
                    int len = 0;
                    FileOutputStream fos = null;
                    String name = getHeaderFileName(response);
                    if (null == name) {
                        name = fileName;
                    }
                    File file = new File(saveDir, name);
                    boolean suc = true;
                    // 儲(chǔ)存下載文件的目錄
                    try {
                        is = response.body().byteStream();
                        long total = response.body().contentLength();
                       File parent = file.getParentFile();
                       if (!parent.exists()) {
                           parent.mkdirs();
                       }
                        fos = new FileOutputStream(file);
                        long sum = 0;
                        while ((len = is.read(buf)) != -1) {
                            fos.write(buf, 0, len);
                            sum += len;
                            float progress = sum * 1.0f / total ;
                            if (null != downloadCallBack) {
                                downloadCallBack.onProgress(progress);
                            }
                        }
                        fos.flush();

                    } catch (Exception e) {
                        suc = false;
                        if (null != downloadCallBack) {
                            downloadCallBack.onFailure(e);
                        }
                    } finally {
                        try {
                            if (is != null) {
                                is.close();
                            }
                        } catch (IOException e) {
                        }
                        try {
                            if (fos != null) {
                                fos.close();
                            }
                        } catch (IOException e) {
                        }
                        if (suc && null != downloadCallBack) {
                            downloadCallBack.onSuccess(file);
                        }
                    }

                }
            }
        });
        return call;
    }

    private static String getHeaderFileName(Response response) {
        String dispositionHeader = response.header("Content-Disposition");
        if (!TextUtils.isEmpty(dispositionHeader)) {
            dispositionHeader.replace("attachment;filename=", "");
            dispositionHeader.replace("filename*=utf-8", "");
            String[] strings = dispositionHeader.split("; ");
            if (strings.length > 1) {
                dispositionHeader = strings[1].replace("filename=", "");
                dispositionHeader = dispositionHeader.replace("\"", "");
                return dispositionHeader;
            }
            return null;
        }
        return null;
    }


//    private String isExistDir(String saveDir) throws IOException {
//        // 下載位置
//        File downloadFile = new File(context.getExternalFilesDir(null), saveDir);
//        if (!downloadFile.mkdirs()) {
//            downloadFile.createNewFile();
//        }
//        String savePath = downloadFile.getAbsolutePath();
//        return savePath;
//    }

    public static OkHttpService getInstance() {
        if (okHttpService == null) {
            synchronized (OkHttpService.class) {
                if (okHttpService == null) {
                    okHttpService = new OkHttpService();
                }
            }
        }
        return okHttpService;
    }

    public static void get(String url, Map<String, String> params, Map<String, String> headers, NetWorkServiceCallBack callBack, InputStream... certificates) {
        Request.Builder requestBuilder = new Request.Builder();
        HttpUrl.Builder urlBuilder = HttpUrl.parse(url)
                .newBuilder();
        if (null != params && params.keySet().size() > 0) {
            for (String key : params.keySet()) {
                String value = params.get(key);
                urlBuilder.addQueryParameter(key, value);
            }
        }
        requestBuilder.url(urlBuilder.build());
        addHeaders(requestBuilder, headers);
        Request request = requestBuilder.build();
        startRequest(request, callBack, certificates);
    }

    public static void post(String url, Map<String, String> params, Map<String, String> headers, NetWorkServiceCallBack callBack, InputStream... certificates) {
        FormBody.Builder bodyBuilder = new FormBody.Builder();
        addParams(bodyBuilder, params);
        RequestBody body = bodyBuilder.build();
        Request.Builder requestBuild = new Request.Builder();
        requestBuild.url(url);
        requestBuild.post(body);
        addHeaders(requestBuild, headers);
        Request request = requestBuild.build();
        startRequest(request, callBack, certificates);
    }

    public static void postBody(String url, String body, Map<String, String> headers, NetWorkServiceCallBack callBack, InputStream... certificates) {
        RequestBody requestBody = RequestBody.create(JSON, body);
        Request.Builder requestBuild = new Request.Builder();
        requestBuild.url(url);
        requestBuild.post(requestBody);
        addHeaders(requestBuild, headers);
        Request request = requestBuild.build();
        startRequest(request, callBack, certificates);
    }

    public static void postFile(String url, Map<String, String> params, Map<String, String> headers, File file, String fileName, String fileKey, NetWorkServiceCallBack callBack, InputStream... certificates) {
        RequestBody requestBody =  RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        builder.addFormDataPart(fileKey, fileName, requestBody);
        if (null != params && params.keySet().size() > 0) {
            for (String key : params.keySet()) {
                String value = params.get(key);
                if (null != value) {
                    builder.addFormDataPart(key, value);
                }
            }
        }

        Request.Builder requestBuild = new Request.Builder();
        requestBuild.url(url);
        requestBuild.post(builder.build());
        addHeaders(requestBuild, headers);
        Request request = requestBuild.build();
        startRequest(request, callBack, certificates);
    }

    public static void addParams(FormBody.Builder builder, Map<String, String> params) {
        if (null != params && params.keySet().size() > 0) {
            for (String key : params.keySet()) {
                String value = params.get(key);
                if (null != value) {
                    builder.add(key, value);
                }
            }
        }
    }

    public static void addHeaders(Request.Builder builder, Map<String, String> headers) {
        if (null != headers && headers.keySet().size() > 0) {
            for (String key : headers.keySet()) {
                String value = headers.get(key);
                if (null != value) {
                    builder.header(key, value);
                }
            }
        }
    }

    public static void startRequest(Request request, NetWorkServiceCallBack callBack, InputStream... certificates) {
        OkHttpClient.Builder builder = null;
        if (request.isHttps() && null != certificates && certificates.length > 0) {
            builder = getClientBuilder(certificates);
        } else {
            builder = getIgnoreHttpsClientBuilder(request.isHttps());
        }

        builder.connectTimeout(NetWorkService.CONNECT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(NetWorkService.READ_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(NetWorkService.WRITE_TIMEOUT, TimeUnit.SECONDS);
        OkHttpClient client = builder.build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                if (null != callBack) {
                    callBack.onFailure(e);
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (null != callBack) {
                    callBack.onResponse(response.body().string());
                }
            }
        });
    }

    public static OkHttpClient.Builder getIgnoreHttpsClientBuilder(Boolean isHttps) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        if (isHttps) {
            HostnameVerifier hostnameVerifier = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
            X509TrustManager xtm = new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    X509Certificate[] x509Certificates = new X509Certificate[0];
                    return x509Certificates;
                }
            };

            SSLContext sslContext = null;
            try {
                sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyManagementException e) {
                e.printStackTrace();
            }
            builder.sslSocketFactory(sslContext.getSocketFactory(), xtm);
            builder.hostnameVerifier(hostnameVerifier);
        }
        return builder;
    }


    public static OkHttpClient.Builder getClientBuilder(InputStream... certificates) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        SSLSocketFactory sslSocketFactory = SSLUtil.getSSLSocketFactory(certificates);
        X509TrustManager xtm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                X509Certificate[] x509Certificates = new X509Certificate[0];
                return x509Certificates;
            }
        };
//        builder.sslSocketFactory(SSLUtil.getSSLSocketFactory(fiddleCerInStream, inStream));
        builder.sslSocketFactory(sslSocketFactory, xtm);
        builder.hostnameVerifier(new TrustAllCerts.TrustAllHostnameVerifier());
        return builder;
    }


}

源碼下載

還有 2% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
支付 ¥8.88 繼續(xù)閱讀

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容