在SpringBoot应用中,发送Http通常我们使用RestTemplate,但有部分组件底层是使用OkHttp进行Http的操作,而且OKHttp也是一个很优秀的HTTP组件。

RestTempate的springboot封装参考:https://www.cnblogs.com/yangzhilong/p/6640207.html

application.yml

okhttp:
connect-timeout-ms:
keep-alive-duration-sec:
max-idle:
read-timeout-ms:
write-timeout-ms:

Configuration:

import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated; import com.longge.gateway.util.OkHttpUtils; import lombok.Getter;
import lombok.Setter;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient; /**
* @author roger yang
* @date 9/16/2019
*/
public class OkHttpConfiguration {
@Resource
private OkHttpConfig okHttpConfig; @Bean
public OkHttpClient okHttpClient() {
OkHttpClient client = new OkHttpClient.Builder()
.retryOnConnectionFailure(false)
.connectionPool(pool())
.connectTimeout(okHttpConfig.getConnectTimeoutMs(), TimeUnit.MILLISECONDS)
.readTimeout(okHttpConfig.getReadTimeoutMs(), TimeUnit.MILLISECONDS)
.writeTimeout(okHttpConfig.getWriteTimeoutMs(),TimeUnit.MILLISECONDS)
.build(); OkHttpUtils.setOkHttpClient(client);
return client;
} @Bean
public ConnectionPool pool() {
return new ConnectionPool(okHttpConfig.getMaxIdle(), okHttpConfig.getKeepAliveDurationSec(), TimeUnit.SECONDS);
} @Component
@ConfigurationProperties(prefix = "okhttp")
@Getter
@Setter
@Validated
static class OkHttpConfig {
@NotNull
private Long connectTimeoutMs;
@NotNull
private Long readTimeoutMs;
@NotNull
private Long writeTimeoutMs;
@NotNull
private Integer maxIdle;
@NotNull
private Long keepAliveDurationSec;
}
}

Util帮助类:

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.Objects; import com.alibaba.fastjson.JSONObject; import lombok.NonNull;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response; /**
* 参数中Callback表示发送异步请求
* @author roger yang
* @date 9/16/2019
*/
public class OkHttpUtils {
private static OkHttpClient okHttpClient; public static void setOkHttpClient(OkHttpClient client) {
okHttpClient = client;
} /**
* GET Method begin---------------------------------
*/ public static <T> T get(@NonNull String url, Class<T> clasz) {
return get(url, null, null, clasz);
} public static void get(@NonNull String url, Callback callback) {
get(url, null, null, callback);
} public static <T> T get(@NonNull String url, Map<String, String> queryParameter, Class<T> clasz) {
return get(url, null, queryParameter, clasz);
} public static void get(@NonNull String url, Map<String, String> queryParameter, Callback callback) {
get(url, null, queryParameter, callback);
} public static <T> T get(@NonNull String url, Map<String, String> headerParameter, Map<String, String> queryParameter, Class<T> clasz) {
Request request = processGetParameter(url, headerParameter, queryParameter); try (Response resp = okHttpClient.newCall(request).execute();) {
return processResponse(resp, clasz);
} catch (Exception e) {
throw new RuntimeException(e);
}
} public static void get(@NonNull String url, Map<String, String> headerParameter, Map<String, String> queryParameter, Callback callback) {
Request request = processGetParameter(url, headerParameter, queryParameter);
okHttpClient.newCall(request).enqueue(callback);
} private static Request processGetParameter(String url, Map<String, String> headerParameter, Map<String, String> queryParameter) {
Request.Builder builder = new Request.Builder();
if (!isEmptyMap(headerParameter)) {
builder.headers(Headers.of(headerParameter));
}
if (isEmptyMap(queryParameter)) {
builder.url(url);
} else {
boolean hasQuery = false;
try {
hasQuery = new URL(url).getQuery().isEmpty();
} catch (MalformedURLException e) {
throw new RuntimeException("url is illegal");
}
StringBuilder sb = new StringBuilder(url);
if (!hasQuery) {
sb.append("?1=1");
}
queryParameter.forEach((k, v) -> {
sb.append("&").append(k).append("=").append(v);
});
builder.url(sb.toString());
}
return builder.build();
} /**
* POST Method With JSON begin---------------------------------
*/ public static <T> T postJson(@NonNull String url, Class<T> clasz) {
return postJson(url, null, null, clasz);
} public static void postJson(@NonNull String url, Callback callback) {
postJson(url, null, null, callback);
} public static <T> T postJson(@NonNull String url, Map<String, String> headerParameter, Class<T> clasz) {
return postJson(url, headerParameter, null, clasz);
} public static void postJson(@NonNull String url, Map<String, String> headerParameter, Callback callback) {
postJson(url, headerParameter, null, callback);
} public static <T> T postJson(@NonNull String url, Map<String, String> headerParameter, Object bodyObj, Class<T> clasz) {
Request request = processPostJsonParameter(url, headerParameter, bodyObj);
try (Response resp = okHttpClient.newCall(request).execute();) {
return processResponse(resp, clasz);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void postJson(@NonNull String url, Map<String, String> headerParameter, Object bodyObj, Callback callback) {
Request request = processPostJsonParameter(url, headerParameter, bodyObj);
okHttpClient.newCall(request).enqueue(callback);
} private static Request processPostJsonParameter(String url, Map<String, String> headerParameter, Object bodyObj) {
Request.Builder builder = new Request.Builder().url(url);
if(!Objects.isNull(bodyObj)) {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), JSONObject.toJSONString(bodyObj));
builder.post(body);
} else {
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), "{}");
builder.post(body);
}
if (!isEmptyMap(headerParameter)) {
builder.headers(Headers.of(headerParameter));
}
return builder.build();
} /**
* POST Method With Form begin---------------------------------
*/ public static <T> T postForm(@NonNull String url, Class<T> clasz) {
return postForm(url, null, null, clasz);
} public static void postForm(@NonNull String url, Callback callback) {
postForm(url, null, null, callback);
} public static <T> T postForm(@NonNull String url, Map<String, String> headerParameter, Class<T> clasz) {
return postForm(url, headerParameter, null, clasz);
} public static void postForm(@NonNull String url, Map<String, String> headerParameter, Callback callback) {
postForm(url, headerParameter, null, callback);
} public static <T> T postForm(@NonNull String url, Map<String, String> headerParameter, Map<String, String> parameters, Class<T> clasz) {
Request request = processPostFormParameter(url, headerParameter, parameters);
try (Response resp = okHttpClient.newCall(request).execute();) {
return processResponse(resp, clasz);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void postForm(@NonNull String url, Map<String, String> headerParameter, Map<String, String> parameters, Callback callback) {
Request request = processPostFormParameter(url, headerParameter, parameters);
okHttpClient.newCall(request).enqueue(callback);
} private static Request processPostFormParameter(String url, Map<String, String> headerParameter, Map<String, String> parameters) {
Request.Builder builder = new Request.Builder().url(url);
if(!Objects.isNull(parameters)) {
FormBody.Builder formBuilder = new FormBody.Builder();
parameters.forEach((k, v) -> {
formBuilder.add(k, v);
});
builder.post(formBuilder.build());
}
if (!isEmptyMap(headerParameter)) {
builder.headers(Headers.of(headerParameter));
}
return builder.build();
} @SuppressWarnings("unchecked")
private static <T> T processResponse(Response resp, Class<T> clasz) throws IOException {
if (resp.isSuccessful()) {
if (Objects.equals(Void.class, clasz)) {
return null;
}
String respStr = resp.body().string();
if(Objects.equals(String.class, clasz)) {
return (T)respStr;
}
return JSONObject.parseObject(respStr, clasz);
}
return null;
} private static boolean isEmptyMap(Map<? extends Object, ? extends Object> map) {
return Objects.isNull(map) || map.isEmpty();
}
}

GitHub地址:https://github.com/yangzhilong/new-gateway-test.git

如果想要OkHttp的装配是非自动的,可以采用自定义@EnableXX注解来实现。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import org.springframework.context.annotation.Import; import com.longge.gateway.configuration.OkHttpConfiguration; /**
* @author roger yang
* @date 9/16/2019
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(OkHttpConfiguration.class)
public @interface EnableOkHttp { }

然后把OkHttpConfiguration类的@Configuration注解去掉,当你要用时在启动类加上@EnableOkHttp即可。

springboot装配OkHttp组件的更多相关文章

  1. springboot自动装配(1)---@SpringBootApplication注解怎么自动装配各种组件

    1.对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter) 2.@SpringBootApplication注解其实就是组合注解,通过它找到自动装配的注 ...

  2. Spring装配bean--01组件扫描和自动装配

    Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系 Spring提供了三种主要的装配机制: 在XML中进行显式配置 在Java中进行显式配置 隐式的bean发现机制和自动装 ...

  3. 装配SpringBean(四)--注解装配之组件扫描

    前两篇文章我总结了通过XML方式装配bean的实现方式,虽然比较简单,但是需要配置很多,很多时候我们都会使用注解进行装配.使用注解的方式可以减少XML的配置,既能实现XML的功能,还提供了自动装配功能 ...

  4. 【Spring】装配Bean 组件扫描

    实现自动装配需要用注解:注解分为 spring规范和java规范 ,java规范需要引入javax.inject 包 ,使用maven,直接引入. 从中可以看到 @Named @Inject属于jav ...

  5. springboot添加swagger2组件

    swagger2是一个可以构建和调试RESTful API文档的组件,利用swagger2的注解可以快速的在项目中构建Api文档,并且提供了测试API的功能 1,引入依赖 <dependency ...

  6. 一步步从Spring Framework装配掌握SpringBoot自动装配

    目录 Spring Framework模式注解 Spring Framework@Enable模块装配 Spring Framework条件装配 SpringBoot 自动装配 本章总结 Spring ...

  7. Spring Boot之从Spring Framework装配掌握SpringBoot自动装配

    Spring Framework模式注解 模式注解是一种用于声明在应用中扮演“组件”角色的注解.如 Spring Framework 中的 @Repository 标注在任何类上 ,用于扮演仓储角色的 ...

  8. SpringBoot | 2.1 SpringBoot自动装配原理

    @ 目录 前言 1. 引入配置文件与配置绑定 @ImportResource @ConfigurationProperties 1.1 @ConfigurationProperties + @Enab ...

  9. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

随机推荐

  1. APP安全测试

    app 常见风险 一. clinet端 1.反编译 2.签名破解 3.调试 4.导出组件 5.拒绝服务 6.输入记录 二.传输 1.信息泄露,未使用加密服务(ssl) 2.篡改 三.服务端 1.SQL ...

  2. C# 获取指定类型的文件

    C# 获取指定类型的文件 public static List<FileInfo> getFile(string path, string extName) { List<FileI ...

  3. FormData使用方法详解

    FormData的主要用途有两个: 1.将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率. 2.异步上传文件 一.创建formData对象 ...

  4. centos服务器上线第二个django项目方法。

    阿里云服务器开启端口8001,9001 创建一个虚拟环境 virtualenv -p python3 web2 使虚拟环境生效 source web2/bin/activate 虚拟环境中安装djan ...

  5. Mac Docker安装Redis4.0

    mkdir redis 在~目录下创建redis目录 docker run -d -p 6379:6379 -v $PWD/redis:/data -d --name redis4.0 redis:4 ...

  6. Python3如何上传自己的PyPI项目

    有过一定的 Python 经验的开发者都知道,当引入第三方包时,我们常常会使用 pip install 命令来下载并导入包. 那么,如何写一个自己的包,上传到 PyPI 呢,其他开发者也可以通过 pi ...

  7. Appium如何查看webview上元素

    现在大部分app都是混合式的native+webview,对应native上的元素通过uiautomatorviewer很容易定位到,webview上的元素就无法识别了: 那么如何定位webview上 ...

  8. 13、Python文件处理、os模块、json/pickle序列化模块

    一.字符编码 Python3中字符串默认为Unicode编码. str类型的数据可以编码成其他字符编码的格式,编码的结果为bytes类型. # coding:gbk x = '上' # 当程序执行时, ...

  9. wordpress文章显示同一分类下的上一篇下一篇

    我们在用wordpress开发网站的时候会在文章页中引入上一篇下一篇,但是发现新闻页的上下文章有可能是产品分类的post,这个就不太合理,如何显示同一分类下的上一篇下一篇文章呢?随ytkah一起来看看 ...

  10. hbase与Hive的集成

    1 HBase与Hive的对比 1.Hive (1) 数据仓库 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系,以方便使用HQL去管理查询. (2) 用于数据分析. ...