Http

作者: 啊了个支 | 来源:发表于2018-04-27 10:02 被阅读0次
    public class HttpClient {
    
        private final String                      URL;
        private final WeakHashMap<String, String> PARAMS;
        private final IRequest                    REQUEST;
        private final ISuccess                    SUCCESS;
        private final IFailure                    FAILURE;
        private final IError                      ERROR;
        private final IMistake                    MISTAKE;
        private final RequestBody                 BODY;
        private final Context                     CONTEXT;
    
     public HttpClient(String url, IRequest iRequest, ISuccess iSuccess, IFailure iFailure, IError iError, IMistake iMistake, RequestBody body, WeakHashMap<String, String> params, Context context) {
            this.URL = url;
            this.REQUEST = iRequest;
            this.SUCCESS = iSuccess;
            this.FAILURE = iFailure;
            this.ERROR = iError;
            this.MISTAKE = iMistake;
            this.BODY = body;
            this.PARAMS = params;
            this.CONTEXT = context;
        }
    
        public static HttpClientBuilder builder() {
            return new HttpClientBuilder();
        }
    
     public void request(HttpMethod httpMethod) {
            OkHttpClient client = HttpCreator.getOkHttpClient();
            Call call = null;
            if (REQUEST != null) {
                REQUEST.onRequestStart();
            }
            switch (httpMethod) {
                case GET:
                    call = get(client);
                    break;
                case POST:
                    call = post(client);
                    break;
                case POST_RAW:
                    call = postRaw(client);
                    break;
            }
    
            if (call != null) {
                call.enqueue(getRequestCallback());
            }
        }
    
    private Call get(OkHttpClient client) {
            String url = URL;
            boolean first = true;
            for (Map.Entry<String, String> entry : PARAMS.entrySet()) {
                url += first ? "?" : "&";
                url += entry.getKey() + "=" + entry.getValue();
                first = false;
            }
            Request request = new Request.Builder()
                    .get()
                    .url(url)
                    .build();
            return client.newCall(request);
        }
    
        private Call post(OkHttpClient client) {
            FormBody.Builder builder = new FormBody.Builder();
            for (Map.Entry<String, String> entry : PARAMS.entrySet()) {
                builder.add(entry.getKey(), entry.getValue());
            }
            RequestBody requestBodyPost = builder.build();
            Request request = new Request.Builder()
                    .url(URL)
                    .post(requestBodyPost)
                    .build();
            return client.newCall(request);
        }
    
     private Call postRaw(OkHttpClient client) {
            Request request = new Request.Builder()
                    .url(URL)
                    .post(BODY)
                    .build();
            return client.newCall(request);
        }
    
        private Callback getRequestCallback() {
            return new RequestCallbacks(
                    REQUEST,
                    SUCCESS,
                    FAILURE,
                    ERROR,
                    MISTAKE
            );
        }
    
        public void get() {
            request(HttpMethod.GET);
        }
    
        public void post() {
            if (BODY != null) {
                request(HttpMethod.POST_RAW);
            } else {
                request(HttpMethod.POST);
            }
        }
    }
    
    /*************************************************************/
    
    public class HttpClientBuilder {
    
        private String mUrl;
        private WeakHashMap<String, String> mParams = new WeakHashMap<>();
        private IRequest    mRequest;
        private ISuccess    mSuccess;
        private IFailure    mFailure;
        private IError      mError;
        private IMistake    mMistake;
        private RequestBody mBody;
        private Context     mContext;
    
        public HttpClientBuilder url(String url) {
            this.mUrl = url;
            return this;
        }
    
        public HttpClientBuilder params(WeakHashMap<String, String> params) {
            this.mParams.putAll(params);
            return this;
        }
    
        public HttpClientBuilder raw(String raw) {
            this.mBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), raw);
            return this;
        }
    
     public HttpClientBuilder onRequest(IRequest iRequest) {
            this.mRequest = iRequest;
            return this;
        }
    
        public HttpClientBuilder onSuccess(ISuccess iSuccess) {
            this.mSuccess = iSuccess;
            return this;
        }
    
        public HttpClientBuilder onFailure(IFailure iFailure) {
            this.mFailure = iFailure;
            return this;
        }
    
        public HttpClientBuilder onError(IError iError) {
            this.mError = iError;
            return this;
        }
    
        public HttpClientBuilder onMistake(IMistake iMistake) {
            this.mMistake = iMistake;
            return this;
        }
    
        public final HttpClient build() {
            return new HttpClient(mUrl, mRequest, mSuccess, mFailure, mError, mMistake, mBody, mParams, mContext);
        }
    }
    
    
    /*************************************************************/
    
    public class HttpCreator {
    
        private static final class OkHttpHolder {
            private static final int                  TIME_OUT = 60;
            private static final OkHttpClient.Builder BUILDER  = new OkHttpClient.Builder();
    
            // TODO: 2018/4/11 这里可以添加拦截器
            private static final OkHttpClient.Builder addInterceptors() {
                // 日志拦截器(只在debug模式下输出)
                if (BuildConfig.DEBUG) {
                    BUILDER.addInterceptor(new LogInterceptor());
                }
                return BUILDER;
            }
    
            private static final OkHttpClient OK_HTTP_CLIENT = addInterceptors()
                    .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .build();
        }
    
        public static OkHttpClient getOkHttpClient() {
            return OkHttpHolder.OK_HTTP_CLIENT;
        }
    
    }
    
    
    
    /*************************************************************/
    
    public enum HttpMethod {
        GET, // get请求
        POST, // 表单请求
        POST_RAW, // json请求
    }
    
    
    /*************************************************************/
    public abstract class GsonSuccess<T> implements ISuccess {
    
        protected Class<T> mClzBean;
    
        public GsonSuccess() {
            ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
            mClzBean = (Class<T>) pt.getActualTypeArguments()[0];
        }
    
        @Override
        public void onSuccess(String onResponse) {
            if (!TextUtils.isEmpty(onResponse)) {
                onSuccess((T) GsonUtil.fromJson(onResponse, mClzBean));
            } else {
                onSuccess((T) null);
            }
        }
    
        public abstract void onSuccess(T t);
    }
    
    
    /*************************************************************/
    
    public class RequestCallbacks implements Callback {
        private final IRequest REQUEST;
        private final ISuccess SUCCESS;
        private final IFailure FAILURE;
        private final IError   ERROR;
        private final IMistake MISTAKE;
    
        public RequestCallbacks(IRequest request, ISuccess success, IFailure failure, IError error, IMistake mistake) {
            this.REQUEST = request;
            this.SUCCESS = success;
            this.FAILURE = failure;
            this.ERROR = error;
            this.MISTAKE = mistake;
        }
    
        @Override
        public void onFailure(Call call, IOException e) {
            if (FAILURE != null) {
                FAILURE.onFailure(e.getMessage());
            }
            if (MISTAKE != null) {
                MISTAKE.onMistake(e.getMessage());
            }
            callRequestEnd();
        }
    
     @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                if (call.isExecuted()) {
                    if (SUCCESS != null) {
                        SUCCESS.onSuccess(response.body().string());
                    }
                }
            } else {
                if (ERROR != null) {
                    ERROR.onError(response.code(), response.message());
                }
                if (MISTAKE != null) {
                    MISTAKE.onMistake(response.message());
                }
            }
            callRequestEnd();
        }
    
        private void callRequestEnd() {
            if (REQUEST != null) {
                REQUEST.onRequestEnd();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Http

          本文链接:https://www.haomeiwen.com/subject/tcfpkftx.html