Android 网络请求(二)OKHttp网络通信
学习笔记
OkHttp 是一个非常强大且流行的 HTTP 客户端库,广泛用于 Android 开发中进行网络请求。与 HttpURLConnection 相比,OkHttp 提供了更简单、更高效的 API,特别是在处理复杂的 HTTP 请求时。
如何使用 OkHttp 进行网络请求
以下是使用 OkHttp 发送一个简单的 GET 请求 和 POST 请求 的示例。
1. 在 build.gradle 中添加 OkHttp 依赖,以及网络权限
首先,你需要在项目的 build.gradle 文件中添加 OkHttp 的依赖。
dependencies {implementation 'com.squareup.okhttp3:okhttp:4.9.3'
}
确保在 Gradle 同步后,能够成功引入 OkHttp 库。
添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
<application...android:usesCleartextTraffic="true".....</application>
2. 使用 OkHttp 发送 GET 请求
下面的示例展示了如何使用 OkHttp 发送一个 GET 请求并获取返回数据。
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;public class OkHttpExample {public String getDataFromServer() {OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例// 创建一个 GET 请求对象Request request = new Request.Builder().url("https://jsonplaceholder.typicode.com/posts") // 设置目标 URL.build();// 用于保存响应内容String result = "";try {// 执行请求,返回一个 Response 对象Response response = client.newCall(request).execute();// 检查响应是否成功if (response.isSuccessful()) {// 获取响应的内容(如 JSON)result = response.body().string(); // 读取响应体的内容} else {result = "Request failed with code: " + response.code(); // 请求失败}} catch (IOException e) {e.printStackTrace();result = "Error: " + e.getMessage(); // 捕获异常并返回错误信息}return result; // 返回请求结果}
}
代码解释:
-
OkHttpClient client = new OkHttpClient();:创建一个OkHttpClient实例,这个实例用于执行网络请求。 -
Request request = new Request.Builder().url(...).build();:构建请求对象,通过Request.Builder设置 URL 和其他请求参数。 -
Response response = client.newCall(request).execute();:使用newCall(request).execute()执行请求并获取响应。 -
response.body().string():获取响应体的内容,通常是 JSON 格式的字符串。 -
response.code():获取响应的 HTTP 状态码,用于判断请求是否成功。
3. 使用 OkHttp 发送 POST 请求
下面是如何使用 OkHttp 发送 POST 请求,并传递一些请求体(例如 JSON 数据)。
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;public class OkHttpExample {public String postDataToServer() {OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例// 创建请求的 JSON 数据体String json = "{\"title\":\"foo\", \"body\":\"bar\", \"userId\":1}";// 设置请求体类型为 JSONMediaType JSON = MediaType.get("application/json; charset=utf-8");// 创建一个 POST 请求对象,包含请求体RequestBody body = RequestBody.create(json, JSON);Request request = new Request.Builder().url("https://jsonplaceholder.typicode.com/posts") // 设置目标 URL.post(body) // 设置 POST 请求体.build();// 用于保存响应内容String result = "";try {// 执行请求并获取响应Response response = client.newCall(request).execute();// 检查响应是否成功if (response.isSuccessful()) {result = response.body().string(); // 获取响应体的内容} else {result = "Request failed with code: " + response.code(); // 请求失败}} catch (IOException e) {e.printStackTrace();result = "Error: " + e.getMessage(); // 捕获异常并返回错误信息}return result; // 返回请求结果}
}
代码解释:
-
String json = "{\"title\":\"foo\", \"body\":\"bar\", \"userId\":1}";:这里创建了一个 JSON 字符串,表示要发送的请求体。 -
MediaType JSON = MediaType.get("application/json; charset=utf-8");:指定请求体的类型为application/json,告诉服务器发送的是 JSON 格式的数据。 -
RequestBody body = RequestBody.create(json, JSON);:将 JSON 字符串转换为RequestBody对象,这个对象会作为请求体发送给服务器。 -
request.post(body):将请求体添加到请求对象中,指定该请求是一个 POST 请求。
4. 异步请求
在 Android 中,网络请求需要在后台线程中进行,避免阻塞主线程。如果你不希望使用同步请求,可以使用 OkHttp 的 异步请求,通过 enqueue() 方法进行请求。
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;public class OkHttpExample {public void getDataFromServerAsync() {OkHttpClient client = new OkHttpClient(); // 创建 OkHttpClient 实例// 创建 GET 请求对象Request request = new Request.Builder().url("https://jsonplaceholder.typicode.com/posts").build();// 异步请求client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 请求失败时的处理e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {// 请求成功时,处理响应数据String result = response.body().string();// 在此处处理返回的结果,更新 UI(需要在主线程中进行)} else {// 请求失败时,处理失败的情况System.out.println("Request failed with code: " + response.code());}}});}
}
异步请求的关键点:
-
client.newCall(request).enqueue(new Callback() {...}):异步请求的方法。 -
onFailure():请求失败时的回调方法。 -
onResponse():请求成功时的回调方法,响应数据会传递到此。
注意: 由于
onResponse()方法是在后台线程中执行的,任何 UI 更新操作需要通过runOnUiThread()或其他线程间通信机制来确保在主线程中执行。
5. 处理请求头
如果你需要在请求中设置请求头(例如设置身份验证的 Token),可以通过 Request.Builder 设置请求头。
Request request = new Request.Builder().url("https://jsonplaceholder.typicode.com/posts").header("Authorization", "Bearer your_token_here") // 设置请求头.build();
6. 连接池与缓存
OkHttp 默认提供了连接池和缓存机制,可以有效地提高网络请求的效率。你可以通过自定义 OkHttpClient 来配置连接池、缓存和其他高级功能。
示例:配置缓存
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import java.io.File;File cacheDir = new File(getCacheDir(), "http_cache");
Cache cache = new Cache(cacheDir, 10 * 1024 * 1024); // 10MB 的缓存OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();
总结
-
同步请求:使用
client.newCall(request).execute(),可以直接获取响应内容,但它会阻塞当前线程,不适合在 UI 线程中执行。 -
异步请求:使用
client.newCall(request).enqueue(callback),通过回调来处理响应数据,适合在 UI 线程中执行,避免阻塞 UI。 -
POST 请求:可以通过
RequestBody创建请求体,并通过request.post(body)来发送。 -
请求头:可以通过
Request.Builder().header()设置自定义请求头。
OkHttp 是一个功能强大且易于使用的 HTTP 客户端,适用于大多数 Android 项目的网络请求。对于复杂的请求场景,推荐使用 OkHttp。
相关文章:
Android 网络请求(二)OKHttp网络通信
学习笔记 OkHttp 是一个非常强大且流行的 HTTP 客户端库,广泛用于 Android 开发中进行网络请求。与 HttpURLConnection 相比,OkHttp 提供了更简单、更高效的 API,特别是在处理复杂的 HTTP 请求时。 如何使用 OkHttp 进行网络请求 以下是使…...
npm上传自己封装的插件(vue+vite)
一、npm账号及发包删包等命令 若没有账号,可在npm官网:https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口,常见命令如下: 1、登录命令:npm login(不用每次都重新登录࿰…...
如何在Word文件中设置水印以及如何禁止修改水印
在日常办公和学习中,我们经常需要在Word文档中设置水印,以保护文件的版权或标明文件的机密性。水印可以是文字形式,也可以是图片形式,能够灵活地适应不同的需求。但仅仅设置水印是不够的,有时我们还需要确保水印不被随…...
.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper
目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址:功能展示项目结构项目引用1. 新建模型2. Data层,依赖EF Core,实现数据库增删改查3. Bussiness层,实现具体的业务逻辑4. Service层&am…...
el-table根据指定字段合并行和列+根据屏幕高度实时设置el-table的高度
文章目录 html代码script代码arraySpanMethod.js代码 html代码 <template><div class"rightBar"><cl-table ref"tableData"border :span-method"arraySpanMethod" :data"tableData" :columns"columns":max-…...
图像处理 之 凸包和最小外围轮廓生成
“ 最小包围轮廓之美” 一起来欣赏图形之美~ 1.原始图片 男人牵着机器狗 2.轮廓提取 轮廓提取 3.最小包围轮廓 最小包围轮廓 4.凸包 凸包 5.凸包和最小包围轮廓的合照 凸包和最小包围轮廓的合照 上述图片中凸包、最小外围轮廓效果为作者实现算法生成。 图形几何之美系列&#…...
萤石设备视频接入平台EasyCVR私有化视频平台视频监控系统的需求及不同场景摄像机的选择
在现代社会,随着安全意识的提高和技术的进步,安防监控视频系统已成为保障人们生活和财产安全的重要工具。EasyCVR安防监控视频系统,以其先进的网络传输技术和强大的功能,为各种规模的项目提供了一个高效、可靠的监控解决方案。以下…...
网络安全之接入控制
身份鉴别 定义:验证主题真实身份与其所声称的身份是否符合的过程,主体可以是用户、进程、主机。同时也可实现防重放,防假冒。 分类:单向鉴别、双向鉴别、三向鉴别。 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …...
Sqlite: Java使用、sqlite-devel
这里写目录标题 一、简介二、使用1. Java项目中(1)引入驱动(2)工具类(3)调用举例 2. sqlite-devel in linuxsqlite-devel使用 三、更多应用1. 数据类型2. 如何存储日期和时间3. 备份 一、简介 非常轻量级&…...
京东面试题目分享
话不多说,直接上问题 一面(视频面) 1小时30分钟 1、类加载机制概念、加载步骤、双亲委托机制、全盘委托机制、类加载器种类及继承关系 2、如何实现让类加载器去加载网络上的资源文件?怎么自定义类加载器?自定义的加…...
STM32 使用 STM32CubeMX HAL库实现低功耗模式
STM32 使用 HAL 库的低功耗模式测试使用 ...... 矜辰所致前言 上次画了一个 STM32L010F4 最小系统的板子,也做了一些基本测试,但是最重要的低功耗一直拖到现在,以前在使用 STM32L151 的时候用标准库做过低功耗的项目,现在都使…...
技术美术百人计划 | 《2.1 色彩空间介绍》笔记
总览 一、色彩发送器 色彩认知: 光源是出生点,光源发射出光线,光线通过直射反射折射等路径最终进入人眼。 但人眼接收到光线后,人眼的细胞产生了一系列化学反应。 由此把产生的信号传入大脑,最终大脑对颜色产生了认…...
如何在 Ubuntu 上安装 Mosquitto MQTT 代理
如何在 Ubuntu 上安装 Mosquitto MQTT 代理 Mosquitto 是一个开源的消息代理,实现了消息队列遥测传输 (MQTT) 协议。在 Ubuntu 22.04 上安装 MQTT 代理,您可以利用 MQTT 轻量级的 TCP/IP 消息平台,该平台专为资源有限的物联网 (IoT) 设备设计…...
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…...
设计模式的学习思路
学习设计模式确实需要一定的时间和实践,尤其是对于刚入门的人来说,因为一开始可能会感到有些混淆,尤其是当多个设计模式看起来有相似之处时。本博客是博主学习设计模式的思路历程,大家可以一起学习进步。设计模式学习-CSDN博客 1…...
stereopy 查看 data.tl 的可用属性
为了查看 data.tl 的可用属性,您可以使用 Python 的内置函数,例如 dir() 或 vars(),具体操作如下: 1. 列出 data.tl 的所有属性 使用 dir() 来查看所有可用的属性和方法: # 列出所有属性 print(dir(data.tl))这将返回一个列表,包含所有可用的方法、属性和内部字段。 2.…...
【2024APMCM亚太杯A题】详细解题思路
A题 复杂场景下的水下图像增强研究 解题思路问题一图像统计分析技术一、检测 偏色 的技术二、检测 弱光 的技术三、检测 模糊 的技术 聚类算法 问题二问题三问题四完整论文与代码 解题思路 问题一 问题 1:请使用类似上文提到的图像统计分析技术,对附件 …...
用 React18 构建Tic-Tac-Toe(井字棋)游戏
下面是一个完整的 Tic-Tac-Toe(井字棋)游戏的实现,用 React 构建。包括核心逻辑和组件分离,支持两人对战。 1. 初始化 React 项目: npx create-react-app tic-tac-toe cd tic-tac-toe2.文件结构 src/ ├── App.js…...
数据结构及算法--排序篇
在 C 语言中,可以通过嵌套循环和比较运算符来实现常见的排序算法,比如冒泡排序、选择排序或插入排序 目录 基础算法: 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序&…...
泷羽sec学习打卡-网络七层杀伤链1
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于蓝队基础的那些事儿-Base1 基本的企业网络架构是怎样的呢?高层管理IT管理影子IT中央技术…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
