当前位置:网站首页 > 技术博客 > 正文

okhttp+



OKHttp是一个当前主流的网络请求的开源框架
Square公司(该公司还贡献了Picasso)开发,用于替代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.

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

 

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

参考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的使用是非常简单的. 它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。

1. maven引入

maven仓库查找并引入

 

2. 创建OkHttpClient实例

三种创建实例的方法:

  • 创建一个默认配置OkHttpClient,可以使用默认的构造函数。
  • 通过new OkHttpClient.Builder()方法来一步一步配置一个OkHttpClient实例。
  • 如果要求使用现有的实例,可以通过newBuilder()方法来进行构造。
 
  1. GET请求
    demo:
 

主要通过new Request.Builder()来一步一步构造的。
默认是Get方法,
Response
Response代表一个Http的响应,这个类的实例不可修改。

2) POST请求

 

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

2.1 HTTP头部的设置和读取

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

OkHttp的处理方式是:

  • 使用header(name,value)来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。
  • 使用addHeader(name,value)来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。
  • 使用header(name)读取唯一值或多个值的最后一个值
  • 使用headers(name)获取所有值
 
2.2 设置请求超时时间

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

 

3. RestTemplate + okhttp 实现远程调用

  1. 引入maven
 

2)声明 RestTemplate

 

3)测试验证

 

4. Connection作为请求头: OkHttpClient单例和长连接Connection Keep-Alive

HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时间,在该时间内的第二次就不需要再重新建立连接,就可以直接使用这次的连接来发送请求了,极大的提高了速度。

KeepAlive在增加访问效率的同时,也会增加服务器的压力。

  • http1.0中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用Keep-Alive;
  • http 1.1中默认启用Keep-Alive,如果加入”Connection: close “才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

OkHttp支持HTTP/1.1和HTTP/2协议。HTTP/1.1和HTTP/2的http请求都是建立在TCP连接基础之上的,所以他们的性能极大的依赖于TCP连接的配置。每个TCP连接都会进行三次握手,并且因为TCP的拥塞控制使用的滑动窗口和慢开始算法导致网络带宽利用率不高。所以,在HTTP/2不可用时,OkHttp使用了连接池,避免为每个请求都创建连接。

复用长连接,避免了创建TCP连接的三次握手,我们简单了解下HTTP请求头中Connection和Keep-Alive。

Connection作为请求头的通用参数,其控制了请求连接在当前事务完成后是否继续保持。如果其值被设置为keep-alive, 则表示该连接是长连接,允许之后的相同地址的请求复用。还可以设置为close,每次请求结束后关闭连接。但是该参数在HTTP/2中不再使用。

okhttp都是长连接是因为okhttp最低只支持到http /1.1版本,当http/2不可用时,会使用连接池来复用长连接。 请求时希望不使用长连接,可显式设置okhttp的请求头 Connection为close

浏览器默认使用http1.1,而http1.1默认是connection:keepalive

 

该参数,亲测可用!

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

解决idea导入kotlin项目时,项目无法编译运行的问题
参考URL: https://blog.csdn.net/wangyuanjiet/article/details/
OkHttp 4 正式版发布,从 Java 切换到 Kotlin
参考URL: https://www.oschina.net/news//okhttp-4-0-0-released
idea2017等低版本引入okhttp4无法编译运行
参考URL: https://blog.csdn.net/aoeace/article/details/

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

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

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

 

2. OkHttp打印响应的body中json字符串

问题解决:

换成String json = response.body().string();就可以了

总结:OkHttp要的http响应的body体内容,是使用response.body().string();

3. OkHttp忽略证书

 
 

亲测可用!

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

版权声明


相关文章:

  • densenet和resnet的区别2025-03-09 12:01:00
  • jstl包含用于编写和开发jsp2025-03-09 12:01:00
  • 音频降噪工具2025-03-09 12:01:00
  • web components监控2025-03-09 12:01:00
  • 服务器监控可视化工具2025-03-09 12:01:00
  • malloc分配内存在操作系统中的过程2025-03-09 12:01:00
  • java中匿名内部类怎么用2025-03-09 12:01:00
  • 霍夫曼树权值2025-03-09 12:01:00
  • kdump启动失败2025-03-09 12:01:00
  • c语言6种数据类型2025-03-09 12:01:00