Swift网络请求库Alamofire使用详解
时间:2019-03-31
本文章向大家介绍Swift网络请求库Alamofire使用详解,主要包括Swift网络请求库Alamofire使用详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
Alamofire是一个使用Swift开发的网络请求库,其开发团队是AFNetworking的原团队。它语法简洁,采用链式编程的思想,使用起来是相当的舒服。本质是基于NSURLSession进行封装。接下开我们就进入实战,开始学习Alamofire的使用。
GET请求
常用的get请求示例以及请求结果
Alamofire.request("https://httpbin.org/get", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in if(response.error == nil){ LLog("请求成功") LLog(response.result.value) }else{ LLog("请求失败\(String(describing: response.error))") } }
Get请求、有参数、使用Basic Auth授权访问(例如:jira)
var header:HTTPHeaders = [:] if let authorizationHeader = Request.authorizationHeader(user: "xxxx", password: "xxxxxx") { header[authorizationHeader.key] = authorizationHeader.value } // 此处的 URLEncoding.default (URLEncoding.queryString )会将parameters 拼接到url后面 Alamofire.request("https://httpbin.org/get", method: HTTPMethod.get, parameters: ["key":"value"], encoding: URLEncoding.default, headers: header).responseJSON { (response) in if(response.error == nil){ LLog("请求成功") LLog(response.result.value) }else{ LLog("请求失败\(String(describing: response.error))") } }
POST请求 常用的post请求
Alamofire.request("https://httpbin.org/post", method: .post, parameters: ["key1":"value1","key2":"value2"], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in if(response.error == nil){ LLog("请求成功") LLog(response.result.value) }else{ LLog("请求失败\(String(describing: response.error))") } }
post请求,提交json格式的数据
// JSONEncoding.default === JSONEncoding.prettyPrinted Alamofire.request("https://httpbin.org/post", method: .post, parameters: ["key1":"value1","key2":"value2"], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in if(response.error == nil){ LLog("请求成功") LLog(response.result.value) }else{ LLog("请求失败\(String(describing: response.error))") } }
PUT、Delete 请求 参照POST(使用区别不大)
UPLOAD(上传文件)
上传文件示例
let data:Data = UIImageJPEGRepresentation(#imageLiteral(resourceName: "beauty.jpeg"), 0.2)! let url = Bundle.main.url(forResource: "beauty", withExtension: "jpeg"); // 多文件上传 Alamofire.upload(multipartFormData: { (formdata) in formdata.append(data, withName: "file", fileName: "beauty.jpeg", mimeType: "image/jpeg") formdata.append(url!, withName: "file2") }, to: UPLOAD_URL) { (encodingResult) in switch encodingResult{ case .success(let uploadFile, _, _): //上传进度回调 uploadFile.uploadProgress(closure: { (progress) in debugPrint("上传进度\(progress)") }) //上传结果回调 uploadFile.responseString(completionHandler: { (response) in LLog(response.result.value) }) break case .failure( let error): LLog(error); break } }
备注:
想必大家也注意到上面的上传图片的代码,在append data的时候多了一个 filename的参数,在测试的时候,我发现这个参数是必须的,如果你传入的是data数据,但是如果你使用的是fileurl则可以不用这个参数,在alamofire中 会自己获取文件的名。
如果我们在append data的时候,不传入文件名,在上面的代码中 headers中则不会有 filename这个参数,此时使用charles抓包是会发现如下。
上传文件并携带参数
var param: [String:String] = [:]; param["postion"] = "portrait" let url = Bundle.main.url(forResource: "beauty", withExtension: "jpeg"); // 2、多文件上传 Alamofire.upload(multipartFormData: { (formdata) in formdata.append(url!, withName: "file2") //拼接参数 for (key, value) in param { formdata.append(value.data(using: String.Encoding.utf8)!, withName: key) } }, to: UPLOAD_URL) { (encodingResult) in switch encodingResult{ case .success(let uploadFile, _, _): //上传进度回调 uploadFile.uploadProgress(closure: { (progress) in debugPrint("上传进度\(progress)") }) //上传结果回调 uploadFile.responseJSON(completionHandler: { (response) in LLog(response.result.value) }) break case .failure( let error): LLog(error); break } }
备注:在我们的实际开发中,后台有时候并没有配置专门的文件服务器,这个时候我们往往就需要在上传文件的时候,配置必要的参数,来表明我们上传文件资源的目的。
最后
Alamofire真的是一个很好用的网络请求库,同学们,赶紧开始使用吧!
- CTF---编程入门第一题 循环
- Z.ExtensionMethods 一个强大的开源扩展库
- 【干货】神经网络SRU
- AutoMapper 使用实践
- CTF---安全杂项入门第二题 A记录
- PyTorch(总)---PyTorch遇到令人迷人的BUG与记录
- 手把手带你进入TOP20的商超销售预测
- 【干货荟萃】机器学习&深度学习知识资料大全集(二)(论文/教程/代码/书籍/数据/课程等)
- 逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
- 【专知-Java Deeplearning4j深度学习教程06】用卷积神经网络CNN进行图像分类
- 万恶的剪贴板==》为存储而生
- AdaBoost算法(R语言)
- CTF---Web入门第六题 因缺思汀的绕过
- 小案例(六):预测小偷行为(python)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Artwork (Gym - 102346A)【DFS、连通块】
- PAT (Basic Level) Practice (中文)1046 划拳 (15 分)
- PAT (Advanced Level) Practice 1030 Travel Plan (30分)
- PAT (Basic Level) Practice (中文)1050 螺旋矩阵 (25 分)
- PAT (Advanced Level) Practice 1031 Hello World for U (20分)
- PAT (Basic Level) Practice (中文)1051 复数乘法 (15 分)
- 【Java】06 面向对象基本特征
- PAT (Basic Level) Practice (中文)1054 求平均值 (20 分)
- zookeeper集群的搭建
- 【Java】07 常见 API
- 【Java】04 数组
- hadoop分布式格式化时出现异常java.net.unknownhostexception
- 【Java】05 面向对象
- 【Java】08 集合
- PAT (Advanced Level) Practice 1001 A B Format (20 分)