1狸捕、翻開(kāi)Alamofire 源碼潜必,5.0后Alamofire 將 證書驗(yàn)證類放于ServerTrustEvaluation類中
2哈打、在ServerTrustEvaluation 中存在
DefaultTrustEvaluator 默認(rèn)策略瑰排,只有合法證書才能通過(guò)驗(yàn)證
RevocationTrustEvaluator 對(duì)注銷證書做的一種額外設(shè)置
PinnedCertificatesTrustEvaluator 證書驗(yàn)證模式殿托,代表客戶端會(huì)將服務(wù)器返回的證書和本地保存的證書中的 所有內(nèi)容 全部進(jìn)行校驗(yàn)昔穴,如果正確镰官,才繼續(xù)執(zhí)行。
PublicKeysTrustEvaluator 公鑰驗(yàn)證模式吗货,代表客戶端會(huì)將服務(wù)器返回的證書和本地保存的證書中的
DisabledTrustEvalutor 該選項(xiàng)下驗(yàn)證一直都是通過(guò)的泳唠,無(wú)條件信任。
CompositeTrustEvalutor 自定義驗(yàn)證宙搬,需要返回一個(gè)布爾類型的結(jié)果
我的需求是不驗(yàn)證HTTPS證書笨腥,因?yàn)槲覀儧](méi)有申請(qǐng)SSL證書
所以需要對(duì)請(qǐng)求完全信任DisabledTrustEvalutor
接下來(lái)的問(wèn)題是,如何設(shè)置
看Session 類中有一個(gè)serverTrustManager對(duì)象勇垛,但是聲明實(shí)用的是let脖母,也就是不可修改,
那么再看下serverTrustManager對(duì)象里面的evaluators屬性(我們主要網(wǎng)這個(gè)屬性里添加過(guò)濾域名)闲孤,也是let聲明谆级,好吧都不能改
那就自己自定義一個(gè)Session
首先 聲明一個(gè)全局的Session,局部的會(huì)被銷毀,可能會(huì)造成請(qǐng)求取消等問(wèn)題
也就是要能持有Session肥照,一般是在封裝的類中持有它
然后就是關(guān)鍵的設(shè)置了脚仔,上源碼
let learnEvent = LearnEventMonitor()
manager = Session(configuration: URLSessionConfiguration.af.default,serverTrustManager: ServerTrustManager(evaluators: ["user.51cloudtech.com":DisabledTrustEvaluator()]), eventMonitors: [learnEvent])
manager!.request("https://user.51cloudtech.com:7080/api/user_man", method: .post, parameters: parma,encoding:JSONEncoding.default ,headers: ["Content-Type":"application/json"]).responseJSON { respone in
print("ssl one get data \(respone)");
}
由于我需要監(jiān)測(cè)請(qǐng)求情況,所以添加了LearnEventMonitor時(shí)間監(jiān)聽(tīng)舆绎,這個(gè)需要自己添加鲤脏,遵守協(xié)議EventMonitor就行。
需要注意的就是參數(shù)的格式問(wèn)題
5.0后參數(shù)的編碼格式有兩個(gè)類選擇:
1吕朵、ParameterEncoding
2猎醇、ParameterEncoder
相同點(diǎn)
都是在Session中創(chuàng)建Request時(shí)使用
都是用來(lái)把把參數(shù)編碼進(jìn)URLRequest中
都可以決定參數(shù)的編碼位置(url query string、body表單努溃、bodyjson)
UploadRequest因?yàn)椴粠?shù)姑食,所以不會(huì)使用這倆
不同點(diǎn)
初始化參數(shù)不同
ParameterEncoding只能編碼字典數(shù)據(jù), ParameterEncoder用來(lái)編碼任意實(shí)現(xiàn)Encodable協(xié)議的數(shù)據(jù)類型
ParameterEncoding編碼實(shí)現(xiàn)簡(jiǎn)單茅坛,因?yàn)槎际亲值鋽?shù)據(jù)音半,body表單編碼時(shí),只需要先編碼成query string贡蓖,然后utf8轉(zhuǎn)成data丟入body就行曹鸠,ParameterEncoder使用的是一個(gè)自己Alamofire自己實(shí)現(xiàn)的URLEncodedFormEncoder來(lái)進(jìn)行表單數(shù)據(jù)編碼,可以編碼Date斥铺,Data等特殊數(shù)據(jù)
ParameterEncoding只有在創(chuàng)建DataRequest跟DownloadRequest時(shí)使用彻桃,DataStreamRequest無(wú)法使用,而ParameterEncoder這三個(gè)Request子類都能用來(lái)初始化
- ParameterEncoding.URLEncoding默認(rèn)實(shí)現(xiàn)晾蜘,用來(lái)編碼url query string
根據(jù)參數(shù)編碼的位置分為: querystring與form表單兩種, 種類由Destination枚舉控制
若是表單編碼, 請(qǐng)求頭的Content-Type會(huì)被設(shè)置為application/x-www-form-urlencoded; charset=utf-8
數(shù)組與字典通過(guò)遞歸來(lái)全部編碼
因?yàn)闆](méi)有統(tǒng)一規(guī)范規(guī)定如何編碼集合參數(shù), 因此數(shù)組參數(shù)編碼有兩個(gè)選擇, 由ArrayEncoding枚舉控制:, 默認(rèn)帶方括號(hào)
字典參數(shù)編碼使用key跟方括號(hào)subkey跟等號(hào)跟值
Bool值編碼可以選擇使用數(shù)值0,1還是使用字符串true,false, 由BoolEncoding枚舉控制, 默認(rèn)為數(shù)值
栗子:
let urlEncode = URLEncoding(destination: .queryString, arrayEncoding: .noBrackets, boolEncoding: .literal);
manager!.request("your's url", method: .post, parameters: parma,encoding:urlEncode).responseJSON { respone in
print("ssl one get data \(respone)");
}
- ParameterEncoding. JSONEncoding
使用JSONSerialization來(lái)把參數(shù)字典編碼為json, 一定會(huì)被編碼到body中, 并且會(huì)設(shè)置Content-Type為application/json
ParameterEncoder
協(xié)議很簡(jiǎn)單邻眷,也是只有一個(gè)方法,把Parameters類型的參數(shù)編碼進(jìn)URLRequest中剔交,但是要求Parameters類型必須符合Encodable協(xié)議肆饶。
其實(shí)有很多地方類似ParameterEncoding,也是把參數(shù)編碼編碼進(jìn)Request岖常,編碼位置也是可以控制驯镊,但是對(duì)參數(shù)要求不同:
ParameterEncoding要求參數(shù)是字典類型,字典的value是Any的竭鞍,編碼為url query string時(shí)會(huì)直接強(qiáng)制轉(zhuǎn)成String板惑,因此對(duì)于標(biāo)準(zhǔn)類型以外的數(shù)據(jù),編碼出來(lái)的值就會(huì)錯(cuò)誤偎快。編碼為JSON時(shí)冯乘,標(biāo)準(zhǔn)類型以外的數(shù)據(jù),會(huì)導(dǎo)致編碼錯(cuò)誤晒夹,拋出異常
ParameterEncoder要求參數(shù)符合Encodable協(xié)議裆馒,編碼時(shí)使用的是Encoder協(xié)議對(duì)象妖异,編碼為json時(shí),用的是JSONEncoder领追,編碼為url query string時(shí),用的是自己實(shí)現(xiàn)的URLEncodedFormEncoder編碼器
1.JSONParameterEncoder編碼json數(shù)據(jù)
使用系統(tǒng)的JSONEncoder來(lái)編碼數(shù)據(jù)响逢,可以控制json的格式绒窑,ios11以上還支持根據(jù)key來(lái)排序(json字典為無(wú)序)
2.URLEncodedFormParameterEncoder編碼url query string數(shù)據(jù)
url編碼, 使用Destination來(lái)判斷編碼到url query還是body中, 編碼數(shù)據(jù)使用的是URLEncodedFormEncoder類