Android开发实战班 -网络编程 - Retrofit 网络请求 + OkHttp 使用详解

在现代 Android 应用开发中,网络编程是必不可少的一部分。Retrofit 是 Square 公司推出的一款类型安全的 HTTP 客户端库,简化了与 RESTful API 的交互。Retrofit 基于 OkHttp,并提供了简洁的接口定义和强大的功能,如异步请求、请求拦截、JSON 解析等。本章节将深入讲解 Retrofit 的基本概念、配置、使用方法以及与 OkHttp 的结合,帮助学员掌握 Retrofit 网络请求的实现。

19.1 网络编程概述

  • 网络编程的作用:

    • 网络编程用于实现应用与服务器之间的数据交互,例如获取数据、提交数据、更新数据等。
    • 常见的网络请求类型有 GET, POST, PUT, DELETE 等。
  • 网络编程的挑战:

    • 异步操作: 网络请求是异步的,需要处理线程切换和回调。
    • 错误处理: 需要处理网络错误、超时、数据解析错误等。
    • 安全性: 需要处理 HTTPS、证书验证、加密传输等。
    • 性能优化: 需要优化网络请求的性能,例如缓存、重试机制等。

19.2 Retrofit 简介

  • Retrofit 的历史与发展:

    • Retrofit 是 Square 公司于 2013 年推出的 HTTP 客户端库。
    • Retrofit 基于 OkHttp,提供了更简洁的接口定义和更强大的功能。
    • Retrofit 2.0 于 2016 年发布,引入了对协程的支持。
  • Retrofit 的优势:

    • 类型安全: Retrofit 使用接口定义 API,提供了类型安全的请求和响应。
    • 简洁易用: Retrofit 提供了简洁的 API,易于上手和使用。
    • 强大的功能: Retrofit 支持异步请求、请求拦截、JSON 解析、文件上传下载等。
    • 可扩展性: Retrofit 可以与 OkHttp 拦截器、转换器等结合使用,实现更强大的功能。
    • 协程支持: Retrofit 2.6.0 及以上版本支持 Kotlin 协程,简化异步请求代码。

19.3 Retrofit 的基本使用

19.3.1 添加 Retrofit 依赖

build.gradle 文件中添加 Retrofit 依赖:

dependencies {implementation "com.squareup.retrofit2:retrofit:2.9.0"implementation "com.squareup.retrofit2:converter-gson:2.9.0"
}
19.3.2 定义 API 接口

使用 Retrofit 的接口定义 API,例如定义一个 GitHub API 接口:

import retrofit2.http.GET
import retrofit2.http.Pathinterface GitHubService {@GET("users/{user}/repos")suspend fun listRepos(@Path("user") user: String): List<Repo>
}data class Repo(val id: Int,@field:SerializedName("name") val name: String,@field:SerializedName("html_url") val url: String
)
19.3.3 创建 Retrofit 实例

使用 Retrofit.Builder 创建 Retrofit 实例,并配置基础 URL 和转换器:

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryval retrofit = Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build()val service = retrofit.create(GitHubService::class.java)
19.3.4 发起网络请求

