All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.iteaj.iot.client.http.okhttp.OkHttpManager Maven / Gradle / Ivy

package com.iteaj.iot.client.http.okhttp;

import com.iteaj.iot.client.http.*;
import okhttp3.*;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class OkHttpManager implements HttpManager, InitializingBean {

    private OkHttpClient client = new OkHttpClient().newBuilder()
            .connectTimeout(5, TimeUnit.SECONDS)
            .readTimeout(HttpConst.DefaultTimeout, TimeUnit.SECONDS).build();

    @Override
    public HttpResponseMessage get(HttpRequestMessage requestMessage) {
        long timeout = requestMessage.getTimeout();

        String url = requestMessage.getUrl();
        if(!StringUtils.hasText(url)) {
            throw new HttpProtocolException("请求url必填");
        }
        Response response = null;
        try {
            OkHttpClient okHttpClient = client;

            if(timeout != HttpConst.DefaultTimeout) {
                okHttpClient = client.newBuilder().readTimeout(timeout, TimeUnit.SECONDS).build();
            }

            // 构建请求的url
            url = buildRequestUrl(url, requestMessage.getParam());

            Request.Builder builder = new Request.Builder().get().url(url);
            handleRequestHeader(requestMessage, builder);

            response = okHttpClient.newCall(builder.build()).execute();

            ResponseBody responseBody = response.body();
            return new HttpResponseMessage(response.code(), responseBody.bytes(), responseBody.contentType().type());
        } catch (IOException e) {
            throw new HttpProtocolException(e.getMessage(), e);
        } finally {
            if(response != null) {
                response.body().close();
            }
        }
    }

    private void handleRequestHeader(HttpRequestMessage requestMessage, Request.Builder builder) {
        Map heads = requestMessage.getHeads();
        if(!CollectionUtils.isEmpty(heads)) {
            heads.forEach((key, val) -> {
                builder.addHeader(key, val);
            });
        }
    }

    @Override
    public void get(HttpRequestMessage requestMessage, ClientHttpProtocol.HttpProtocolCall handle) {
        long timeout = requestMessage.getTimeout();

        String url = requestMessage.getUrl();
        if(!StringUtils.hasText(url)) {
            throw new HttpProtocolException("请求url必填");
        }

        if(null == handle) {
            throw new HttpProtocolException("未指定异步协议处理器: [ProtocolHandle]");
        }

        // 构建请求的Url
        url = buildRequestUrl(url, requestMessage.getParam());

        try {
            OkHttpClient okHttpClient = client;
            if(timeout != HttpConst.DefaultTimeout) {
                okHttpClient = client.newBuilder().readTimeout(timeout, TimeUnit.SECONDS).build();
            }

            Request.Builder builder = new Request.Builder().get().url(url);

            // 复制请求头
            handleRequestHeader(requestMessage, builder);

            httpAsyncCallback(handle, okHttpClient, builder);

        } catch (Exception e) {
            throw new HttpProtocolException(e.getMessage(), e);
        }
    }

    private String buildRequestUrl(String url, Map param) {
        if(!CollectionUtils.isEmpty(param)) {
            int indexOf = url.indexOf('?');
            StringBuilder sb = new StringBuilder(url);
            if(indexOf == -1) {
                sb.append('?');
                param.forEach((key, val) -> {
                    sb.append(key).append("=").append(val).append("&");
                });
                return sb.substring(0, sb.length() - 1);
            } else {
                param.forEach((key, val) -> {
                    sb.append("&").append(key).append("=").append(val);
                });
                return sb.toString();
            }
        }

        return url;
    }

    @Override
    public HttpResponseMessage post(HttpRequestMessage requestMessage) {
        long timeout = requestMessage.getTimeout();

        String url = requestMessage.getUrl();
        if(!StringUtils.hasText(url)) {
            throw new HttpProtocolException("请求url必填");
        }

        Response response = null;
        try {
            OkHttpClient okHttpClient = client;

            if(timeout != HttpConst.DefaultTimeout) {
                okHttpClient = client.newBuilder().readTimeout(timeout, TimeUnit.SECONDS).build();
            }

            // 构建请求body
            RequestBody requestBody = buildRequestBody(requestMessage.getParam());

            Request.Builder builder = new Request.Builder().post(requestBody).url(url);
            handleRequestHeader(requestMessage, builder);

            response = okHttpClient.newCall(builder.build()).execute();

            ResponseBody responseBody = response.body();

            return new HttpResponseMessage(response.code(), responseBody.bytes(), responseBody.contentType().type());
        } catch (IOException e) {
            throw new HttpProtocolException(e.getMessage(), e);
        } finally {
            if(response != null) {
                response.body().close();
            }
        }
    }

    private RequestBody buildRequestBody(Map param) {
        FormBody.Builder builder = new FormBody.Builder();
        if(!CollectionUtils.isEmpty(param)) {
            param.forEach((key, val) -> {
                builder.add(key, (String) val);
            });
        }

        return builder.build();
    }

    @Override
    public void post(HttpRequestMessage requestMessage, ClientHttpProtocol.HttpProtocolCall handle) {
        long timeout = requestMessage.getTimeout();

        String url = requestMessage.getUrl();
        if(!StringUtils.hasText(url)) {
            throw new HttpProtocolException("请求url必填");
        }

        if(null == handle) {
            throw new HttpProtocolException("未指定异步协议处理器: [ProtocolHandle]");
        }

        try {
            OkHttpClient okHttpClient = client;

            if(timeout != HttpConst.DefaultTimeout) {
                okHttpClient = client.newBuilder().readTimeout(timeout, TimeUnit.SECONDS).build();
            }

            // 构建请求body
            RequestBody requestBody = buildRequestBody(requestMessage.getParam());
            Request.Builder builder = new Request.Builder().post(requestBody).url(url);

            // 处理请求头
            handleRequestHeader(requestMessage, builder);

            // http异步回调执行
            httpAsyncCallback(handle, okHttpClient, builder);

        } catch (Exception e) {
            throw new HttpProtocolException(e.getMessage(), e);
        }
    }

    protected void httpAsyncCallback(ClientHttpProtocol.HttpProtocolCall handle, OkHttpClient okHttpClient, Request.Builder builder) {
        okHttpClient.newCall(builder.build()).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                handle.call(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ResponseBody responseBody = response.body();
                handle.responseResolver(new HttpResponseMessage(response.code(), responseBody.bytes(), responseBody.contentType().type()));
            }
        });
    }

    @Override
    public void afterPropertiesSet() throws Exception {

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy