當前位置:成語大全網 - 新華字典 - Alamofire 5.4.4 HTTPS 證書驗證過濾及參數格式說明

Alamofire 5.4.4 HTTPS 證書驗證過濾及參數格式說明

1、翻開Alamofire 源碼,5.0後Alamofire 將 證書驗證類放於ServerTrustEvaluation類中

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類

本文參考鏈接