spring集成okhttp3的步骤详解

 更新时间:2018年04月20日 11:52:56   作者:斜阳  
okhttp是一个封装URL,比HttpClient更友好易用的工具,下面这篇文章主要给大家介绍了关于spring集成okhttp3的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

okhttp 介绍

HTTP is the way modern applications network. It's how we exchange data & media. >Doing HTTP efficiently makes your stuff load faster and saves bandwidth.

OkHttp is an HTTP client that's efficient by default:

HTTP/2 support allows all requests to the same host to share a socket.
Connection pooling reduces request latency (if HTTP/2 isn't available).
Transparent GZIP shrinks download sizes.
Response caching avoids the network completely for repeat requests.
OkHttp perseveres when the network is troublesome: it will silently recover from > >common connection problems. If your service has multiple IP addresses OkHttp will >attempt alternate addresses if the first connect fails. This is necessary for IPv4+IPv6 >and for services hosted in redundant data centers. OkHttp initiates new connections >with modern TLS features (SNI, ALPN), and falls back to TLS 1.0 if the handshake fails.

Using OkHttp is easy. Its request/response API is designed with fluent builders and immutability. It supports both synchronous blocking calls and async calls with callbacks.

OkHttp supports Android 2.3 and above. For Java, the minimum requirement is 1.7. —摘自 https://square.github.io/okhttp/

特点

1.支持http和https协议,api相同,易用;

2.http使用线程池,https使用多路复用;

3.okhttp支持同步和异步调用;

4.支持普通form和文件上传form;

5.提供了拦截器,操作请求和响应(日志,请求头,body等);

6.okhttp可以设置缓存;

准备工作

在pom.xml文件中增加以下依赖

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

书写配置类

用@Configuration注解该类,等价与XML中配置beans;用@Bean标注方法等价于XML中配置bean。

@Configuration
public class OkHttpConfiguration {
 @Bean
 public X509TrustManager x509TrustManager() {
 return new X509TrustManager() {
  @Override
  public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  }
  @Override
  public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  }
  @Override
  public X509Certificate[] getAcceptedIssuers() {
  return new X509Certificate[0];
  }
 };
 }
 @Bean
 public SSLSocketFactory sslSocketFactory() {
 try {
  //信任任何链接
  SSLContext sslContext = SSLContext.getInstance("TLS");
  sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());
  return sslContext.getSocketFactory();
 } catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
 } catch (KeyManagementException e) {
  e.printStackTrace();
 }
 return null;
 }
 /**
 * Create a new connection pool with tuning parameters appropriate for a single-user application.
 * The tuning parameters in this pool are subject to change in future OkHttp releases. Currently
 */
 @Bean
 public ConnectionPool pool() {
 return new ConnectionPool(200, 5, TimeUnit.MINUTES);
 }
 @Bean
 public OkHttpClient okHttpClient() {
 return new OkHttpClient.Builder()
  .sslSocketFactory(sslSocketFactory(), x509TrustManager())
  .retryOnConnectionFailure(false)//是否开启缓存
  .connectionPool(pool())//连接池
  .connectTimeout(10L, TimeUnit.SECONDS)
  .readTimeout(10L, TimeUnit.SECONDS)
  .build();
 }
}

工具类

自己写的工具类,比较简单,不是REST风格

