Alamofire 5.4.4 HTTPS 證書驗(yàn)證過(guò)濾及參數(shù)格式說(shuō)明

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)初始化

  1. 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)");
        }
  1. 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類

本文參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舔亭,隨后出現(xiàn)的幾起案子些膨,更是在濱河造成了極大的恐慌,老刑警劉巖钦铺,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件订雾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡矛洞,警方通過(guò)查閱死者的電腦和手機(jī)洼哎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沼本,“玉大人噩峦,你說(shuō)我怎么就攤上這事〕檎祝” “怎么了识补?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)辫红。 經(jīng)常有香客問(wèn)我凭涂,道長(zhǎng),這世上最難降的妖魔是什么贴妻? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任切油,我火速辦了婚禮,結(jié)果婚禮上名惩,老公的妹妹穿的比我還像新娘白翻。我一直安慰自己,他們只是感情好绢片,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布滤馍。 她就那樣靜靜地躺著,像睡著了一般底循。 火紅的嫁衣襯著肌膚如雪巢株。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天熙涤,我揣著相機(jī)與錄音阁苞,去河邊找鬼困檩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛那槽,可吹牛的內(nèi)容都是我干的悼沿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骚灸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糟趾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起甚牲,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤义郑,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后丈钙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體非驮,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年雏赦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劫笙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡星岗,死狀恐怖邀摆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伍茄,我是刑警寧澤栋盹,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站敷矫,受9級(jí)特大地震影響例获,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曹仗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一榨汤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怎茫,春花似錦收壕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祥山,卻和暖如春圃验,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缝呕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工澳窑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斧散,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓摊聋,卻偏偏與公主長(zhǎng)得像鸡捐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子麻裁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容