我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【iOS_Swift_Alamofire实现网络请求】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【iOS_Swift_Alamofire实现网络请求】

文章目录

前言

学习swift继续延续之前的思路,对照着OC学,从UI起手,学习到对应的自适应布局。
今天再次学习了swift的原生网络请求和对应的第三方库-Alamofire。

导入库

  • 因为电脑配置原因,学习了一种新的导入第三方库的方法。Swift Package Manager
  • 首先去库的官网的readme文件找到请添加图片描述
  • 复制最下面的Swift Package Manager的url。
  • 到项目的General的framework
    请添加图片描述
  • 请添加图片描述
  • 左下角Add Other Package
  • 请添加图片描述
  • 请添加图片描述
    在右上角输入网址搜索到库,add即可。

原生网络请求

  • 原生的网络请求和OC的思路是一模一样的,创建url,构建请求,发送请求,得到数据即可。
 // 普通的网络请求    func makeLogon() {        // 构建URL        let url:URL = URL(string: "https://news-at.zhihu.com/api/4/news/latest")!        // 发送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("Request Erroor")                return            }            let dataString =  String(data: data, encoding: String.Encoding.utf8)            let dict = self.getDictionaryFromJSONString(jsonString: dataString!)            print(dict)        }        task.resume()    }

这段代码是使用 URLSession 发起 GET 请求,并将返回的数据转换为字典类型。

  1. 首先,通过 session.dataTask(with:completionHandler:) 方法创建一个任务对象,并在闭包中处理请求的结果。

  2. 在闭包中,首先使用可选绑定 guard let 检查请求的返回数据 data 是否存在,以及响应 response 是否存在且是 URLResponse 类型,并检查是否有错误 error。如果其中任何一个条件不满足,就会打印错误信息并返回。

  3. 如果没有错误,我们将返回的数据 data 使用 String(data:encoding:) 方法转换为字符串类型,并存储在 dataString 变量中。

  4. 接下来,调用 getDictionaryFromJSONString(jsonString:) 方法将字符串类型的数据 dataString 转换为字典类型。

  5. 最后,打印转换后的字典 dict