使用 Retrofit 发起网络请求,例如获取用户仓库列表:

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launchCoroutineScope(Dispatchers.IO).launch {try {val repos = service.listRepos("octocat")// 处理数据} catch (e: Exception) {// 处理错误}
}

19.4 Retrofit 与 OkHttp 的结合

Retrofit 基于 OkHttp,提供了更强大的功能,例如请求拦截、缓存、重试机制等。

19.4.1 使用 OkHttp Interceptor

OkHttp Interceptor 可以在请求发送前或响应返回后拦截请求和响应,进行自定义处理,例如添加请求头、打印日志等。

  • 添加请求头:

    import okhttp3.Interceptor
    import okhttp3.OkHttpClient
    import okhttp3.Request
    import okhttp3.Responseval headerInterceptor = Interceptor { chain ->val original: Request = chain.request()val requestBuilder = original.newBuilder().header("Accept", "application/json").method(original.method, original.body)val request: Request = requestBuilder.build()chain.proceed(request)
    }val okHttpClient = OkHttpClient.Builder().addInterceptor(headerInterceptor).build()val retrofit = Retrofit.Builder().baseUrl("https://api.github.com/").client(okHttpClient).addConverterFactory(GsonConverterFactory.create()).build()
    
  • 打印日志:

    import okhttp3.logging.HttpLoggingInterceptorval loggingInterceptor = HttpLoggingInterceptor()
    loggingInterceptor.level = HttpLoggingInterceptor.Level.BODYval okHttpClient = OkHttpClient.Builder().addInterceptor(loggingInterceptor).build()
    
19.4.2 使用 OkHttp Cache

OkHttp 提供了缓存机制,可以缓存网络请求结果,提高应用性能。

  • 配置缓存:

    import okhttp3.Cache
    import java.io.Fileval cacheSize = 10 * 1024 * 1024 // 10 MB
    val cacheDirectory = File(context.cacheDir, "http-cache")
    val cache = Cache(cacheDirectory, cacheSize)val okHttpClient = OkHttpClient.Builder().cache(cache).build()
    
  • 配置缓存策略:

    import okhttp3.CacheControlval request = Request.Builder().url("https://api.github.com/users/octocat/repos").cacheControl(CacheControl.Builder().maxStale(1, TimeUnit.DAYS).build()).build()
    

19.5 Retrofit 进阶功能

19.5.1 文件上传与下载
  • 文件上传:

    @Multipart
    @POST("upload")
    suspend fun uploadFile(@Part file: MultipartBody.Part,@Part("description") description: RequestBody
    )
    
  • 文件下载:

    @GET
    suspend fun downloadFile(@Url fileUrl: String): ResponseBody// 下载文件
    val response = service.downloadFile("https://example.com/file.zip")
    val file = File(context.filesDir, "file.zip")
    response.body()?.byteStream()?.use { input ->file.outputStream().use { output ->input.copyTo(output)}
    }
    
19.5.2 错误处理
  • 自定义异常:
    class ApiException(message: String, val code: Int) : Exception(message)// 解析错误
    try {val response = service.getData()if (response.isSuccessful) {// 处理成功} else {throw ApiException("API Error", response.code())}
    } catch (e: ApiException) {// 处理 API 异常
    } catch (e: Exception) {// 处理其他异常
    }
    

19.6 实战案例

  1. 案例一:使用 Retrofit 实现 GitHub API 请求

    • 定义 GitHub API 接口。
    • 创建 Retrofit 实例。
    • 使用协程发起网络请求,获取用户仓库列表。
    • 在 Activity 中显示仓库列表。
  2. 案例二:使用 Retrofit 实现文件上传

    • 定义文件上传 API 接口。
    • 使用 Retrofit 上传文件。
    • 在 Activity 中选择文件并上传。
  3. 案例三:使用 Retrofit 实现文件下载

    • 定义文件下载 API 接口。
    • 使用 Retrofit 下载文件。
    • 在 Activity 中下载文件并保存到内部存储。

19.7 课后作业

  1. 任务一:使用 Retrofit 实现 GitHub API 请求

    • 定义 GitHub API 接口。
    • 创建 Retrofit 实例。
    • 使用协程发起网络请求,获取用户仓库列表。
    • 在 Activity 中显示仓库列表。
  2. 任务二:使用 Retrofit 实现文件上传

    • 定义文件上传 API 接口。
    • 创建 Retrofit 实例。
    • 使用协程发起文件上传请求。
    • 在 Activity 中选择文件并上传。
  3. 任务三:使用 Retrofit 实现文件下载

    • 定义文件下载 API 接口.
    • 创建 Retrofit 实例.
    • 使用协程发起文件下载请求.
    • 在 Activity 中下载文件并保存到内部存储.

通过本章节的学习,学员将能够掌握 Retrofit 网络请求的基本概念、使用方法以及与 OkHttp 的结合,并能够使用 Retrofit 实现各种网络请求操作,包括 GET, POST, 文件上传下载等。

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

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

相关文章

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解

ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解 目录 ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模态分解效果分析基本介绍程序设计参考资料效果分析 基本介绍 (创新独家)ASFSSA-VMD多策略改进的麻雀搜索算法优化变分模 态分解ASFSSA-VMD:优化VMD分解层数K和惩罚因子a…

Unity脚本基础规则

Unity脚本基础规则 如何在Unity中创建一个脚本文件&#xff1f; 在Project窗口中的Assets目录下&#xff0c;选择合适的文件夹&#xff0c;右键&#xff0c;选择第一个Create&#xff0c;在新出现的一栏中选择C# Script&#xff0c;此时文件夹内会出现C#脚本图标&#xff0c;…

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Dart:字符串

字符串&#xff1a;单双引号 String c hello \c\; // hello c&#xff0c;单引号中使用单引号&#xff0c;需要转义\ String d "hello c"; // hello c&#xff0c;双引号中使用单引号&#xff0c;不需要转义 String e "hello \“c\”"; // hell…

使用vscode+expo+Android夜神模拟器运行react-native项目

1.进入夜神模拟器安装路径下的bin目录 2.输入命令&#xff0c;连接Android Studio 启动夜神模拟器后&#xff0c; 打开安装目录的bin文件夹执行下面的命令&#xff0c;只需执行一次&#xff09; nox_adb.exe connect 127.0.0.1:62001adb connect 127.0.0.1:62001 3.运行项目…

从0安装mysql server

安装 MySQL Server 首先,你需要在 Ubuntu 上安装 MySQL 服务器。运行以下命令来安装:sudo apt update sudo apt install mysql-server安装完成后,MySQL 服务会自动启动。你可以通过以下命令检查 MySQL 服务是否正在运行: sudo systemctl status mysql如果 MySQL 正在运行,…

自动计算机视觉功能技术方向

近年来&#xff0c;随着自动计算机视觉功能的不断发展&#xff08;如跟踪、目标/活动识别等&#xff09;的技术方向&#xff0c;这些技术在无人机应用领域中的重要性也日益凸显。同时&#xff0c;得益于低成本商用无人机的日益普及&#xff0c;这些技术得到了快速的推广和应用。…

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…

C语言 蓝桥杯某例题解决方案(查找完数)

蓝桥杯原题&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点&#xff0c;与我们上一个解决的问题“质因数分解”不同&#xff0c;它不需要判断因数是否是质数&#xff0c;因此…

linux先创建文件夹后指定创建文件夹用户

1、创建文件夹&#xff0c;然后创建用户并指定用户目录&#xff0c;然后修改目录所有权给该目录 # 创建 /home/test 目录 mkdir /home/test # 设置权限&#xff08;确保有适当的读写权限&#xff09; chown root:root /home/test chmod 700 /home/test # 创建 xl 用户并指定家…

Gin 框架中的表单处理与数据绑定

Gin 框架中的表单处理与数据绑定 在Web应用开发中&#xff0c;表单是用户与服务器交互的重要手段。Gin框架作为一款高效、简洁的Go语言Web框架&#xff0c;为表单处理提供了便捷的支持&#xff0c;包括数据绑定、验证等功能。本文将详细介绍如何使用Gin框架处理表单数据&#…

记录下,用油猴Tampermonkey监听所有请求,绕过seesion

油猴Tampermonkey监听所有请求&#xff0c;绕过seesion 前因后果脚本编写 前因后果 原因是要白嫖一个网站的接口&#xff0c;这个接口的页面入口被隐藏掉了&#xff0c;不能通过页面调用&#xff0c;幸好之前有想过逆向破解通过账号密码模拟登录后拿到token&#xff0c;请求该…

【LINUX相关】

一、Linux怎么进行查看日志&#xff1f; 首先得问问开发项目日志存放在哪里&#xff0c;可以使用多种命令来查看日志。常用的命令包括tail、cat、less和grep等。例如:1、使用tail命令可以实时查看日志文件的最新内容&#xff1a;tail -f log_file&#xff0c; 2、使用cat命令可…

3. SQL优化

SQL性能优化 在日常开发中&#xff0c;MySQL性能优化是一项必不可少的技能。本文以具体案例为主线&#xff0c;结合实际问题&#xff0c;探讨如何优化插入、排序、分组、分页、计数和更新等操作&#xff0c;帮助你实现数据库性能的飞跃。 一、索引设计原则 索引是MySQL优化的…

《macOS 开发环境配置与应用开发》

一、引言 macOS 作为一款强大而流行的操作系统&#xff0c;为开发者提供了丰富的开发机会和优秀的开发环境。无论是开发原生的 macOS 应用&#xff0c;还是进行跨平台开发&#xff0c;了解和掌握 macOS 开发环境的配置以及应用开发的方法至关重要。本文将详细介绍 macOS 开发环…

LiveGBS流媒体平台GB/T28181常见问题-作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办?

LiveGBS国标GB/T28181流媒体平台作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办&#xff1f; 1、背景2、提供国标编号、地址、端口号3、搭建GB28181视频直播平台 1、背景 有篇博文曾经介绍过&#xff0c;LiveGBS国标视频平台支持GB/T2818…

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象&#xff0c;每个节点处理的请求不同&#xff0c;且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时&#xff0c;会沿着链的路径依此传递给每一个节点对象&#xff0c;直至有对象处理这个请求为止。 属于行为型模式…

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

第二十章 Spring之假如让你来写AOP——Aspect(切面)篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…