2、在ServerTrustEvaluation 中存在
DefaultTrustEvaluator 默認策略,只有合法證書才能通過驗證
RevocationTrustEvaluator 對註銷證書做的壹種額外設置
PinnedCertificatesTrustEvaluator 證書驗證模式,代表客戶端會將服務器返回的證書和本地保存的證書中的 所有內容 全部進行校驗,如果正確,才繼續執行。
PublicKeysTrustEvaluator 公鑰驗證模式,代表客戶端會將服務器返回的證書和本地保存的證書中的
DisabledTrustEvalutor 該選項下驗證壹直都是通過的,無條件信任。
CompositeTrustEvalutor 自定義驗證,需要返回壹個布爾類型的結果
我的需求是不驗證HTTPS證書,因為我們沒有申請SSL證書
所以需要對請求完全信任DisabledTrustEvalutor
接下來的問題是,如何設置
看Session 類中有壹個serverTrustManager對象,但是聲明實用的是let,也就是不可修改,
那麽再看下serverTrustManager對象裏面的evaluators屬性(我們主要網這個屬性裏添加過濾域名),也是let聲明,好吧都不能改
那就自己自定義壹個Session
首先 聲明壹個全局的Session,局部的會被銷毀,可能會造成請求取消等問題
也就是要能持有Session,壹般是在封裝的類中持有它
然後就是關鍵的設置了,上源碼
由於我需要監測請求情況,所以添加了LearnEventMonitor時間監聽,這個需要自己添加,遵守協議EventMonitor就行。
需要註意的就是參數的格式問題
5.0後參數的編碼格式有兩個類選擇:
1、ParameterEncoding
2、ParameterEncoder
相同點
都是在Session中創建Request時使用
都是用來把把參數編碼進URLRequest中
都可以決定參數的編碼位置(url query string、body表單、bodyjson)
UploadRequest因為不帶參數,所以不會使用這倆
不同點
初始化參數不同
ParameterEncoding只能編碼字典數據, ParameterEncoder用來編碼任意實現Encodable協議的數據類型
ParameterEncoding編碼實現簡單,因為都是字典數據,body表單編碼時,只需要先編碼成query string,然後utf8轉成data丟入body就行,ParameterEncoder使用的是壹個自己Alamofire自己實現的URLEncodedFormEncoder來進行表單數據編碼,可以編碼Date,Data等特殊數據
ParameterEncoding只有在創建DataRequest跟DownloadRequest時使用,DataStreamRequest無法使用,而ParameterEncoder這三個Request子類都能用來初始化
ParameterEncoder
協議很簡單,也是只有壹個方法,把Parameters類型的參數編碼進URLRequest中,但是要求Parameters類型必須符合Encodable協議。
其實有很多地方類似ParameterEncoding,也是把參數編碼編碼進Request,編碼位置也是可以控制,但是對參數要求不同:
ParameterEncoding要求參數是字典類型,字典的value是Any的,編碼為url query string時會直接強制轉成String,因此對於標準類型以外的數據,編碼出來的值就會錯誤。編碼為JSON時,標準類型以外的數據,會導致編碼錯誤,拋出異常
ParameterEncoder要求參數符合Encodable協議,編碼時使用的是Encoder協議對象,編碼為json時,用的是JSONEncoder,編碼為url query string時,用的是自己實現的URLEncodedFormEncoder編碼器
1.JSONParameterEncoder編碼json數據
使用系統的JSONEncoder來編碼數據,可以控制json的格式,ios11以上還支持根據key來排序(json字典為無序)
2.URLEncodedFormParameterEncoder編碼url query string數據
url編碼, 使用Destination來判斷編碼到url query還是body中, 編碼數據使用的是URLEncodedFormEncoder類
本文參考鏈接