getDictionaryFromJSONString(jsonString:) 是一个自定义的方法,用于将 JSON 字符串转换为字典类型。

  • 因为请求的数据不是字典类型的,我们需要为它写一个转字典的方法。
 func getDictionaryFromJSONString(jsonString: String) -> NSDictionary {        // 将传入的 JSON 字符串 jsonString 使用 data(using:) 方法转换为 Data 类型        let jsonData:Data = jsonString.data(using: .utf8)!        // 通过 JSONSerialization.jsonObject(with:options:) 方法将 jsonData 进行 JSON 解析,并将解析结果存储在 dict 变量中。这里使用的选项是 .mutableContainers,表示可以修改容器对象        let dict = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)        // 使用条件语句判断 dict 是否为 nil。如果不为 nil,表示 JSON 解析成功,将 dict 强制转换为 NSDictionary 类型,并返回。      //   如果 dict 为 nil,表示 JSON 解析失败,返回一个空的 NSDictionary 对象。        if dict != nil {            return dict as! NSDictionary        }        return NSDictionary()    }    

请添加图片描述

单例封装一个原生网络请求

这里还是以get请求为例,请求一下知乎日报的接口

  • 创建单例类
    请添加图片描述
  • 初始化
static let shareSingenal = Mananger()

构建函数,发送请求

这里用到了swift的闭包来写succeed或者failure的回调。

用到了if let 语法:很安全

  func getWithPath(path: String,paras: Dictionary<String,Any>?,success: @escaping ((_ result: Any) -> ()),failure: @escaping ((_ error: Error) -> ())) {//            var i = 0            let address = path            // 首先,定义了变量 i 和 address,用于拼接完整的 URL 地址。//            if let paras = paras {//                for (key,value) in paras {//                    if i == 0 {//                        address += "?\(key)=\(value)"//                    }else {//                        address += "&\(key)=\(value)"//                    }//                    i += 1//                }//            }            // 完成参数拼接后,通过 URL(string:) 方法将拼接后的 address 转换为 URL 对象。            let url = URL(string: address.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)                        // 使用 URLSession.shared 创建一个共享的会话对象,并通过 dataTask(with:completionHandler:) 方法发起网络请求。            let session = URLSession.shared            let dataTask = session.dataTask(with: url!) { (data, respond, error) in                if let data = data {                    // 在网络请求的回调闭包中,首先判断返回的数据 data 是否存在。如果存在,则通过 JSONSerialization.jsonObject(with:options:) 方法将数据进行 JSON 解析,并将解析结果传递给成功回调闭包 success。                    if let result = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){                        success(result)                    }                }else {                    // 如果数据不存在,即请求失败,将错误信息 error 传递给失败回调闭包 failure。                    failure(error!)                }            }            // 通过调用 dataTask.resume() 方法开始执行网络请求。            dataTask.resume()        }}

Alamofire

  • Alamofire是使用Swift语言开发的网络库,它和AFNetworking很像
  • Alamofire使用链式编程实现的。具有简洁的语法,良好的性能和优秀的可读性等特点。
  • Alamofire,本质上是基于NSURLSession进行封装的,其核心是URLSessionURLSessionTask子类。其早期版本使用Alamofire.request(),5.0之后使用AF.request()。

本质上第三方库是为了减轻我们的压力,缩减了请求过程的代码。

用法

最基础的就是发送一个GET请求

 func sendReqWithAlamofire() -> Void {   let url: URL = URL(string: "https://news-at.zhihu.com/api/4/news/latest")!     AF.request(url).response { response in            switch response.result {            case let .success(data):                print("data:\(String(describing: data))")            case let .failure(error):                print(error)            }     }}

能看出来,已经帮我们封装好了succeed和failure的回调。

这里需要注意,打印上述data。请添加图片描述

  • Alamofire 中,responsedata 属性是一个可选类型 Data?。因此,打印结果中显示的 Optional 表示该值是可选的。而 3643 bytes 表示返回的数据的字节数,这个值会根据实际返回的数据大小而变化。
  • 下面说如何转字典

针对AF的request请求接口,Alamofire封装了三个同名接口,三个接口是针对不同的参数进行设置的。

open func request(_ convertible: URLConvertible,                      method: HTTPMethod = .get,                      parameters: Parameters? = nil,                      encoding: ParameterEncoding = URLEncoding.default,                      headers: HTTPHeaders? = nil,                      interceptor: RequestInterceptor? = nil,                      requestModifier: RequestModifier? = nil) open func request<Parameters: Encodable>(_ convertible: URLConvertible,                 method: HTTPMethod = .get,                 parameters: Parameters? = nil,                 encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,                 headers: HTTPHeaders? = nil,                 interceptor: RequestInterceptor? = nil,                 requestModifier: RequestModifier? = nil) open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil)

参数一: convertible(可变化)一个可变化的参数。其实就是请求的url地址。
参数二:method 请求方式。就是我们常说的GET,POST。
参数三:parameters 请求参数。业务数据的参数部分,如登录模块的userNamePassword等之类的业务数据。
参数四:encoding 编码方式。Alamofire支持两种编码方式:

  • JSONParameterEncoder和- URLEncodedFormParameterEncoder若encoding设置为JSONEncoding, 即为JSON格式。

参数五: headers 请求头参数。http请求中请求头的参数设置,支持Json格式,例如设置tokencookie等参数。这个还是根据接口不同来写不同的需求。
参数六: interceptor 请求拦截器,主要用来在请求流程中拦截请求,并对请求进行一些必要的处理,(没用过)
参数七:requestModifier 请求修改器。在请求流程中修改数据,例如针对特定请求,不使用默认超时时间,而自定义超时时间

Alamofire的返回响应

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

  let url: URL = URL(string: "https://news-at.zhihu.com/api/4/news/latest")!//Data示例AF.request(url).responseData { response in    switch response.result {   case let .success(data):       print("data:\(String(describing: data))")   case let .failure(error):       print(error)  }} //String示例AF.request(url).responseString { response in    switch response.result {   case let .success(data):       print("data:\(String(describing: data))")   case let .failure(error):       print(error)  }} //JSON示例AF.request(url).responseJSON { response in    switch response.result {   case let .success(data):       print("data:\(String(describing: data))")   case let .failure(error):       print(error)  }} //自定义格式示例struct PersonResponse: Decodable { let name: String,  let nickName : String, let 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)  }}

将返回的data转为字典/字符串

语言的安全性很强,还是先使用了if let结构,也是在succeed的回调里面使用的

  func sendReqWithAlamofire() -> Void {            let url: URL = URL(string: "https://news-at.zhihu.com/api/4/news/latest")!            AF.request(url).response { response in                    switch response.result {                      // 涉及到了语言的安全性                    case let .success(data):                        print("Successd get ReqWithAla")                        print(data as Any)                       //  转字符串                        if let responseData = data {let dataString = String(data: responseData, encoding: .utf8)print("data: \(String(describing: dataString))")                        }//                        print("data:\(String(describing: data))")                        // 转字典                        if let responseData = data {do {    // 首先使用可选绑定 if let 检查 data 是否存在。如果 data 存在,我们尝试使用 JSONSerialization.jsonObject(with:options:) 方法将数据解析为字典类型。    if let jsonToDict = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] {        // 使用转换后的字典进行进一步操作        print("data: \(jsonToDict)")    }} catch {    // 解析失败,会抛出异常,我们可以使用 catch 块来捕获异常并进行相应的错误处理。    print("Failed to parse JSON: \(error)")}                        }                    case let .failure(error):                        print(error)                    }             }                    }}

总结

和AFN库一样使用起来简单快捷,swift的语言特性安全在很多处都会体现,接下来会学习swift的原声json Model解析库。

来源地址:https://blog.csdn.net/weixin_61639290/article/details/131116785

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【iOS_Swift_Alamofire实现网络请求】

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP如何实现网络请求

这篇“PHP如何实现网络请求”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“PHP如何实现网络请求”文章吧。一、分析php发送
2023-07-02

Android实现网络请求方法

Android网络请求(1) ​ 安卓开发网络请求可谓是安卓开发的灵魂,如果你不会网络请求,那么你开发的应用软件就是一具没有灵魂的枯骨。 ​ 在安卓开发中进行网络请求和java中的网络请求有异曲同工之妙,但是安卓软件毕竟的安装在我们手机上的
2023-08-19

shell中的curl网络请求的实现

目录一、curl的作用:二、实例三、相关链接shell中的curl网络请求的实现curl 是利用URL语法在命令行下工作的文件传输工具,1997年首次发行,支持文件上传和下载,结合shell脚本体验更棒。但按照传统习惯称 curl 为下载工
2022-06-05

Android HTTP网络请求的异步实现

前言 大家都知道网络操作的响应时间是不定的,所有的网络操作都应该放在一个异步操作中处理,而且为了模块解耦,我们希望网络操作由专门的类来处理。所有网络数据发送,数据接收都有某几个类来实现,外部其它模块只要调用和处理回调函数即可。外部模块和网络
2022-06-06

vue网络请求方案原生网络请求和js网络请求库的示例分析

这篇文章主要介绍vue网络请求方案原生网络请求和js网络请求库的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、 原生网络请求1. XMLHttpRequest(w3c标准) // 没有promise时
2023-06-21

python包中的urllib网络请求怎么实现

这篇文章主要讲解了“python包中的urllib网络请求怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python包中的urllib网络请求怎么实现”吧!一、简介是一个 pytho
2023-06-30

JS实现网络请求的方式有哪些

这篇文章将为大家详细讲解有关JS实现网络请求的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景为了应对越来越多的测试需求,减少重复性的工作,有道智能硬件测试组基于 electron 开发了一系
2023-06-29

微信小程序怎么实现网络请求

这篇文章主要介绍“微信小程序怎么实现网络请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么实现网络请求”文章能帮助大家解决问题。最近微信小程序开始开放测试了,小程序提供了很多api,极
2023-06-26

Android网络请求之OkHttp

OkHttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCanary)。用于替代HttpUrlConnection和Ap
2022-06-06

nodejs 异步网络请求

Node.js是一个基于Chrome V8引擎构建的JavaScript运行时环境,可以在服务器端使用JavaScript编写程序,支持异步I/O操作,适合于构建高并发、低延迟的网络应用程序。在使用Node.js开发网络应用程序时,使用异步网络请求是非常重要的一个技术点。本文将介绍Node.js中异步网络请求的相关知识和实现方式。一、什么是异步网络请求在介绍异步网络请求之前,先
2023-05-18

使用Flutter怎么实现一个Http网络请求

这期内容当中小编将会给大家带来有关使用Flutter怎么实现一个Http网络请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. Http的请求方式简介Http网络请求方式就是描述了客户端想对指定的资源
2023-06-14

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录