OkHttp 详细使用步骤,以及异步请求和同步请求

news2024/12/26 11:56:31

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

文章目录

  • 一 认识 OKHttp
  • 二 OKHttp 的功能
  • 三 OKHttp的简单使用

一 认识 OKHttp

Okhttp 是有 Square 公司开发的一款开源的 Java Http 客户端库,也就是一个请求库。广泛应用于 Android 和Java 应用。它的设计是为了更快地加载资源并节省带宽。OkHttp 提供了许多高级功能,如连接池、请求压缩、缓存等,使得网络请求更加高效和方便。它的设计是为了更快地加载资源并节省带宽。

二 OKHttp 的功能

  • 请求和响应处理
  • 异步和同步请求
  • 连接池和请求复用
  • 拦截器
  • websocket支持
  • 缓存支持

三 OKHttp的简单使用

  1. 添加OkHttp依赖(项目的build.gradle)

    dependencies {    implementation 'com.squareup.okhttp3:okhttp:4.9.3'}
    
  2. 创建OkHttp实例

    
    OkHttpClient client = new OkHttpClient();
    
  3. 创建请求

    Request request = new Request.Builder()
    		.url("http://www.baidu.com")
    		.build();
    

    Builder()是Request类的内部静态类 Builder 的构造方法。在 OkHttp 库中,Request 类通过使用 Builder 类来构建 HTTP 请求。通过 Builder 类,可以设置请求的 URL、头部信息、请求体等属性,最后通过调用 build() 方法创建一个 Request 对象。

  4. 发起请求

    在 Okhttp 中,发起请求有两种方式

    • 同步请求
    • 异步请求

    两者主要区别在于执行方式和返回结果处理方式不同

4.1 同步请求

  • 执行方式:同步请求会阻塞当前线程,直到请求完成并返回结果或者超时。这意味着在发送同步请求时,当前线程会一直等待直到服务器响应或超时。

  • 返回结果处理:同步请求会返回一个Response对象,研发可立即处理该对象以获取响应数据。

    try {
        Response response = client.newCall(request).execute();
        String responseData = response.body().string();
        // 处理响应数据
    } catch (IOException e) {
        e.printStackTrace();
    }
    //同步请求会在 execute() 方法处阻塞当前线程,直到请求完成。
    

client.newCall(request):这部分代码创建了一个 Call 对象,用于表示将要执行的请求。newCall(request) 方法是 OkHttpClient 类的方法,用于创建一个新的 Call 对象,该对象表示一个将要执行的请求。

execute():这部分代码执行了创建的 Call 对象,发送请求并等待获取响应。execute() 方法会在当前线程中执行网络请求,会阻塞当前线程直到请求完成或超时。

4.2 异步请求

  • 执行方式:异步请求不会阻塞当前线程,而是通过回调函数在请求完成后处理响应数据。这种方式适合需要在后台执行网络请求并在请求完成后执行相应操作的情况。

  • 返回结果处理:异步请求需要通过回调函数处理响应数据,通过包括成功、失败时的操作。

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String responseData = response.body().string();
            // 处理成功响应数据
        }
    
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
            // 处理请求失败情况
        }
    });
    //异步请求在 enqueue() 方法处启动请求,并在请求完成后通过回调函数处理响应数据。
    
  1. client.newCall(request).enqueue(new Callback() {...});:这行代码使用 OkHttp 的 newCall(request) 方法创建一个异步的网络请求 Call 对象,然后通过 enqueue() 方法将这个请求加入到调度队列中,并指定一个回调函数 Callback() 来处理请求的响应结果。
  2. new Callback() {...}:这里创建了一个匿名内部类对象,实现了 OkHttp 的 Callback 接口,通过重写接口中的方法来处理网络请求的成功和失败情况。
  3. onFailure(Call call, IOException e) 方法:在网络请求失败时被调用。通常在这个方法中处理一些网络错误的逻辑,比如显示错误提示、重试请求等。
  4. onResponse(Call call, Response response) throws IOException 方法:在网络请求成功并得到响应时被调用。在这个方法中可以处理服务器返回的数据。如果响应成功(状态码在 200 到 299 之间),则可以从响应中获取数据,通常是将响应数据转换为字符串或其他格式进行处理。
  5. response.isSuccessful():这个方法用来检查响应是否成功(即 HTTP 状态码是否在 200 到 299 之间)。如果成功,通常意味着服务器成功处理了请求,可以继续处理响应数据。如果不成功,就会执行失败响应的处理逻辑。
  6. String responseData = response.body().string();:这行代码用于获取响应体中的数据并转换为字符串。这里假设响应的数据是文本形式的,如果是其他类型(如 JSON),可能需要进行相应的转换。
  7. onResponse() 方法中,成功的响应数据会经过处理,可以根据具体需求来解析和处理响应数据。而在 onFailure() 方法中,可以处理网络请求失败的情况,进行相应的错误处理。

在实际应用中,通常建议使用异步请求来处理网络请求,特别是在 Android 开发中,避免在主线程中发起同步请求以避免阻塞主线程导致应用无响应。异步请求可以提高应用的性能和用户体验,同时允许应用在等待网络响应时继续响应用户操作。在 OkHttp 中,使用异步请求可以通过 enqueue 方法来实现,该方法接受一个回调接口,当请求完成时会调用该接口的方法来处理响应数据。通过使用异步请求,可以更好地管理网络请求并提高应用程序的响应性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+vue+elementui大文件分片上传

工具类方法: /*** 大文件分片上传* param fileName 文件名* param file 文件* param fileKey 文件key* param shardIndex 当前分片下标* param shardTotal 分片总量*/public static void bigUpload(String fileName,MultipartFile file, String fileKey, L…

【数据结构】MapSet

【概念】 Map和Set是一种专门用于搜索的数据结构,其搜索效率与具体实例化的子类数量有关,本质上是一颗二叉搜索树 搜索的关键数据为关键字“Key”,关键字对应的数据为值“Value”,将其称为“Key-Value键值对” 【关于Map】 Ma…

8 种渗透测试类型

渗透测试是对网络、硬件或软件系统进行有计划的攻击,目的是揭露可能破坏系统完整性并危及有价值数据的安全缺陷。虽然渗透测试的类型不同,但它们都旨在利用漏洞和弱点来测试现有安全措施的有效性。 渗透测试 不同类型的渗透测试取决于人们希望在特定系…

初识Linux · O(1)调度算法

目录 前言: O(1)调度算法 前言: 在初识进程的那一块,我们已经知道了进程并不是一直占用cpu资源的,而是存在时间片的概念,即,每个进程都有一定的时间来执行该进程,时间一到,该进程…

会议平台后端优化方案

会议平台后端优化方案 通过RTC的学习,我了解到了端对端技术,就想着做一个节省服务器资源的会议平台 之前做了这个项目,快手二面被问到卡着不知如何介绍,便有了这篇文章 分析当下机制 相对于传统视频平台(SFU&#xff…

windows 驱动实例分析系列-定时日志的COM驱动

本文章的前置文章为: windows 驱动编写原则 windows COM驱动 案例 windows COM驱动的I/O处理 在前面的设计中,主要是对windows提供的VirtualSerial源代码的讲解,但是那个驱动其实是一个空壳驱动,用于学习的,在I/O处理中,也讲述了serial I/O处理的本质,接下来会将这些…

PGMP-03战略一致性

1.概要 program strategy alignment:战略一致性 2.详细

css的背景background属性

CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…

经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)

0. 简介 近期的许多研究探索了使用基于WiFi的感知技术来改善SLAM(同时定位与地图构建)、机器人操控或探索。此外,WiFi的广泛可用性使其成为最具优势的射频信号。但WiFi传感器缺乏一个准确、易处理、多功能的工具箱,这限制了它们与…

MicoZone-Maven

一、理论 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供项目构建和依赖管理支持的工具。 通过Maven管理依赖的优势: 1、通过在pom.xml中指定jar包坐标即可自动从仓库下载依赖 2、如果jar包存在子依赖会自动下载子依赖包 3、如果jar包之间存在冲突…

Web安全 - 服务端请求伪造SSRF(Server-Side Request Forgery)

文章目录 OWASP 2023 TOP 10SSRF 导图SSRF 概念SSRF的工作原理SSRF攻击场景SSRF防御策略1. 严格验证用户输入2. 禁用或限制对内部网络的访问3. 强制使用外部API代理4. 禁止直接访问敏感资源5. 输入内容长度限制6. 检测和监控7. 确保对HTTP请求的处理安全 SSRF防御实现方案1. 白…

【鸿蒙开发】05 登录Demo解析

文章目录 一、功能介绍 在鸿蒙开发中,一个完善的登录功能是许多应用程序的基础需求。本文将详细介绍一个鸿蒙 App 登录 Demo,包括其功能介绍、代码解析以及代码 demo 的下载地址。 本文初始代码从华为开发者网站下载,根据该Demo进行内容调整。…

【Fast-LIO系列】Fast-LIO、Fast-LIO2、Faster-LIO系列特点分析

【FAST-LIO】Fast-LIO系列特点分析 1. FAST-LIO核心贡献1.将IMU和Lidar特征点紧耦合在一起2.使用反向传播考虑到了运动补偿3. 基于IESKF中的 卡尔曼增益更新 K 2. FAST-LIO2核心贡献(2021年)1. 不用线,面特征点而使用全局点云2. 使用ikd-tree存储点云3. ikd-Tree 3.…

P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解

[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…

C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {for (int i 0; i < numsSize; i) {int x (nums[i] - 1) % numsSize;nums[x] numsSize;}int* ret malloc(sizeof(int) * numsSize);*returnSize 0;for (in…

特征工程——一门提高机器学习性能的艺术

当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心&#xff0c;聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足&#xff0c;甚至完全忽视。类似MLOps的领域正迅速发展&#xff0c;通过系统性地训练和利用ML模型&…

ZYNQ: GPIO 之 MIO 控制 LED 实验

GPIO 之 MIO 控制 LED 实验目的 使用 GPIO 通过两个 MIO 引脚控制 PS 端两个 LED 的亮灭&#xff0c;实现底板上 PS_LED0、PS_LED1 两个 LED 灯同亮同灭的效果。 简介 ZYNQ PS 中的外设&#xff08;如 USB 控制器、UART 控制器、I2C 控制器以及 GPIO 等等&#xff09;可以通…

亲测无限坐席在线客服系统源码/二开版/基于ThinkPHP+搭建教程

源码简介&#xff1a; 亲测了一款实用的无限坐席在线客服系统源码&#xff0c;这可是基于ThinkPHP框架开发的二开版哦&#xff01;里面还附带了一份超详细的搭建教程。 安装过程简直不能更简单&#xff0c;只需一键操作&#xff0c;启动两个端口就搞定了。而且&#xff0c;它…

动态库的加载全过程

区分一组概念&#xff1a;逻辑地址&#xff0c;虚拟地址&#xff0c;物理地址。 逻辑地址&#xff1a;是我们的代码在编译过程&#xff0c;编译器帮对每一条代码所生成的指令所编写的地址。 物理地址&#xff1a;当程序被放入到内存中时&#xff0c;内存与每一条指令所对应的…

回执单识别-银行回单识别API-文字识别OCR API

银行回单是一种由银行提供的交易凭证&#xff0c;记录了账户资金的交易明细。它通常包括存款、取款、转账、汇款、支付等各种类型的资金往来信息。银行回单可以是纸质的&#xff0c;也可以是电子版的&#xff0c;内容详尽记录了交易的相关信息&#xff0c;具有法律效力&#xf…