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

embedded/2024/11/22 6:48:37/

在现代 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.ppmy.cn/embedded/139550.html

相关文章

ubuntu, 安装部署comfyui,记录2:下载模型GGuf及测试

0.清除工作流 1.安装manager 2024年最新ComfyUI汉化及manager插件安装详解&#xff01;_comfyui-manager-CSDN博客 ComfyUI Manager安装 转到ComfyUI的安装目录ComfyUI/custom_nodes; 使用git拉取ComfyUI Manager&#xff0c;git clone https://github.com/ltdrdata/Comf…

Java Database Connectivity (JDBC + Servlet)

Java Database Connectivity (JDBC)是一个Java API&#xff0c;用于与数据库进行连接和操作。通过JDBC&#xff0c;Java程序可以与各种关系型数据库进行通信&#xff0c;执行SQL查询、更新数据等操作。 一、Java连接数据库两种方式 ​​​​​ ​​ 二、Java中…

详解Rust结构体struct用法

文章目录 定义和实例化可变性构造函数方法定义特殊结构体输出结构体与C结构体的差异 Rust的结构体(struct)是一种自定义的数据类型&#xff0c;允许开发者命名和包装多个相关的值&#xff0c;以形成有意义的数据组合。在Rust中结构体不仅用于数据组织&#xff0c;还密切结合了R…

摄像机ISP和DSP的区别?

影像处理器是现代数字相机、手机等电子设备中极其重要的一部分&#xff0c;它能够对传感器采集的图像进行多种操作&#xff0c;从而得到更高质量的图像。常见的两种影像处理芯片有ISP&#xff08;Image Signal Processor&#xff09;和DSP&#xff08;Digital Signal Processor…

XviD4PSP视频无损转换器

前言 XviD4PSP 8.1.70 是一款方便、高质量的视频和音频转换程序。全新的版本。它不依赖于系统编解码器和任何系统组件——一切都在里面。不需要安装。它独立于版本 5/6/7/8.0 工作 它能快速、简单地帮你把视频从一种格式转成另一种格式&#xff0c;而且转换后的视频质量一点儿都…

php:使用socket函数创建WebSocket服务

一、前言 闲来无事&#xff0c;最近捣鼓了下websocket&#xff0c;但是不希望安装第三方类库&#xff0c;所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…

web——sqliabs靶场——第八关——sqlmap的使用

第八关还是用到了盲注&#xff0c;我们来使用kali里的sqlmap工具来搞一下。 1.sqlmap简介 sqlmap 是一款开源的自动化 SQL 注入和数据库接管工具&#xff0c;旨在帮助安全研究人员和渗透测试人员检测和利用 SQL 注入漏洞。它支持多种数据库管理系统&#xff08;如 MySQL、Post…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …