编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • Android提升进阶

  • iOS开发和进阶

    • README
    • ObjC编程入门

    • Swift编程入门

    • iOS入门到精通

      • iOS入门到精通案例
      • UIKit框架原理探索
      • UIViewController
      • 项目工程面板说明
      • 通信实践和设计思想
      • 网络请求和数据解析
        • 01.网络请求常见库
        • 02.普通GET请求
        • 03.普通POST请求
        • 04.Alamofire请求
        • 05.Json解析实践
        • 06.将json转结构体
        • 10.参考博客说明
      • 多线程实践和原理
      • Swift和OC混编开发
      • Swift版SnapKit布局
      • 开发SDK实践设计
      • iOS经验类笔记积累
  • Web开发和进阶

  • Linux应用开发

  • Apps
  • iOS开发和进阶
  • iOS入门到精通
杨充
2025-02-28
目录

网络请求和数据解析

# 12.Swift版网络请求

# 目录介绍

  • 01.网络请求常见库
  • 02.普通GET请求
  • 03.普通POST请求
  • 04.Alamofire请求
  • 05.Json解析实践
  • 06.将json转结构体
  • 10.参考博客说明

# 01.网络请求常见库

看看在Swift中是在怎样请求数据,解析数据加载图片这些的,也使我们最基本最常见的用法了,先说说这几个三方库:

  1. 第一个: Alamofire Git地址:https://github.com/Alamofire/Alamofire
  2. 第二个: SwiftyJSON 一个解析JSON数据的三方库,使用swift写的,很简便(推荐!) Git地址: https://github.com/SwiftyJSON/SwiftyJSON
  3. 第三个: Kingfisher (一个图片加载的国产库。重点是国产的的支持!) Git地址:https://github.com/onevcat/Kingfisher/releases

# 02.普通GET请求

可以使用URLSession来进行普通的GET请求。以下是一个简单的示例代码,演示如何发送GET请求并处理响应:

  1. 首先创建一个URL对象,指定要发送GET请求的目标URL
  2. 使用URLSession.shared创建一个URLSession对象。
  3. 使用URLSession的dataTask方法创建一个数据任务。在数据任务的回调闭包中,我们可以处理响应数据、错误和HTTP响应状态码。
  4. 回调闭包中,首先检查是否有错误发生。然后,我们检查HTTP响应的状态码,如果状态码为200(表示成功),我们可以解析响应数据。
  5. 最后,调用task.resume()来启动任务。
// 构建URL
let url:URL = URL(string: "https://www.wanandroid.com/article/list/0/json")!
// 发送HTTP请求的的session对象
let session = URLSession.shared
// 构建请求request
var request = URLRequest(url: url)
request.httpMethod = "GET"
// 发一个get请求
let task = session.dataTask(with: request as URLRequest) {(
    data, response, error) in
    guard let data = data, let _:URLResponse = response, error == nil else {
        print("error")
        return
    }
    let dataString =  String(data: data, encoding: String.Encoding.utf8)
    let dict = self.getDictionaryFromJSONString(jsonString: dataString!)
    print("网络请求数据:")
    print(dict);
}
task.resume()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 03.普通POST请求

可以使用URLSession来进行普通的POST请求。以下是一个简单的示例代码,演示如何发送POST请求并处理响应:

  1. 首先创建一个URL对象,指定要发送POST请求的目标URL。然后,我们使用URLSession.shared创建一个URLSession对象。
  2. 创建一个URLRequest对象,并将其httpMethod属性设置为"POST"。我们还可以设置请求头、请求体数据等。
  3. 使用JSONSerialization将参数字典转换为JSON数据,并将其设置为请求的httpBody。
  4. 使用URLSession的dataTask方法创建一个数据任务。在数据任务的回调闭包中,我们可以处理响应数据、错误和HTTP响应状态码。
  5. 在回调闭包中,首先检查是否有错误发生。然后,检查HTTP响应的状态码,如果状态码为200(表示成功),我们可以解析响应数据。
  6. 最后,我们调用task.resume()来启动任务。
// 这里直接使用 jsonString 转成字典,然后转成 Data
// 将 流 放到 request的 httpBody中, 模拟发送一个http请求
let jsonString = "{\"username\":\"yangchong\",\"password\":\"yc123456\"}"
let dict = self.getDictionaryFromJSONString(jsonString: jsonString)
print(dict)
var  jsonData = NSData()
do {
    jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) as NSData
} catch {
    print(error.localizedDescription)
}
// 构建URL
let url:URL = URL(string: "https://www.wanandroid.com/user/login")!
// session
let session = URLSession.shared
// request
var request = URLRequest(url: url)
// 必须指定是post请求方式
request.httpMethod = "POST"
// 设置Content-Length,非必须
request.setValue("\(jsonData.length)", forHTTPHeaderField: "Content-Length")
// 设置 Content-Type 为 json 类型
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// POST    请求将 数据 放置到 请求体中
request.httpBody = jsonData as Data
// 发送请求
let task = session.dataTask(with: request as URLRequest) {(
    data, response, error) in
    guard let data = data, let _:URLResponse = response, error == nil else {
        print("error")
        return
    }
    // 返回值 utf8 转码
    let dataString =  String(data: data, encoding: String.Encoding.utf8)
    // 将 jsonString 转成字典
    let dict = self.getDictionaryFromJSONString(jsonString: dataString!)
    print(dict)
}
task.resume()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 04.Alamofire请求

