Swift学习记录 - Alamofire 4.0.1网络库基本使用(持续更新...)

来源:互联网 发布:二叉树的反转Java 编辑:程序博客网 时间:2024/06/05 16:49

目前为止 , Alamofire网络库已经更新到4.0.1 , swift也逐渐趋于稳定 , 最近有空都是在学习swift方面的东西 . 这里主要写一些项目中 , 比较实用的网络请求 , 比较少用的 和最基础的就不写啦 …


大概请求参数介绍 :

requestHeader : 请求头
parameters : 传递参数
method : 请求类型
URL : 请求地址
encoding : 编码
responseJSON : 期待解析的数据类型 , 通常咱们用到的就是JSON数据 , 其他类型暂不介绍
response : 返回数据 可以自定义设置回调的线程, 默认主线程 , 和JSON解析相关的设置 , 这个百度即可.


//这是一个参数比较完整的GET请求 , 但是实质上 , 有几个参数我们是比较少用到的.        let requestHeader:HTTPHeaders = ["Range":"1-3"];        let para = ["userName":"coderMy",        "password":"12345"];        let mainQueue = DispatchQueue.main;        Alamofire.request("https://www.baidu.com",         method: .get, parameters: para,          encoding: URLEncoding.default, headers: requestHeader).responseJSON(queue:mainQueue, options: .allowFragments) { (response) in         print(response)        }

上述的request()的参数 , 为自选

也就是说平时用得比较多的 ,


GET 请求

        //method可省略 , 默认请求方式为GET         Alamofire.request("https://www.baidu.com",         method: .get).responseJSON { (response) in            Print("---------------------------\(response)")        }


POST请求

        let para = ["userName":"coderMy",        "password":"12345"];        Alamofire.request("https://www.baidu.com/login",         method: .post, parameters: para).responseJSON { (response) in            print(response)    }


设置请求头

添加请求头 , 有的时候我们会和服务器协商使用请求头 , 来保证我数据的可靠性或者使用请求头传递一些信息 , 比如我要请求什么数据等等 ..

        let para = ["userName":"coderMy",        "password":"12345"];        //请求头        let requestHeader:HTTPHeaders = ["Range":"1-3",        "Content-Type":"allication/json"];        //将requestHeader 添加进request参数中        Alamofire.request("https://www.baidu.com",        method: .post, parameters: para,         headers: requestHeader).responseJSON { (response) in              print(response)      }


设置请求超时时间 (请求的另一种方式 , 如不设置超时时间 , 和上述GET,POST请求效果一致)

Alamofire的默认超时时间为30S ,如果我们想要更短或者更长 , 则需要自己设置 . 而这种请求方式和上述的写法有些许改变 , 和AFNetworking更相似 . 值得注意的是 , manager一定要对其强引用 , 就跟OC的一样 , 如果不设置成属性 , 则通常会报 code = -999

//设置manager属性 (重要)var manger:SessionManager? = nil//配置 , 通常默认即可        let config:URLSessionConfiguration = URLSessionConfiguration.default        //设置超时时间为15S        config.timeoutIntervalForRequest = 15        //根据config创建manager        manger = SessionManager(configuration: config)        //这里和上述大致相同        manger?.request("https://www.baidu.com", method: .get).response { (response) in            print("-----------------\(response)")        }


Alamofire请求返回结果状态判断

有时候 , 比如我们访问一个服务器 , 访问成功 ,但是却没有得到我们想得到的结果 , 比如本应返回JSON数据 , 却返回了意料之外的数据 , 但是code 依然为 200 . 这时候就需要 validate 来帮我们更加细化的处理这些事了 . 这里我们还是以 Alamofire.request 这种请求方式来书写 , 使用manager 写法 , 参照上述超时写法即可 …

validate 返回状态验证 , 分两种 , 手动验证 和 自动验证 .

1 . 手动验证

此时假如我们需要的结果是: 状态码在200 -300之间 , 返回的数据为JSON类型 , 代码如下

// 第一个validate验证访问状态   第二个validate 验证返回数据类型        Alamofire.request("https://www.baidu.com",         method: .get)        .validate(statusCode:200..<300)        .validate(contentType: ["application/json"])        .responseJSON { (response) in            switch response.result {                //访问成功,且数据是我们想要的类型            case .success:                print("--------------------是我想要的结果")                //访问失败 , 状态码不对或者数据类型不对            case .failure:                print("xxxxxxxxxxxxxxxxxxx\(response.result.error.debugDescription)")                print("--------------------不是我想要的结果")            }        }

这里 , 我们访问的是百度的地址 , 然后返回的类型为 test/html , 而我们需要的是JSON . 打印错误信息 , 控制台输出如下
这里写图片描述



2 . 自动验证

1 . 不设置请求头自动验证 :
如果不设置请求头进行自动验证 , 则只会自动判断返回code是否在200…299之间 , 并不会加以判断返回的数据类型 , 如下

        Alamofire.request("https://www.baidu.com",method:.get)            .validate().response { (response) in            print("-----------------------\(response.error?.localizedDescription)");        }

输出错误为空 , 说明验证通过


2 . 设置请求头 , 进行自动验证

//设置请求头 ,接收类型为json数据        let headers:HTTPHeaders = ["Accept": "application/json"]        Alamofire.request("https://www.baidu.com",method:.get ,headers:headers)            .validate().response { (response) in            print("-----------------------\(response.error?.localizedDescription)");        }

此时 , 错误有值 , 控制台打印如下 :
这里写图片描述

返回数据类型 ,与要求接收数据类型不一致 , 故自动判断错误

2 0
原创粉丝点击