OKHttp使用详解

2023-05-16

1、简介

OkHttp 是一个默认高效的 HTTP 客户端:

  • HTTP/2 支持允许对同一主机的所有请求共享一个套接字。
  • 连接池减少了请求延迟(如果 HTTP/2 不可用)。
  • 透明 GZIP 缩小了下载大小。
  • 响应缓存完全避免了网络重复请求。

2、引入依赖

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

3、获取 OkHttpClient 对象

在使用 OkHttp 发送 HTTP 请求时,首先需要获取一个 OkHttpClient 对象,获取 OkHttpClient 对象的方式很简单,在 OkHttp 中大量使用了 Builder 模式。获取 OkHttpClient 对象的方法如下所示:

  1. 获取默认配置对象

    // 获取默认配置 的OkHttpClient 对象
    OkHttpClient httpClient = new OkHttpClient.Builder().build();
    
  2. 获取自定配置对象

    在获取对象时可以指定,连接超时、读写超时、拦截器等配置,如下所示:

    OkHttpClient httpClient = new OkHttpClient.Builder()
        // 设置连接超时时间
        .connectTimeout(Duration.ofSeconds(30))
        // 设置读超时时间
        .readTimeout(Duration.ofSeconds(60))
        // 设置写超时时间
        .writeTimeout(Duration.ofSeconds(60))
        // 设置完整请求超时时间
        .callTimeout(Duration.ofSeconds(120))
        // 添加一个拦截器
        .addInterceptor(chain -> {
            Request request = chain.request();
            return chain.proceed(request);
        })
        // 注册事件监听器
        .eventListener(new EventListener() {
            @Override
            public void callEnd(@NotNull Call call) {
                LOGGER.info("----------callEnd--------");
                super.callEnd(call);
            }
        })
        .build();
    

4、GET 请求

GET 请求的执行步骤如下:

  1. 构造 Request 对象

    // 构造一个 Request 对象
    Request request = new Request.Builder()
                    // 标识为 GET 请求
                    .get()
                    // 设置请求路径
                    .url("http://localhost:10010/user/map?name=zhangsan&a=a&age=20")
                    // 添加头信息
                    .addHeader("Content-Type", "text/plain")
                    .build();
    
  2. 将 Request 封装为 Call

    // 通过 HttpClient 把 Request 构造为 Call 对象
    Call call = httpClient.newCall(request);
    
  3. 执行请求 (同步或异步)

    同步请求

    // 执行同步请求
    Response response = call.execute();
    

    异步请求

    call.enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {
            LOGGER.error("请求 {} 出现异常 {}", call.request().url(), e.getMessage());
        }
    
        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            String body = response.body().toString();
            LOGGER.info("请求 {} 的响应结果为 {}", call.request().url(), body);
        }
    });
    
    

5、POST 请求

POST 请求的构建步骤与GET 相似,区别是,在构建 Request 对象时 在post() 方法中,设置需要发送的数据,发送的数据可为目前流行的 JSON 格式数据,也可以模拟 Form表单提交的数据,操作如下所示:

  • 构建Form表单数据

    // 构造 Form 表单对象
    FormBody formBody = new FormBody.Builder()
        .addEncoded("name", "张三")
        .add("age", "20")
        .add("a", "ag")
        .build();
    
  • 构造 JSON 数据

    // 创建 JSON 对象
    JSONObject json = new JSONObject();
    json.put("name", "张三");
    json.put("age", 20);
    
    // 构造 Content-Type 头
    MediaType mediaType = MediaType.parse("application/json; charset=UTF-8");
    
    // 构造请求数据
    RequestBody requestBody = RequestBody.create(json.toJSONString(), mediaType);
    
  • 构造Request对象

    // 构建 Request 对象
    Request request = new Request.Builder()
        // post 方法中传入 构造的对象
        .post(formBody)
        .url("http://localhost:10010/user/obj")
        .build();
    

构建完Request对象后的步骤,就与GET 请求相似,构建 Call 对象然后,在发送同步异步请求

6、上传

OkHttp中 进行文件的上传,是相当简单的,在发送 POST 请求时,只需要构造一个MultipartBody 对象即可,MultipartBody 对象可以发送 文件数据,也可以发送基本类型的数据。

 File file = new File("F:/20150703212056_Yxi4L.png");

// 使用 MultipartBody 构造 Request 对象
RequestBody multipartBody = new MultipartBody.Builder()
    //一定要设置这句
    .setType(MultipartBody.FORM)
    .addFormDataPart("name", "admin")//
    .addFormDataPart("password", "admin")//
    // 添加上传文件
    .addFormDataPart("file", "20150703212056_Yxi4L.png",
                     RequestBody.create( file, MediaType.parse("image/png")))
    .build();

// 构造 Request 对象
Request request = new Request.Builder()
    .post(multipartBody)
    .url("http://localhost:10010/user/upload")
    .build();

// 构造 Call 对象,并发送 同步请求
Call call = httpClient.newCall(request);
Response response = call.execute();

7、总结

OkHttp 作为网络请求工具,简单且功能强大,并且其大量使用了 构建者模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OKHttp使用详解 的相关文章

  • 用python操作浏览器的三种方式

    第一种 xff1a selenium导入浏览器驱动 xff0c 用get方法打开浏览器 xff0c 例如 xff1a import time from selenium import webdriver def mac driver 61
  • Linux-虚拟网络设备-veth pair

    基本概念 Virtual Ethernet CableBidirectional FIFOOften used to cross namespaces Linux container 中用到一个叫做veth的东西 xff0c 这是一种新的设

随机推荐

  • openstack-neutron-OVS agent(持续更新)

    概述 ML2Plugin的主要工作是管理虚拟网络资源 xff0c 保证数据正确无误 xff0c 具体物理设备的设置则由Agent完成 L2Agent通常运行在Hypervisor xff0c 与neutron server通过RPC通信 x
  • VUE中使用EventSource接收服务器推送事件

    Vue项目中 xff0c EventSource触发的事件中this指向变了 使用const that 61 this xff0c 然后在EventSource触发的事件中使用that if typeof EventSource 61 61
  • VNC

    一 安装tigervnc server 二 配置登录帐号 三 生成xstartup与log日志 注意 xff1a 如果没有使用vncserver来 设置密码 xff0c 则service vncserver restart 是不会成功的 这
  • DirectUI框架GUIFW

    前言 guifw是一款基于GDI 43 的DirectUI皮肤引擎 xff0c 借鉴了DuiLib和Qt的思想 效果预览 xff1a http download csdn net detail sllins 7707771 代码已开源 xf
  • keil 提示internal command error和no sw device

    1 使用keil烧录软件的时候 xff0c jlink stlink无法识别到芯片 需要排查的问题 1 xff09 换条线 2 xff09 是不是有程序禁用了Seral Wire xff1a 使用cubeide cubeMX xff0c 容
  • 多线程编程模式之Single Threaded Execution 模式

    一 Single Threaded Execution 模式介绍 简单的来说 xff0c Single threaded execution 模式描述了在一种多线程环境下各个线程对于公用资源的使用方式 任一时刻 xff0c 只有一个线程可以
  • NVIDIA Jetson TX2 查看系统相关+运行demo

    1 查看Jetson TX2 L4T版本 xff1a head n 1 etc nv tegra release 2 查看系统版本 xff1a cat etc lsb release 3 查看系统内核 xff1a uname a 4 查看内
  • Docker镜像迁移至新的服务器(全部数据)

    1 找到你想移动的 Docker 容器的 ID 2 提交你的变更 xff0c 并且把容器保存成镜像 xff0c 命名为 newimage docker commit span class token number 3 span a09b25
  • 配置VNC环境在windows主机访问阿里云linux服务器

    配置VNC环境在windows主机访问阿里云linux服务器 虽然作为服务器使用更多的是使用字符终端连接服务器 xff0c 进行操作 xff0c 因为图形界面很消耗性能和资源 xff0c 但有的时候使用图形界面进行操作更为便捷 xff0c
  • pythondataframe输出小结

    在使用dataframe时遇到datafram在列太多的情况下总是自动换行显示的情况 xff0c 导致数据阅读困难 xff0c 效果如下 xff1a coding utf 8 import numpy as np import pandas
  • 聊聊 Redis 为什么构建自己的简单动态字符串 SDS

    我们知道 xff0c Redis 支持字符串 哈希 列表 集合和有序集合五种基本类型 那么我们如何把图片 音频 视频或者压缩文件等二进制数据保存到 Redis 中呢 xff1f 之前在使用 Memcached 缓存这类数据时是把它们转换成
  • 聊聊 Redis 高可用之持久化AOF和RDB分析

    Redis 持久化概述 Redis 是内存数据库 xff0c 数据都是存储在内存中 xff0c 为了避免进程退出导致数据的永久丢失 xff0c 需要定期将 Redis 中的数据以某种形式把内存中的数据保存到磁盘中 xff1b 当 Redis
  • mysqldump: Got error: 1044: Access denied for user XXXX when doing LOCK TABLES

    一 报错信息 在使用mysqldump 执行远程备份数据库的时候报如下错误 xff1a mysqldump Got error span class token number 1044 span Access denied span cla
  • jmap -heap [pid]运行报:Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException(不允许的操作)

    一 运行环境 操作系统 xff1a Ubuntu 5 4 0 6 Java版本 xff1a JDK8 二 执行命令 jmap heap span class token punctuation span pid号 span class to
  • chkconfig: command not found

    问题描述 在 ubuntu1 16 04 10 执行 chkconfig 命令报 chkconfig command not found 说明此服务上没有安装 chkconfig 执行如下命令进行安装 span class token fu
  • Docker 基础篇 之 安装

    一 Docker安装 查看 CentOS 内核版本 Docker 要求 CentOS 系统的内核版本高于3 10 执行如下命令查询 内核版本 span class token function uname span r span class
  • Java 基础 之 Valid 验证

    一 64 Valid 简介 Bean Validation 内置的校验器 校验器说明 64 Null被注解的元素必须为 null 64 NotNull被注解的元素必须不为 null 64 AssertTrue被注解的元素必须为 true 6
  • HttpURLConnection链接详解

    HttpURLConnection链接详解 一 简介 简单来说 xff0c HttpURLConnection 是 Java 提供的发起 HTTP 请求的基础类库 xff0c 提供了 HTTP 请求的基本功能 xff0c 不过封装的比较少
  • Apache HttpClient 详解

    1 简介 HttpClient 是 Apache Jakarta Common 下的子项目 xff0c 用来提供高效的 最新的 功能丰富的支持 HTTP 协议的客户端编程工具包 xff0c 并且它支持 HTTP 协议最新的版本和建议 Htt
  • OKHttp使用详解

    1 简介 OkHttp 是一个默认高效的 HTTP 客户端 xff1a HTTP 2 支持允许对同一主机的所有请求共享一个套接字 连接池减少了请求延迟 xff08 如果 HTTP 2 不可用 xff09 透明 GZIP 缩小了下载大小 响应