Java后端使用okhttp发送请求,调用第三方的接口

目录

创建一个OKHttp类,用于配置Okhttp

然后在当前okhttp配置类中设置好调用get请求的方法。

然后在当前okhttp配置类中设置好调用post请求的方法。

案例演示:

使用OkHttp发送get请求,我们当前调用的三方接口需要cookie,就要请求头中设置cookie。

创建一个controller,用于外部调用,用于在内部使用okHttp发送get请求。

然后创建Service,用来发送get请求


创建一个OKHttp类,用于配置Okhttp,在这里配置的只能调用以http开头的请求

配置okhttp的内容为:

@Slf4j
@Component
@Scope("prototype")
public class EasyHttpClient {

    public final OkHttpClient httpClient;

    /**
     * 连接超时时间 单位秒(默认10s)
     */
    private static final int CONNECT_TIMEOUT = 10;
    /**
     * 写超时时间 单位秒(默认 0 , 不超时)
     */
    private static final int WRITE_TIMEOUT = 0;
    /**
     * 回复超时时间 单位秒(默认30s)
     */
    private static final int READ_TIMEOUT = 120;
    /**
     * 底层HTTP库所有的并发执行的请求数量
     */
    private static final int DISPATCHER_MAX_REQUESTS = 32;
    /**
     * 底层HTTP库对每个独立的Host进行并发请求的数量
     */
    private static final int DISPATCHER_MAX_REQUESTS_PER_HOST = 8;
    /**
     * 底层HTTP库中复用连接对象的最大空闲数量
     */
    private static final int CONNECTION_POOL_MAX_IDLE_COUNT = 16;
    /**
     * 底层HTTP库中复用连接对象的回收周期(单位分钟)
     */
    private static final int CONNECTION_POOL_MAX_IDLE_MINUTES = 5;

    /**
     * 初始化默认连接池
     */
    private static final ConnectionPool DEFAULT_CONNETCTION_POOL = new ConnectionPool(CONNECTION_POOL_MAX_IDLE_COUNT, CONNECTION_POOL_MAX_IDLE_MINUTES, TimeUnit.MINUTES);


    public static final String CONTENT_TYPE_KEY = "content-type";
    public static final String CONTENT_TYPE_KEY_TMP = "Content-Type";
    public static final String CONTENT_TYPE_JSON = "application/json; charset=UTF-8";
    public static final String CONTENT_TYPE_JSON_TMP = "application/json";
    public static final String CONTENT_TYPE_W3FORM = "application/x-www-form-urlencoded";


    /**
     * 构建一个默认配置的 HTTP Client 类
     */
    public EasyHttpClient() {
        this(
                CONNECT_TIMEOUT,
                READ_TIMEOUT,
                WRITE_TIMEOUT,
                DISPATCHER_MAX_REQUESTS,
                DISPATCHER_MAX_REQUESTS_PER_HOST,
                DEFAULT_CONNETCTION_POOL
        );
    }

    /**
     * 构建一个自定义配置的 HTTP Client 类
     */
    public EasyHttpClient(int connTimeout, int readTimeout, int writeTimeout, int dispatcherMaxRequests,
                        int dispatcherMaxRequestsPerHost, ConnectionPool connectionPool) {

        Dispatcher dispatcher = new Dispatcher();
        dispatcher.setMaxRequests(dispatcherMaxRequests);
        dispatcher.setMaxRequestsPerHost(dispatcherMaxRequestsPerHost);

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.dispatcher(dispatcher);
        builder.connectionPool(connectionPool);
        builder.connectTimeout(connTimeout, TimeUnit.SECONDS);
        builder.readTimeout(readTimeout, TimeUnit.SECONDS);
        builder.writeTimeout(writeTimeout, TimeUnit.SECONDS);

        // 配置https
//        builder.sslSocketFactory(createSSLSocketFactory(), SSLSocketClient.getX509TrustManager());
//        builder.hostnameVerifier((s, sslSession) -> true);

        httpClient = builder
                .build();
    }
}

上面配置okHttpClient的时候配置了访问https,如果不访问https,就可以不用配置

然后在当前okhttp配置类中设置好调用get请求的方法。

