基礎(chǔ)的HTTPClient搭建注意事項(xiàng)(上)

項(xiàng)目背景

我司的自動(dòng)化測(cè)試框架基本搭好,等待Web的接口測(cè)試自動(dòng)化

要求

最基本的傳、出參、獲取Cookie和參數(shù)替換

注意

作者的HTTPClient功底不算強(qiáng),看到有些地方不對(duì)或者我沒(méi)有完全理解函數(shù)用法的話,請(qǐng)指出、并附上您的見(jiàn)解最好。寫(xiě)這篇文章。一是鞏固知識(shí)、二是拋磚引玉,希望大家交流一下HTTPClient的知識(shí)。


項(xiàng)目是Spring Boot搭建的,基本的添加HttpClient依賴就不說(shuō)了。原來(lái)是添加了HttpMime的,后來(lái)發(fā)現(xiàn)通過(guò)自定義HttpClient操作就行,于是棄用了。

結(jié)構(gòu)圖大致如下:


結(jié)構(gòu)圖V1.0

execute是作為service層的Impl。目的是執(zhí)行API接口請(qǐng)求。是該類唯一的Public函數(shù)

executeEncapsulation是作為請(qǐng)求的封裝,封裝了請(qǐng)求所需的全部操作

replaceBodyParams為參數(shù)替換

init為參數(shù)校驗(yàn)

checkParams為校驗(yàn)基本請(qǐng)求參數(shù)

getSessionId為獲取獲取用戶sessionId

executeHttpRequest為構(gòu)造請(qǐng)求

switchType為實(shí)例化HttpClient

createSSLConnect為創(chuàng)建SSL安全連接

defaultHeader為構(gòu)建默認(rèn)請(qǐng)求頭

setReplaceMap為處理Response獲取響應(yīng)對(duì)象中部分參數(shù)的值

checkFormat為解析Response


類中用到的靜態(tài)變量:

private static CloseableHttpClient client;

private static HttpClientContext context;

private static HashMap ReplaceMap;


入?yún)⑹亲远x了一個(gè)DO。這個(gè)根據(jù)各位需求,自己創(chuàng)建就行,不過(guò)該項(xiàng)目有些邏輯判斷是根據(jù)DO參數(shù)的有無(wú)進(jìn)行判斷


半夜碼字有點(diǎn)思緒混亂,就先說(shuō)下為什么用到這個(gè)結(jié)構(gòu)和靜態(tài)變量

execute作為類中唯一對(duì)外開(kāi)放的接口,實(shí)現(xiàn)了請(qǐng)求的對(duì)象化

executeEncapsulation作為請(qǐng)求的封裝,有人會(huì)問(wèn)execute不是請(qǐng)求的對(duì)象么?干嘛又要封裝一層呢?這樣做不是違背了對(duì)象化概念么?素質(zhì)三連,就問(wèn)你怕不怕,是這樣的:因?yàn)轫?xiàng)目需要我能支持HTTP接口的組合測(cè)試,而某些接口需要用戶先登陸,所以getSessionId函數(shù)應(yīng)運(yùn)而生,由于用戶先要登陸成功,才能獲取到Cookie,所以相當(dāng)于完成了一次成功的請(qǐng)求,那么按照對(duì)象的概念,就應(yīng)該返回結(jié)果了,但實(shí)際的用例還沒(méi)跑呢

replaceBodyParams不用說(shuō),這個(gè)大家都應(yīng)該寫(xiě)過(guò)類似的。其中我用到了ReplaceMap,要注意的是ReplaceMap可能取值為空,函數(shù)是不會(huì)報(bào)錯(cuò)的,所以這里加了個(gè)校驗(yàn)

initcheckParams這兩個(gè)函數(shù)其實(shí)可寫(xiě)可不寫(xiě),全看數(shù)據(jù)是否規(guī)范以及你是不會(huì)是有強(qiáng)迫癥。不值得一提的是,我在這里做了對(duì)請(qǐng)求類型、參數(shù)類型的檢驗(yàn)以及如果沒(méi)有參數(shù)類型,則參數(shù)類型默認(rèn)設(shè)置為Srting

getSessionId這個(gè)好像也沒(méi)什么好講的,這個(gè)看個(gè)人需求,我司兩個(gè)不同的Web環(huán)境,我也只能既來(lái)之則安之(臉上笑嘻嘻,心里MMP)。這里首先對(duì)context是否帶Cookie值以及Cookie值中是否有你需要的參數(shù)來(lái)作為是否跳出函數(shù)的條件

executeHttpRequest就是根正苗紅的請(qǐng)求函數(shù)了,但是別忘了我們HttpClient還沒(méi)初始化呢。所以。。。所以下面沒(méi)了

switchType就是根據(jù)請(qǐng)求的地址經(jīng)過(guò)正則處理后,switch類型不同,重而初始化不同的client對(duì)象,后面會(huì)比較詳細(xì)的講到

createSSLConnectswitchType里面初始化client對(duì)象,后面會(huì)比較詳細(xì)的講到

defaultHeader為構(gòu)建默認(rèn)請(qǐng)求頭。好吧我把上面的話復(fù)制了一遍,這個(gè)講道理,寫(xiě)過(guò)爬蟲(chóng)的應(yīng)該都會(huì)有這個(gè)習(xí)慣,HTTPClient請(qǐng)求頭竟然沒(méi)有UA?。?!唉,真的不能忍。所以defaultHeader里面只有一條數(shù)據(jù),沒(méi)錯(cuò)就是UA

下面又出來(lái)了,client都初始化了,沒(méi)道理不出來(lái)

項(xiàng)目暫時(shí)只有GET和POST,具體怎么構(gòu)建,這里是真的不想寫(xiě),下次吧

好了,下面是這篇文章為數(shù)不多的代碼

response =client.execute(httpPost, context);

沒(méi)了

setReplaceMap為處理Response獲取響應(yīng)對(duì)象中部分參數(shù)的值。這里做自動(dòng)化的,應(yīng)該都要用到,我就不多BB了。就是需要ReplaceMap.put操作一下

checkFormat為解析Response。這里比較惡心的就是JSONObject和JSONArray,其實(shí)這個(gè)函數(shù)就是為了處理這兩玩意

client? ? 這個(gè)定義為靜態(tài),就是為了方便。至于有什么風(fēng)險(xiǎn),這個(gè)有知道的人可以說(shuō)下么

context? ? 上下文管理器。HTTPClient進(jìn)階必須掌握的知識(shí)點(diǎn)。我這里只是利用了其攜帶Cookie的特性,但client官方文檔表明也有存儲(chǔ)Cookie的特性,但這不是懶么,維護(hù)下context就行了,等以后研究深入,再改進(jìn)(FLAG)

ReplaceMap? ? 存放需要替換的數(shù)據(jù),需要考慮多線程的同學(xué),請(qǐng)定義為HashTable類型(線程安全)


真沒(méi)了,下篇就是各個(gè)函數(shù)代碼分析了。

看到這,我要謝謝你耐心的看我表演了這么久????

說(shuō)句大實(shí)話,用HTTPClient來(lái)寫(xiě)自動(dòng)化,其實(shí)對(duì)項(xiàng)目來(lái)說(shuō)不太好,因?yàn)樘A(chǔ),很多功能都需要自定義實(shí)現(xiàn),所以很累啊?。?!但有益于加強(qiáng)對(duì)HTTP的理解。希望大家權(quán)衡下利弊吧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容