当前位置: 首页 > news >正文

Alamofire常见GET/POST等请求方式的使用,响应直接为json

Alamofire

官方仓库地址:https://github.com/Alamofire/Alamofire

xcode中安装和使用:swift网络库Alamofire的安装及简单使用,苹果开发必备-CSDN博客

Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作,提供了更简单、更易用的接口,大大简化了网络请求代码的编写。Alamofire提供了一套优雅且易于理解的API,使得开发者可以轻松发起各种类型的HTTP请求。它支持GET、POST、PUT、DELETE等常用的请求方法,并且提供了丰富的参数设置选项。Alamofire提供了强大的响应处理功能,支持数据解析、文件上传和下载等常见需求。它基于Swift的特性和语法,代码简洁、可读性强,易于维护和扩展。

GET请求

get请求是最常见的一种请求方式了,默认AF.request发送的就是get请求,代码示例:

    // get请求func getData() {print("发送get请求")// 准备一个urllet url = "https://github.com/xiaoyouxinqing/PostDemo/raw/master/PostDemo/Resources/PostListData_hot_1.json"// 使用Alamofile发起请求,默认是GETAF.request(url).responseData(completionHandler: { res in// response.result为枚举类型,所以需要使用switchswitch res.result {case let .success(Data):// 将Data类型的数据转为Json字符串let jsonString = try? JSONSerialization.jsonObject(with: Data)// 打印json字符串print("success\(String(describing: jsonString))")case let .failure(error):print("error\(error)")}// print("响应数据:\(res.result)")})}

POST请求

发送post请求要带上method参数,设置为.post,携带的参数放parameters里面,如果想让返回的数据直接是json格式的,可以使用.responseJSON,代码示例:

    // post请求func postData() {print("发送post请求")let urlStr = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"// payload 数据let payload = ["name": "hibo", "password": "123456"]AF.request(urlStr, method: .post, parameters: payload).responseJSON { response inswitch response.result {case let .success(json):print("post response: \(json)")case let .failure(error):print("error:\(error)")}}}

其他的put/delete等请求和post一样,只是参数不一样而已:

 

post等请求参数解析: <Parameter:Encodable>

只要参数遵循Encodable协议,那么最终ParameterEncoder都会把Parameter encode成需要的数据类型

举个例子

struct Login: Encodable {let email:Stringlet password:String
}let login = Login(email: "aaa", password: "bbb")
AF.request("https://httpbin.org/post",method: .post,parameters: login,encoder: JSONParameterEncoder.default).response { response indebugPrint(response)
}

Headers请求头设置 

设置请求头有三种方式

1.无参构造 

/// 1. 无参构造
public init() {}/// 通过以下方式添加值
func add(name: String, value: String)
func add(_ header: HTTPHeader)

2.通过 HTTPHeader 数组构造

/// 2. 通过 HTTPHeader 数组构造
public init(_ headers: [HTTPHeader])let headers: HTTPHeaders = [HTTPHeader(name: "Authorization", value: "Basic VXNlcm5hbWU6UGFzc3dvcmQ="),HTTPHeader(name: "Accept", value: "application/json")
]AF.request("https://httpbin.org/headers", headers: headers).responseJSON { response indebugPrint(response)
}

3.通过key/value 构造 

/// 3. 通过key/value 构造
public init(_ dictionary: [String: String])let headers: HTTPHeaders = ["Authorization": "Basic VXNlcm5hbWU6UGFzc3dvcmQ=","Accept": "application/json"
]AF.request("https://httpbin.org/headers", headers: headers).responseJSON { response indebugPrint(response)
}

响应处理

1.Alamofire 提供了4种 Response序列化工具,DataResponseSerializer 解析为Data

// Response Handler - Unserialized Response
func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse<Data?>) -> Void) -> Self// Response Data Handler - Serialized into Data
func responseData(queue: DispatchQueue = .main,dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,completionHandler: @escaping (AFDataResponse<Data>) -> Void) -> Self//示例
AF.request("https://httpbin.org/get").responseData { response indebugPrint("Response: \(response)")
}

2.StringResponseSerializer 解析为String

// Response String Handler - Serialized into String
func responseString(queue: DispatchQueue = .main,dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,encoding: String.Encoding? = nil,emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,completionHandler: @escaping (AFDataResponse<String>) -> Void) -> Self//示例
AF.request("https://httpbin.org/get").responseString { response indebugPrint("Response: \(response)")
}

3.JSONResponseSerializer 解析为JSON