此代码就是写在上面的EasyOKClient类中的。

   

    /**
     * get
     */
    public <T> T get(String url, Map<String, Object> queryParams, Map<String, Object> headers, Class<T> clazz) {
        log.info("EasyOKClient请求地址:{}", url);
        log.info("EasyOKClient请求参数:{}", queryParams);
        log.info("EasyOKClient请求头:{}", headers);

        HttpUrl.Builder httpBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        // 设置参数
        Optional.ofNullable(queryParams)
                .ifPresent(its -> its.forEach((key, value) -> httpBuilder.addQueryParameter(key, value.toString())));
        // 创建请求
        Request.Builder requestBuilder = new Request.Builder().get().url(httpBuilder.build());

        return JSON.parseObject(send(requestBuilder, headers), clazz);
    }

    private String send(Request.Builder requestBuilder, Map<String, Object> headers) {
        Response response;
        try {
            Optional.ofNullable(headers)
                    .ifPresent(its -> its.forEach((key, value) -> requestBuilder.header(key, value.toString())));
            response = httpClient.newCall(requestBuilder.build()).execute();
        } catch (Exception ex) {
            ex.printStackTrace();
            log.info("调用远程接口失败," + ex.getMessage());
            throw new RuntimeException("调用远程接口【" + requestBuilder.build().url().toString() + "】失败", ex);
        }
        try {
            assert response.body() != null;
            String responseStr = response.body().string();
            log.info("EasyOKClient请求返回值:{}", responseStr);
            return responseStr;
        } catch (Exception e) {
            log.info("发送请求成功,但是请求数据失败。");
            throw new RuntimeException("请求接口【" + requestBuilder.build().url() + "】失败", e);
        }
    }

return JSON.parseObject(send(requestBuilder, headers), clazz);

这一段的代码是对okhttp请求得到的json字符串进行转换为对象。clazz就代表要转换的对象

然后在当前okhttp配置类中设置好调用post请求的方法。

此代码就是写在上面的EasyOKClient类中的。    

 public <T> T post(String url, RequestBody body, Map<String, Object> headers, Class<T> clazz) {
        HttpUrl.Builder httpBuilder = Objects.requireNonNull(HttpUrl.parse(url)).newBuilder();
        Request.Builder requestBuilder = new Request.Builder().post(body).url(httpBuilder.build());
        return JSON.parseObject(send(requestBuilder, headers), clazz);
    }

    private String send(Request.Builder requestBuilder, Map<String, Object> headers) {
        Response response;
        try {
            Optional.ofNullable(headers)
                    .ifPresent(its -> its.forEach((key, value) -> requestBuilder.header(key, value.toString())));
            response = httpClient.newCall(requestBuilder.build()).execute();
        } catch (Exception ex) {
            throw new RuntimeException("调用远程接口【" + requestBuilder.build().url().toString() + "】失败", ex);
        }
        try {
            assert response.body() != null;
            String responseStr = response.body().string();
            log.info("EasyOKClient请求返回值:{}", responseStr);
            return responseStr;
        } catch (Exception e) {
            throw new RuntimeException("请求接口【" + requestBuilder.build().url() + "】失败", e);
        }
    }

案例演示:

使用OkHttp发送get请求,我们当前调用的三方接口需要cookie,就要请求头中设置cookie。

新建一个类Util,用于发送get请求。

@Slf4j
@Component
public class BdpClient {

    @Autowired
    private EasyOKClient client;



    public Optional<JoifUcApiResult> callUcGet(String ucIp,String apiUrl, Map<String, Object> params, boolean takeCookie) {
        Map<String, Object> headers = Maps.newHashMap();
        if (takeCookie) {
            headers.put("Cookie", " access_token=" + ThreadLocalToken.get() + ";my_user_id=" + ThreadLocalUserId.get());
        }

        JoifUcApiResult ucApiResult = client.get(ucIp + apiUrl, params, headers, JoifUcApiResult.class);
        //Optional.ofNullable 用于判断传入的参数是否为空
        return Optional.ofNullable(ucApiResult);
    }
}
创建一个controller,用于外部调用,用于在内部使用okHttp发送get请求。
 @PostMapping("/addJob")
    public BaseResponse addJob(@RequestBody JobDataBo job){
        jobService.addJob(job);
        return new BaseResponse();
    }
然后创建Service,用来发送get请求
  public void addJob(JobDataBo job) {
        //调用第三方接口,得到第三方的导出表名称。
        List<JobListBo> saveJobList = job.getSave_job_list();
        for (JobListBo jobListBo : saveJobList) {
            JoifUcApiResult joifUcApiResult = bdpUtil.getJobTsName(jobListBo.getTb_id(),"STANDARD"
                    ,job.getDmc_request(),job.getSys_pro_name());
            log.info("从dmc提供的第三方接口得到的数据为:" + joifUcApiResult.getResult().toString());
        }
    }

这就是使用okhttp发送请求的过程。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值