OkHttp3使用笔记

项目中会使用OkHttp3来调用restful接口.步骤如下.

pom文件引入依赖.

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.14.2</version>
        </dependency>

底层utils(调用接口的参数需要用token,这个每个项目可能不一样)

@Slf4j
@Component
public class RestfulUtils {

    /**
     * 使用get方式发起Http同步请求, 返回值为String
     *
     * @param url    url,也可以直接在URL中放入请求参数,但请注意转义问题.例如:值里面包含=
     * @param params 请求参数,推荐将请求参数放入这里,本方法会自动转移特殊字符.
     * @return String
     * @author namelessmyth
     */
    public String getString(String url, Map<String, String> params) throws Exception {
        String result = null;
        try {
            Request.Builder requestBuilder = new Request.Builder();
            if (!url.contains("?")) {
                String urlParams = HttpUtil.toParams(params);
                url = url + "?" + urlParams;
            }
            requestBuilder.url(url);
            requestBuilder.addHeader("Authorization", "Bearer " + TokenUtils.getToken());
            requestBuilder.get();
            OkHttpClient client = getOkHttpClient();
            Response response = client.newCall(requestBuilder.build()).execute();
            result = response.body().string();
            //log.info(String.format("(%s)url.getString,result:%s", url, params, result));
        } catch (Exception e) {
            log.error(String.format("(%s)url.getString,exception!", url, params), e);
            throw e;
        }
        return result;
    }

    /**
     * 使用post方式发起Http同步请求,返回值为String
     *
     * @param url    url
     * @param params 请求参数,也可以直接放在URL中
     * @return String
     * @author namelessmyth
     */
    public String postString(String url, Map<String, String> params) throws Exception {
        String result = null;
        RequestBody requestBody = getRequestBody(url, params);
        try {
            Request.Builder requestBuilder = new Request.Builder().url(url);
            requestBuilder.addHeader("Authorization", "Bearer " + TokenUtils.getToken());
            requestBuilder.post(requestBody);
            OkHttpClient client = getOkHttpClient();
            Response response = client.newCall(requestBuilder.build()).execute();
            result = response.body().string();
            log.info(String.format("(%s)url.postString.param(%s),result:%s", url, params, result));
        } catch (Exception e) {
            log.error(String.format("(%s)url.postString.param(%s),exception!", url, params), e);
            throw e;
        }
        return result;
    }

    public RequestBody getRequestBody(String url, Map<String, String> params) {
        RequestBody requestBody = null;
        try {
            FormBody.Builder builder = new FormBody.Builder();
            if (MapUtil.isNotEmpty(params)) {
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    builder.add(entry.getKey(), entry.getValue());
                }
            }
            requestBody = builder.build();
        } catch (Exception e) {
            log.error(url + "getRequestBody exception" + params, e);
            throw new BusinessException(e);
        }
        return requestBody;
    }

    public OkHttpClient getOkHttpClient() {
    //参数可以考虑做成配置项
        ConnectionPool pool = new ConnectionPool(5, 1, TimeUnit.SECONDS);//最大空闲数5个,每个连接最大空闲时间1S
        OkHttpClient client = new OkHttpClient.Builder() //
                .connectTimeout(60, TimeUnit.SECONDS) 连接超时
                .followRedirects(true) //
                .readTimeout(60, TimeUnit.SECONDS) // //读取超时
                .retryOnConnectionFailure(false) //
                .writeTimeout(3, TimeUnit.SECONDS). 写超时
                connectionPool(pool) //
                .build();
        return client;
    }
}

业务层调用

    @DS("middel")
    public String queryOnlineWorkstage(String itemNumber, String factory) throws Exception {
        String result = null;
        if (StringUtils.isBlank(itemNumber) || StringUtils.isBlank(factory)) {
            throw new BusinessException("物资编码或厂别不能为空!");
        }
        boolean flag = false;
        InfoCode infoCode = iInfoCodeService.getInfoCode(factory, "在线工序");

        String organizationId = infoCode.getCode();
        String url = infoCode.getUrl();
        HashMap<String, String> get_data = new HashMap<>();
        get_data.put("organizationId", organizationId); 
        get_data.put("itemNum", itemNumber); 
        //调用restful接口查询
        result = sccHttpUtils.getString(url, get_data);
        return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值