// Response JSON Handler - Serialized into Any Using JSONSerialization
func responseJSON(queue: DispatchQueue = .main,dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,options: JSONSerialization.ReadingOptions = .allowFragments,completionHandler: @escaping (AFDataResponse<Any>) -> Void) -> Self
//示例
AF.request("https://httpbin.org/get").responseJSON { response indebugPrint("Response: \(response)")
}

下载文件

1.下载Data

AF.download("https://httpbin.org/image/png").responseData { response inif let data = response.value {let image = UIImage(data: data)}
}

2.下载到指定目录

let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
AF.download("https://httpbin.org/image/png", to: destination).response { response indebugPrint(response)if response.error == nil, let imagePath = response.fileURL?.path {let image = UIImage(contentsOfFile: imagePath)}
}

3.下载进度

AF.download("https://httpbin.org/image/png").downloadProgress { progress inprint("Download Progress: \(progress.fractionCompleted)")}.responseData { response inif let data = response.value {let image = UIImage(data: data)}}

4.恢复下载

var resumeData: Data!let download = AF.download("https://httpbin.org/image/png").responseData { response inif let data = response.value {let image = UIImage(data: data)}
}// download.cancel(producingResumeData: true) // Makes resumeData available in response only.
download.cancel { data inresumeData = data
}AF.download(resumingWith: resumeData).responseData { response inif let data = response.value {let image = UIImage(data: data)}
}

上传文件

1.上传 Data

let data = Data("data".utf8)AF.upload(data, to: "https://httpbin.org/post").responseDecodable(of: HTTPBinResponse.self) { response indebugPrint(response)
}

2.上传文件

let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")AF.upload(fileURL, to: "https://httpbin.org/post").responseDecodable(of: HTTPBinResponse.self) { response indebugPrint(response)
}

3.上传 Multipart Data

AF.upload(multipartFormData: { multipartFormData inmultipartFormData.append(Data("one".utf8), withName: "one")multipartFormData.append(Data("two".utf8), withName: "two")
}, to: "https://httpbin.org/post").responseDecodable(of: HTTPBinResponse.self) { response indebugPrint(response)}

4.上传进度

let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")AF.upload(fileURL, to: "https://httpbin.org/post").uploadProgress { progress inprint("Upload Progress: \(progress.fractionCompleted)")}.responseDecodable(of: HTTPBinResponse.self) { response indebugPrint(response)}

相关文章:

  • HQL面试题练习 —— 取出累计值与1000差值最小的记录
  • 链表经典题目—相交链表和链表倒数第k个节点
  • 基于香橙派 Ai Pro的ROS Qt人机交互软件部署指南
  • 漫步者x1穷鬼耳机双耳断连
  • idea配置ssh、sftp连接服务器,docker插件使用,极其方便,无需再开第三方软件去操作服务器了,集成用于Idea一体
  • 【Java继承】(超级详细!!!)
  • 【pm2 - sdk 集成到程序中,典型用法】
  • 堆结构知识点复习——玩转堆结构
  • 当HR问你是否单身时,该怎么回答?
  • 高德地图之获取经纬度并且根据获取经纬度渲染到路线规划
  • Upstream最新发布2024年汽车网络安全报告-百度网盘下载
  • Unity 生成物体的几种方式
  • C数据结构:二叉树
  • 信号量和事件及队列补充
  • Linux-Web服务搭建面试题-1
  • 「面试题」如何实现一个圣杯布局?
  • 「译」Node.js Streams 基础
  • Fundebug计费标准解释:事件数是如何定义的?
  • gitlab-ci配置详解(一)
  • KMP算法及优化
  • Linux各目录及每个目录的详细介绍
  • mongodb--安装和初步使用教程
  • MySQL主从复制读写分离及奇怪的问题
  • supervisor 永不挂掉的进程 安装以及使用
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 记一次用 NodeJs 实现模拟登录的思路
  • 三分钟教你同步 Visual Studio Code 设置
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 我的业余项目总结
  • 怎样选择前端框架
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • scrapy中间件源码分析及常用中间件大全
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Java NIO(一)FileChannel
  • (20050108)又读《平凡的世界》
  • (java)关于Thread的挂起和恢复
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (学习日记)2024.01.09
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转) ns2/nam与nam实现相关的文件
  • (转)Oracle存储过程编写经验和优化措施
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET Core 中的路径问题
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • [12] 使用 CUDA 加速排序算法
  • [Algorithm][动态规划][简单多状态DP问题][按摩师][打家劫舍Ⅱ][删除并获得点数][粉刷房子]详细讲解
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C++] vector list 等容器的迭代器失效问题
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [gdc19]《战神4》中的全局光照技术
  • [iOS开发]iOS中TabBar中间按钮凸起的实现