AnyProxy不單單能夠抓包,還能夠攔截請求並修改服務端響應,實現接口mock功能。
面試時候常常會問到第三方支付如何測試這種,若是對接的第三方沒提供測試環境,那麼就須要搭建一個mock服務器,模擬支付接口返回的各類狀況。git
AnyProxy提供了二次開發的能力,你能夠用js編寫本身的規則模塊(rule),來自定義網絡請求的處理邏輯。github
注意:引用規則前,請務必確保文件來源可靠,以避免發生安全問題面試
可修改內容包括請求頭(request header),請求體(request body),甚至是請求的目標地址等npm
可修改的內容包括http狀態碼(status code)、響應頭(response header)、響應內容等瀏覽器
本質是中間人攻擊(man-in-the-middle attack),須要客戶端提早信任AnyProxy生成的CA安全
舉個栗子: 須要編寫一個規則模塊,在 GET http://httpbin.org/user-agent 的返回值里加上測試信息,並延遲5秒返回服務器
Step 1,編寫規則以下, 保存爲sample.js文件,能夠放電腦任意位置網絡
// file: sample.js module.exports = { summary: 'a rule to hack response', *beforeSendResponse(requestDetail, responseDetail) { if (requestDetail.url === 'http://httpbin.org/user-agent') { const newResponse = responseDetail.response; newResponse.body += '- AnyProxy Hacked!'; return new Promise((resolve, reject) => { setTimeout(() => { // delay resolve({ response: newResponse }); }, 5000); }); } }, };
Step 2, 啓動AnyProxy,加載規則curl
anyproxy -i --rule sample.js測試
當看到出現:Active rule is: a rule to hack response 那就是加載成功了
Step 3, 測試規則
用curl測試
curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
也可使用瀏覽器測試,配置瀏覽器http代理爲 127.0.0.1:8001,訪問 http://httpbin.org/user-agent, 通過代理服務器後,指望的返回以下
{ "user-agent": "curl/7.43.0" } - AnyProxy Hacked!
Step 4, 查看請求信息.瀏覽器訪問http://127.0.0.1:8002 ,界面上能看到剛纔的請求信息
當http請求通過代理服務器時,具體處理過程是:
-收集請求全部請求參數,包括method, header, body等
當代理服務器收到https請求時,AnyProxy能夠替換證書,對請求作明文解析。
以下幾種方案均可以用來引用規則模塊:
使用本地路徑
anyproxy --rule ./rule.js
使用在線地址
anyproxy --rule https://sample.com/rule.js
使用npm包,AnyProxy使用require()加載本地規則,你能夠在參數裏傳入一個本地的npm包路徑,或是某個全局安裝的npm包
anyproxy --rule ./myRulePkg/ #本地包 npm i -g myRulePkg && anyproxy --rule myRulePkg #全局包
規則模塊應該符合cmd規範,一個典型的規則模塊代碼結構以下。模塊中全部方法都是可選的,只需實現業務感興趣的部分便可。
module.exports = { // 模塊介紹 summary: 'my customized rule for AnyProxy', // 發送請求前攔截處理 *beforeSendRequest(requestDetail) { /* ... */ }, // 發送響應前處理 *beforeSendResponse(requestDetail, responseDetail) { /* ... */ }, // 是否處理https請求 *beforeDealHttpsRequest(requestDetail) { /* ... */ }, // 請求出錯的事件 *onError(requestDetail, error) { /* ... */ }, // https鏈接服務器出錯 *onConnectError(requestDetail, error) { /* ... */ } };
更多資料參考anyproxy 官方文檔https://github.com/alibaba/anyproxy/blob/master/docs/cn/src_doc.md