OkHttp3使用笔记

news/2024/6/27 21:28:24 标签: restful, java, 接口, rpc

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

pom文件引入依赖.

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

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

java">@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;
    }
}

业务层调用

java">    @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;
    }


http://www.niftyadmin.cn/n/1229713.html

相关文章

系统程序员成长计划-Don’t Repeat Yourself(DRY)(下)

转载时请注明出处和作者联系方式 文章出处&#xff1a;http://www.limodev.cn/blog 作者联系方式&#xff1a;李先静 <xianjimli at hotmail dot com> 实现这两个函数并不是件难事&#xff0c;但真正写好的人并不多。初学者通常的做法有两种&#xff1a; 1.各写一个独立…

Oracle最大连接数修改

问题描述 Oracle的连接数默认是150。需要根据应用的并发用户数&#xff0c;应用数量&#xff0c;动态调整。 一旦连接数超出系统允许的最大数量就会导致数据库异常无法正常使用。本文记录了最大连接数的修改步骤。 注意事项 本文介绍的连接数修改步骤&#xff0c;必须通过命…

系统程序员成长计划-你的数据放在哪里(上)

转载时请注明出处和作者联系方式 文章出处&#xff1a;http://www.limodev.cn/blog 作者联系方式&#xff1a;李先静 <xianjimli at hotmail dot com> 需求简述 这里我们请读者实现下列功能&#xff1a; 对一个存放字符串的双向链表&#xff0c;把存放在其中的字符串转…

Oracle in 不能超过1000的解决方案

使用过Oracle的可能都遇到过In不能超过1000的问题&#xff0c;SQL中超过1000会直接报错。这里分享几个方案来解决这个问题。 方法一: 在in里面使用select ‘固定值’ from dual union all 的子查询。 这种方法的优势是对原有业务逻辑改动最小。例如&#xff1a; select i.…

系统程序员成长计划-你的数据放在哪里(下)

转载时请注明出处和作者联系方式 文章出处&#xff1a;http://www.limodev.cn/blog 作者联系方式&#xff1a;李先静 <xianjimli at hotmail dot com> 对 于初学者来说这道题有点难度&#xff0c;很少有人能完全做对的。不过没关系&#xff0c;我们的目标并不是要难倒读…

Java License 实现方案

功能目标 本功能主要是为了防止软件被非正规途径获取之后&#xff0c;被肆意传播或无限制的使用。可限制用户的使用周期、使用主机数、使用用户数。 业务流程 功能设计 license功能配置 在配置文件中加入license的如下配置license.check.date&#xff0c;授权码的时间范围&…

Agile PLM文件服务器报错解决

上传附件报错&#xff1a;未上传和错误。 问题描述&#xff1a; 文件服务器控制台出现如下报错信息&#xff1a; User browser origin http://110.66.52.212:7001 is not in configured Access Control Allow Origin urls list. Please contact your Administrator 错误截图…

当DiscuzNT遇上了Loadrunner(中)

在上文中&#xff0c;介绍了如果录制脚本和设置脚本执行次数。如果经过调试脚本能够正常工作的话&#xff0c;就可以设置并发用户数并进行压力测试了。 首先我们通过脚本编辑界面上的“工具”菜单项&#xff0c;选择该菜单的第二项“Create Controller Scenario(创建控制场景)”…