Alamofire支持4种返回响应处理方式:Data、String、 JSON、自定义类型。

//使用网络库Alamofire做get请求
let url: URL = URL(string: "https://www.wanandroid.com/article/list/0/json")!
//Alamofire支持4种返回响应处理方式:Data、String、 JSON、自定义类型。
//Data示例
AF.request(url).responseData { response in
    switch response.result {
    case let .success(data):
        print("data1:\(String(describing: data))")
    case let .failure(error):
        print(error)
    }
}

//String示例
AF.request(url).responseString { response in
    switch response.result {
    case let .success(data):
        print("data2:\(String(describing: data))")
        DispatchQueue.main.async {
            self.textView.text = "data2:\(String(describing: data))"
        }
    case let .failure(error):
        print(error)
    }
}

//JSON示例
AF.request(url).responseJSON { response in
    switch response.result {
    case let .success(data):
        print("data3:\(String(describing: data))")
    case let .failure(error):
        print(error)
    }
}

//自定义格式示例
struct PersonResponse: Decodable { var name: String,  var nickName : String, var age : Int }
AF.request(url).responseDecodable(of: PersonResponse.self) { response in
    switch response.result {
    case let .success(data):
        print("data:\(String(describing: data))")
    case let .failure(error):
        print(error)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

request请求接口方法,源码中参数含义

  1. 参数一: convertible(可变化)一个可变化的参数。其实就是请求的url地址。
  2. 参数二:method 请求方式。就是我们常说的GET,POST。
  3. 参数三:parameters 请求参数。业务数据的参数部分,如登录模块的userName,Password等之类的业务数据。
  4. 参数四:encoding 编码方式。
  5. 参数五: headers 请求头参数。http请求中请求头的参数设置,支持Json格式,例如设置token,cookie等参数。这个还是根据接口不同来写不同的需求。
  6. 参数六: interceptor 请求拦截器,主要用来在请求流程中拦截请求,并对请求进行一些必要的处理,(没用过)
  7. 参数七:requestModifier 请求修改器。在请求流程中修改数据,例如针对特定请求,不使用默认超时时间,而自定义超时时间

然后来看一个POST请求的案例

let url:URL = URL(string: "https://www.wanandroid.com/user/login")!
let params: [String: Any] = [
    "username": "yangchong",
    "password": "yc123456"
]
AF.request(url,method: .post,parameters: params).responseString { response in
    switch response.result {
    case let .success(data):
        print("data2:\(String(describing: data))")
        DispatchQueue.main.async {
            self.textView.text = "data2:\(String(describing: data))"
        }
    case let .failure(error):
        print(error)
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 05.Json解析实践

要使用SwiftyJSON将JSON字符串解析为结构体,需要先定义一个与JSON数据结构相匹配的结构体。然后,使用SwiftyJSON来解析JSON字符串并将其映射到结构体对象上。

有以下JSON字符串:

{
  "name": "John Doe",
  "age": 30,
  "email": "johndoe@example.com"
}
1
2
3
4
5

定义一个结构体来表示这个JSON数据的结构:

import SwiftyJSON

struct Person {
    let name: String
    let age: Int
    let email: String
    
    init(json: JSON) {
        name = json["name"].stringValue
        age = json["age"].intValue
        email = json["email"].stringValue
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

可以使用SwiftyJSON来解析JSON字符串并将其映射到Person结构体对象上:

let jsonString = """
{
  "name": "打工充",
  "age": 30,
  "email": "yangchong211@163.com"
}
"""

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let json = try JSON(data: jsonData)
        let person = Person(json: json)
        print("Name: \(person.name)")
        print("Age: \(person.age)")
        print("Email: \(person.email)")
        
        DispatchQueue.main.async {
            self.textView.text = person.description
        }
    } catch {
        print("Error parsing JSON: \(error)")
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

如何快速打印结构体全部内容呢,这个时候可以用到CustomStringConvertible协议,如下所示:

extension Person: CustomStringConvertible {
    var description: String {
        let mirror = Mirror(reflecting: self)
        var description = "\(mirror.subjectType) - "
        for (label, value) in mirror.children {
            if let label = label {
                description += "\(label): \(value), "
            }
        }
        // 去除最后一个逗号和空格
        if description.hasSuffix(", ") {
            description = String(description.dropLast(2))
        }
        return description
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 06.将json转结构体

# 10.参考博客说明

  • iOS_Swift_Alamofire实现网络请求:https://blog.csdn.net/weixin_61639290/article/details/131116785
  • swift 使用Alamofire 来封装一个网络请求 原创:https://blog.51cto.com/u_16175520/11947672
上次更新: 2026/06/10, 11:13:41
通信实践和设计思想
多线程实践和原理

← 通信实践和设计思想 多线程实践和原理→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式