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

😄作者简介: 小曾同学.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.mfbz.cn/a/885956.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python编程开发“人机猜拳”游戏

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Arduino UNO R3自学笔记6 之 Arduino引脚(IO)功能介绍

注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。 前言:Ardunio UNO R3有很多引脚,接下来主要介绍它们都可以用做什么。 从上图不难看出开发板引脚也不是有多少,分类来看也就以下种类型&…

翻译:Recent Event Camera Innovations: A Survey

摘要 基于事件的视觉受到人类视觉系统的启发,提供了变革性的功能,例如低延迟、高动态范围和降低功耗。本文对事件相机进行了全面的调查,并追溯了事件相机的发展历程。它介绍了事件相机的基本原理,将其与传统的帧相机进行了比较&am…

大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

最大正方形 Python题解

最大正方形 题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形,输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100),接…

[Linux]开发环境搭建

RPM和YUM 安装JDK 安装Tomcat 安装IDEA 安装MySql

2-109 基于matlab-GUI的BP神经网络

基于matlab-GUI的BP神经网络,10种不同分布的数据样本,9种不同的激活函数,可更改升级网络结构参数,对比各种方法参数下的训练测试效果,实时显示预测过程。程序已调通,可直接运行。 下载源程序请点链接&…

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署

以Flask为基础的虾皮Shopee“曲线滑块验证码”识别系统部署 一、验证码类型二、简介三、Flask应用 一、验证码类型 验证码类型:此类验证码存在两个难点,一是有右侧有两个凹槽,二是滑块的运动轨迹不是直线的,而是沿着曲线走的&…

AI驱动TDSQL-C Serverless 数据库技术实战营-与AI的碰撞

目录 一、简介 二、实验介绍 三、结果展示 四、实操指导 4.1 系统设计 4.2 环境搭建(手把手教程) 4.3 应用构建 4.4 效果展示 4.5 踩坑避雷总结 五、清理资源 5.1 删除TDSQL-C Serverless 5.2 删除 HAI 算力 六、实验总结归纳 一、简介 本…

SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS

一、本地上传 概念&#xff1a;将前端上传的文件保存到自己的电脑 作用&#xff1a;前端上传的文件到后端&#xff0c;后端存储的是一个临时文件&#xff0c;方法执行完毕会消失&#xff0c;把临时文件存储到本地硬盘中。 1、导入文件上传的依赖 <dependency><grou…

用于高频交易预测的最优输出LSTM

用于高频交易预测的最优输出LSTM J.P.Morgan的python教程 Content 本文提出了一种改进的长短期记忆&#xff08;LSTM&#xff09;单元&#xff0c;称为最优输出LSTM&#xff08;OPTM-LSTM&#xff09;&#xff0c;用于实时选择最佳门或状态作为最终输出。这种单元采用浅层拓…

Elasticsearch:使用 LLM 实现传统搜索自动化

作者&#xff1a;来自 Elastic Han Xiang Choong 这篇简短的文章是关于将结构化数据上传到 Elastic 索引&#xff0c;然后将纯英语查询转换为查询 DSL 语句&#xff0c;以使用特定过滤器和范围搜索特定条件。完整代码位于此 Github repo 中。 首先&#xff0c;运行以下命令安装…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

【C++并发入门】opencv摄像头帧率计算和多线程相机读取(下):完整代码实现

前言 高帧率摄像头往往应用在很多opencv项目中&#xff0c;今天就来通过简单计算摄像头帧率&#xff0c;抛出一个单线程读取摄像头会遇到的问题&#xff0c;同时提出一种解决方案&#xff0c;使用多线程对摄像头进行读取。上一期&#xff1a;【C并发入门】摄像头帧率计算和多线…

1.5 测试用例

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 测试用例介绍2 测试用例编写3 案例分析4 执行测试用例 前言 测试用例的设计和编制是软件活动中最重要的工作。本文详细讲解了测试用例的基本概念以及如何编写测试用例。 本篇文…

深入掌握 Protobuf 与 RPC 的高效结合:实现C++工程中的高效通信

目录 一、Protobuf与RPC框架的通信流程概述二、Protobuf与RPC在C中的实际应用2.1 定义 .proto 文件2.2 编译 .proto 文件生成C代码2.3 实现服务器端逻辑2.4 实现客户端逻辑2.5 使用CMake构建工程2.6 编译与运行2.7 关键组件解析2.8 序列化与反序列化的实现 三、关键实现与解析四…

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下&#xff0c;我们通过从节点只读模式提高了系统的并发能力并发不断增加&#xff0c;只需要扩展从节点即可&#xff0c;只要主从服务器之间&#xff0c;网络连接正常主服务器就会将写入自己的数据同步更新给从服务器&#xff0c;从而保证主从服务器的数据相同…

网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)

DVWA Weak Session IDs&#xff08;弱会话&#xff09; 文章目录 DVWA Weak Session IDs&#xff08;弱会话&#xff09;Low LevelMedium LevelHigh LevelImpossible Level 参考文献 WEB 安全靶场通关指南 相关阅读 Brute Force (爆破) Command Injection&#xff08;命令注入…

C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验

一、预览效果 国庆节第一天,祝祖国繁荣昌盛! 1.1 效果图 (WinForm无边框窗体,F11可全屏) 拖动窗体时半透明效果(拖动时参考窗体后面释放位置) 说明:本功能的实现基于网友的原型完善而来,更多代码可以参考他的文章 h

Golang | Leetcode Golang题解之第449题序列化和反序列化二叉搜索树

题目&#xff1a; 题解&#xff1a; type Codec struct{}func Constructor() (_ Codec) { return }func (Codec) serialize(root *TreeNode) string {arr : []string{}var postOrder func(*TreeNode)postOrder func(node *TreeNode) {if node nil {return}postOrder(node.Le…