@Component
public class OkHttpUtil {
 private static final Logger logger = LoggerFactory.getLogger(OkHttpUtil.class);
 @Resource
 private OkHttpClient okHttpClient;
 /**
 * get
 *
 * @param url 请求的url
 * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
 * @return
 */
 public String get(String url, Map<String, String> queries) {
 String responseBody = "";
 StringBuffer sb = new StringBuffer(url);
 if (queries != null && queries.keySet().size() > 0) {
  boolean firstFlag = true;
  Iterator iterator = queries.entrySet().iterator();
  while (iterator.hasNext()) {
  Map.Entry entry = (Map.Entry<String, String>) iterator.next();
  if (firstFlag) {
   sb.append("?" + entry.getKey() + "=" + entry.getValue());
   firstFlag = false;
  } else {
   sb.append("&" + entry.getKey() + "=" + entry.getValue());
  }
  }
 }
 Request request = new Request
  .Builder()
  .url(sb.toString())
  .build();
 Response response = null;
 try {
  response = okHttpClient.newCall(request).execute();
  int status = response.code();
  if (status == 200) {
  return response.body().string();
  }
 } catch (Exception e) {
  logger.error("okhttp put error >> ex = {}", ExceptionUtils.getStackTrace(e));
 } finally {
  if (response != null) {
  response.close();
  }
 }
 return responseBody;
 }
 /**
 * post
 *
 * @param url 请求的url
 * @param params post form 提交的参数
 * @return
 */
 public String post(String url, Map<String, String> params) {
 String responseBody = "";
 FormBody.Builder builder = new FormBody.Builder();
 //添加参数
 if (params != null && params.keySet().size() > 0) {
  for (String key : params.keySet()) {
  builder.add(key, params.get(key));
  }
 }
 Request request = new Request
  .Builder()
  .url(url)
  .post(builder.build())
  .build();
 Response response = null;
 try {
  response = okHttpClient.newCall(request).execute();
  int status = response.code();
  if (status == 200) {
  return response.body().string();
  }
 } catch (Exception e) {
  logger.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
 } finally {
  if (response != null) {
  response.close();
  }
 }
 return responseBody;
 }
 /**
 * post 上传文件
 *
 * @param url
 * @param params
 * @param fileType
 * @return
 */
 public String postFile(String url, Map<String, Object> params, String fileType) {
 String responseBody = "";
 MultipartBody.Builder builder = new MultipartBody.Builder();
 //添加参数
 if (params != null && params.keySet().size() > 0) {
  for (String key : params.keySet()) {
  if (params.get(key) instanceof File) {
   File file = (File) params.get(key);
   builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse(fileType), file));
   continue;
  }
  builder.addFormDataPart(key, params.get(key).toString());
  }
 }
 Request request = new Request
  .Builder()
  .url(url)
  .post(builder.build())
  .build();
 Response response = null;
 try {
  response = okHttpClient.newCall(request).execute();
  int status = response.code();
  if (status == 200) {
  return response.body().string();
  }
 } catch (Exception e) {
  logger.error("okhttp postFile error >> ex = {}", ExceptionUtils.getStackTrace(e));
 } finally {
  if (response != null) {
  response.close();
  }
 }
 return responseBody;
 }
}

使用方法

@Resource
private OkHttpUtil okHttpUtil;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • java 实现最小二叉树堆排序的实例

    java 实现最小二叉树堆排序的实例

    这篇文章主要介绍了java 实现最小二叉树堆排序的实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • Java中volatile关键字的线程的可见性、有序性详解

    Java中volatile关键字的线程的可见性、有序性详解

    这篇文章主要介绍了Java中volatile关键字的线程的可见性、有序性详解,在juc多线程并发编程中,常常需要关注线程的"可见性"与"有序性",本文将详细介绍这两部分内容,以及volatile关键字的使用,需要的朋友可以参考下
    2024-01-01
  • Java实现聊天机器人完善版

    Java实现聊天机器人完善版

    这篇文章主要为大家详细介绍了Java实现聊天机器人完善版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 重写hashCode()和equals()方法详细介绍

    重写hashCode()和equals()方法详细介绍

    这篇文章主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java获取版本号及字节码编译版本方法示例

    java获取版本号及字节码编译版本方法示例

    这篇文章主要给大家介绍了关于java获得版本号及字节码编译版本的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • idea中安装VisualVM监控jvm的图文教程

    idea中安装VisualVM监控jvm的图文教程

    这篇文章主要介绍了idea中安装VisualVM监控jvm的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • mybatis教程之resultmap_动力节点Java学院整理

    mybatis教程之resultmap_动力节点Java学院整理

    这篇文章主要介绍了mybatis教程之resultmap,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • String.intern()作用与常量池关系示例解析

    String.intern()作用与常量池关系示例解析

    这篇文章主要为大家介绍了String.intern()作用与常量池关系示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringBoot获取不到用户真实IP的解决方法

    SpringBoot获取不到用户真实IP的解决方法

    最近遇到个问题,项目部署后发现服务端无法获取到客户端真实的IP地址,本文就来介绍一下这个问题的解决方法,感兴趣的可以了解一下
    2023-08-08
  • Spring Security架构以及源码详析

    Spring Security架构以及源码详析

    这篇文章主要给大家介绍了关于Spring Security架构以及源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06

最新评论