LESSON 22 / 576 分钟

URLSession、Codable 与请求状态

一个真实请求至少包含加载、成功、空数据和失败,不只是 decode 成功的那条路径。

用你的前端经验理解

URLSession 类似 fetch;Codable 把数据和 Swift 类型映射。但可编译的模型不意味着服务端永远按这个结构返回。

为什么需要它

网络调用是一条由多个可失败阶段组成的流水线:构造请求、传输、检查 HTTP、解码、映射业务模型、更新状态。URLSession 成功返回 Data,只能说明获得了响应,不代表 HTTP 状态成功,更不代表 JSON 符合你的模型。把这些层分开,错误提示与重试策略才不会混乱。

它是怎样工作的

Codable 按类型结构编解码数据,字段名、可选性与日期策略都必须匹配协议。接口 DTO 可以与页面模型分离,让后台字段变化不直接扩散到 UI。加载状态至少区分等待、成功空数据、成功有数据和失败;刷新已有内容时,也可以保留旧结果并单独显示刷新状态。

把关键概念连起来

1

请求

使用 URLRequest 配置方法、header 和 body;检查 HTTPURLResponse 状态码,再解码响应。

2

解码

Decodable 用于读取,Encodable 用于写出。处理 snake_case、日期格式与可能缺失的字段。

3

状态

支持取消、失败重试和合理超时;取消不一定要作为错误弹给用户。将网络依赖与 UI 分开。

Swift · 示例片段
struct ArticleDTO: Decodable {    let id: String    let title: String}// URLSession 返回后先校验 HTTP 状态,再调用:// let rows = try JSONDecoder().decode([ArticleDTO].self, from: data)
  • 示例只展示数据形状,不省略状态检查的必要性。

用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。

加载阅读列表的失败分层

  1. 先检查 URL 和请求参数,再用 URLSession 等待响应;取消需要按取消处理,不弹出网络故障提示。
  2. 检查 HTTPURLResponse.statusCode。401 进入会话处理,服务器错误允许适当重试,非成功响应不要硬解码成文章列表。
  3. 使用 JSONDecoder 转成 DTO,再映射成领域模型,最后在正确隔离域更新界面。

这里需要你亲自判断

网络成功返回数据不代表 HTTP 业务成功;不要在客户端内嵌服务端私钥。

做一个小练习

用 mock 数据覆盖:成功、空列表、401、500、断网和非法 JSON。

  1. 准备成功列表、空数组、401 和字段类型错误四种固定响应。
  2. 给每种响应规定用户看到的页面,并说明是否应该自动重试。
展开参考思路与验收标准

空数组是成功;401 不是 JSON 解析失败;字段类型不符需要检查接口契约。重试可能重复写操作,因此创建记录等请求必须考虑幂等性。

URLSession 返回 data 后可以直接认为请求成功吗?

继续查阅官方资料
Apple Developer 官方资料

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成