目前为止 , 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)");
}
此时 , 错误有值 , 控制台打印如下 :
返回数据类型 ,与要求接收数据类型不一致 , 故自动判断错误