OKHttp3 快速开始
发布日期:2021-06-29 22:24:18 浏览次数:2 分类:技术文章

本文共 5868 字,大约阅读时间需要 19 分钟。

文章目录

一、什么是OKHttp3

官网地址:https://square.github.io/okhttp/

github地址:https://github.com/square/okhttp

OKHttp是一个当前主流的网络请求的开源框架

Square公司开发,用于替代HttpUrlConnection和Apache HttpClient
Android4.4开始,google已经开始将源码中的HttpURLConnection替换为OkHttp
Android6.0里已移除HttpClient

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.

相对于其他网络框架,有如下优点:

支持 Spdy、 Http1.X、 Http2、 Quic以及 WebSocket连接池复用底层 TCP(Socket),减少请求延时无缝的支持 GZIP减少数据流量缓存响应数据减少重复的网络请求请求失败自动重试主机的其他 ip,自动重定向

总结: OkHttp现在应该算是最火的Http第三方库。

二、基于springboot的RestTemplate、okhttp和HttpClient对比

参考URL: https://www.cnblogs.com/wzk-0000/p/10955406.html

  1. HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。

  2. RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

  3. okhttp:OkHttp是一个高效的HTTP客户端,允许所有同一个主机地址的请求共享同一个socket连接;连接池减少请求延时;透明的GZIP压缩减少响应数据的大小;缓存响应内容,避免一些完全重复的请求。

当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。

三、Okhttp的基本使用

基本使用——OkHttp3详细使用教程

参考URL: https://www.cnblogs.com/it-tsz/p/11748674.html

OkHttp的使用是非常简单的. 它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。

1. maven引入

maven仓库查找并引入

com.squareup.okhttp3
okhttp
3.14.9

2. 创建OkHttpClient实例

通过OkHttpClient可以发送一个Http请求,并读取该Http请求的响应,它是一个生产Call的工厂。

此外,受益于一个共享的响应缓存/线程池/复用的连接等因素,绝大多数应用使用一个OkHttpClient实例,便可以满足整个应用的Http请求。

三种创建实例的方法:

  • 创建一个默认配置OkHttpClient,可以使用默认的构造函数。
  • 通过new OkHttpClient.Builder()方法来一步一步配置一个OkHttpClient实例。
  • 如果要求使用现有的实例,可以通过newBuilder()方法来进行构造。
OkHttpClient client = new OkHttpClient();OkHttpClient clientWith30sTimeout = client.Builder()    .readTimeout(30, TimeUnit.SECONDS)    .build();OkHttpClient client  = client.newBuilder().build();
  1. GET请求
    demo:
OkHttpClient client = new OkHttpClient();String run(String url) throws IOException {
Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string();}

Request

简单看一下Request类,可以发现它代表一个Http请求,需要注意的是Request一旦build()之后,便不可修改。

主要通过new Request.Builder()来一步一步构造的。

默认是Get方法,
Response
Response代表一个Http的响应,这个类的实例不可修改。

2) POST请求

public static final MediaType JSON    = MediaType.parse("application/json; charset=utf-8");OkHttpClient client = new OkHttpClient();String post(String url, String json) throws IOException {  RequestBody body = RequestBody.create(JSON, json);  Request request = new Request.Builder()      .url(url)      .post(body)      .build();  Response response = client.newCall(request).execute();  return response.body().string();}

MediaType用于描述Http请求和响应体的内容类型,也就是Content-Type。

例如,MediaType.parse(“application/json; charset=utf-8”);这个就带表请求体的类型为JSON格式的。

定义好数据类型,还要将其变为请求体,最后通过post()方法,随请求一并发出。

2.1 HTTP头部的设置和读取

HTTP响应头和请求头信息对照表

http://tools.jb51.net/table/http_header

HTTP 头的数据结构是 Map<String, List>类型。也就是说,对于每个 HTTP 头,可能有多个值。但是大部分 HTTP 头都只有一个值,只有少部分 HTTP 头允许多个值。

OkHttp的处理方式是:

  • 使用header(name,value)来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。
  • 使用addHeader(name,value)来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。
  • 使用header(name)读取唯一值或多个值的最后一个值
  • 使用headers(name)获取所有值
OkHttpClient client = new OkHttpClient();Request request = new Request.Builder()        .url("https://github.com")        .header("User-Agent", "My super agent")        .addHeader("Accept", "text/html")        .build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);}System.out.println(response.header("Server"));System.out.println(response.headers("Set-Cookie"));

2.2 设置请求超时时间

OkHttp3超时设置和超时异常捕获

参考URL: https://blog.csdn.net/do168/article/details/51848895/

设置超时移到了OkHttpClient.Builder中,所以最新的设置超时的代码如下

OkHttpClient client = new OkHttpClient.Builder()                .connectTimeout(10, TimeUnit.SECONDS)                .readTimeout(20, TimeUnit.SECONDS)                .build();

3. RestTemplate + okhttp 实现远程调用

RestTemplate + okhttp 实现远程调用

参考URL: https://zhuanlan.zhihu.com/p/108765123

  1. 引入maven
com.squareup.okhttp3
okhttp
3.14.9

2)声明 RestTemplate

@Componentpublic class OkHttpConfig {
/** * 基于OkHttp3配置RestTemplate * @return */ @Bean public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory()); }}

3)测试验证

@RestControllerpublic class TestController {
@Autowired RestTemplate restTemplate; @Test public void testRestTemplate(){
ResponseEntity forEntity = restTemplate.getForEntity("请求的url",Map.class); Map body = forEntity.getBody(); System.out.println(body ); }}

四、使用过程常见问题总结

1. 在项目中引入okhttp的4.4.0版后发现idea点run和debug没响应,重启也没反应

解决idea导入kotlin项目时,项目无法编译运行的问题

参考URL: https://blog.csdn.net/wangyuanjiet/article/details/81220987
OkHttp 4 正式版发布,从 Java 切换到 Kotlin
参考URL: https://www.oschina.net/news/107848/okhttp-4-0-0-released
idea2017等低版本引入okhttp4无法编译运行
参考URL: https://blog.csdn.net/aoeace/article/details/103157193

现象:

在项目中引入okhttp的4.4.0版后发现idea点run和debug没响应,重启也没反应,换成3.14.2就好了。

原因分析:

pom引入okhttp4.x以前的版本idea可以正常编译运行,升级到okhttp4.x后,无法编译运行

因为OkHttp 4.x将我们的实现语言从Java升级到Kotlin,并使其他所有内容保持不变。我们选择Kotlin是因为它在与Java紧密集成的同时为我们提供了强大的新功能。

解决方式:

方案一:
1、选中菜单的file,选择setting,kotlin update
2、选中菜单的file,选择project structure=>Modules=>选中项目=>点击加号,加上Kotlin

方案二:使用低版本,如 3.x版本的okhttp。 (本人暂时采用该方案)

com.squareup.okhttp3
okhttp
3.14.9

五、其他参考

你必须学会的OkHttp,带你快速上车

参考URL: https://blog.51cto.com/14541311/2438941
easy-okhttp是对OkHttp网络框架封装,提供文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。
参考URL: https://gitee.com/yuanzizhenxin/easy-okhttp

转载地址:https://docker.blog.csdn.net/article/details/105813157 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:openresty (nginx)负载均衡+高可用配置
下一篇:jackson 快速开始

发表评论

最新留言

很好
[***.229.124.182]2024年04月12日 18时55分24秒