靜態注入器是HttpCanary最強大的功能之一,可以實現對Http請求資料和響應資料的攔截修改。靜態注入器需要先選定一個請求,然後對其進行預編輯,編輯完成後便可對後續的相同請求進行自動修改。
比如App發往伺服器的請求為:https://test.com?city=beijing ,我們可以使用HttpCanary的靜態注入器將引數值beijing修改為nanjing 。對App的開發和測試而言,可以模擬很多不同場景的請求,來提高測試效率。
本篇文章將詳細講解如何使用靜態注入器。
測試請求範例
https://www.apiopen.top/weatherApi?city=北京
複製程式碼
建立靜態注入器
首先,長按抓包記錄,在彈框中選擇“靜態注入“,然後給注入器命名(方便後面對注入器進行管理)。

命名完成後,進入注入器編輯介面。編輯頁面會展示出此請求的所有Http協議資料,包括請求行(Start Line)、請求頭(Headers)、請求體(Body)、狀態行(StatusLine)、響應頭(Headers)、響應體(Body)。
左邊Tab是請求資料,右邊是響應資料。

關於Http協議的報文結構,下面這張圖做了詳細描述(圖中非範例請求資料),更多內容請見:https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages

在瞭解Http協議報文之後,我們下面開始講解如何使用注入器修改資料。
1. URL引數修改
我們希望將請求引數city的值由北京修改為南京。
https://www.apiopen.top/weatherApi?city=南京
複製程式碼
只需要點選”city=北京“這個引數區域。

開啟URL引數編輯頁後,將引數值由北京改為南京,並儲存。

修改完成後,返回注入器頁面。city前面的點顏色由灰色變為綠色,表示引數是修改狀態。即如果後續相同請求引數中包含city引數,其值會被強制替換成南京。

點選右上角完成注入器的建立。
下面我們重新用AppTest應用傳送一條相同的請求,來測試修改是否能生效。抓到包後,開啟抓包內容詳情:

由於南京是中文,作為URL一部分會被Encode,不怕,我們點選這個URL開啟URL預覽頁:

我們最後再來看看響應資料,確認下是否是真的生效了。

完美!
2. URL引數新增和刪除
如果我們希望將請求修改為這種:
https://www.apiopen.top/weatherApi?province=江蘇&days=7
複製程式碼
即刪除city引數,新增province和days引數。
同樣先按照上一步的步驟開啟靜態注入器編輯頁面。點選city引數右側的三個點按鈕,開啟功能選擇彈框,一共有三個選項:跟隨,自定義,禁用。

這裡解釋下三個選項的含義。
- 跟隨,表示使用原始資料,不做任何修改(預設選項),顏色為灰色。
- 自定義,表示強行覆蓋或新增設定的引數值,顏色為綠色。
- 禁用,表示強行刪除此引數和值,顏色為紅色。
所以,刪除city引數,我們選擇禁用選項,注意引數前面的點變成了紅色。
下一步,點選新增按鈕新增兩個引數,province=江蘇和days=7。

點選右上角儲存,完成注入器建立後,我們重新再發一條請求,看看效果。

很明顯,city引數沒有了,多了province和days兩個引數。
完美!
3. Headers修改、新增和刪除
同上面URL操作相同,參考1和2,不再贅述。
4. 響應行(Status Line)修改
Http協議中響應行用來表示請求服務的結果狀態,比如常用的200表示成功,404表示資源未找到,500表示伺服器異常等等。
有的時候為了測試一些極端情況,比如伺服器不返回200而是404,App狀態是否會出現bug等。我們可以使用HttpCanary來強行修改響應行中的狀態碼來實現這種效果。

點選編輯按鈕,開啟列表,其中列出來幾乎所有常用的響應行(都是標準響應行),我們從列表中選擇404 Not Found。

選擇後自動返回,如果想撤銷操作,點選右邊復位按鈕。

我們點選右上角儲存按鈕完成注入器的建立,重新用AppTest應用傳送一條相同請求。從下圖中能看出,後面接收到的請求已經是404 Not Found了。

完美!
5. 請求/響應體(Body)修改
在App實際開發和測試中,修改請求資料和返回資料是最經常用到的。比如,測試地理位置相關介面時,需要修改經緯度;再比如,伺服器返回了某些時間戳,我們希望將其延長或者縮短。
同樣以此天氣介面為例,希望將響應體中的yesterday的high改為100℃,low改為-100℃,type改為冰雹

開啟建立靜態注入器的頁面後,拉到最下面。點選右側向上的箭頭,選擇編輯方式。

靜態注入器提供了兩種方式用來編輯Body:上傳檔案和直接編輯。如果Body是二進位制格式資料(比如音訊、視訊、ProtoBuffer等),HttpCanary內建的文字編輯器是無法處理的,只能使用上傳檔案的方式。如果Body是json、xml、fromdata等文字格式,可以使用直接編輯。
由於介面返回的天氣資料是JSON格式,我們可以使用直接編輯選項,開啟後直接進行資料修改。

儲存後完成靜態注入器的建立,用AppTest應用再傳送一條相同請求,來看看結果。

修改成功!完美!
5. 靜態注入器管理
靜態注入器和我們常用的斷點(BreakPoint)方式修改資料不同,它是通過預設的方式來攔截和修改資料,可以極大地提高資料修改的效率。
HttpCanary可以對一個請求配置多個靜態注入器,按照先配置先生效的原則進行攔截處理。靜態注入器一旦建立了,將會以Mod的形式作為外掛功能存在於HttpCanary中,即使是殺掉HttpCanar APP後再重啟也能生效。
那我們如何對注入器進行管理呢?開啟設定->模組管理頁面,能看到所有建立的靜態注入器。

點選進入詳情後,能看到注入器是屬於哪個請求的。

如果需要刪除或者禁用已經建立的靜態注入器,只需要在列表頁長按開啟功能選項即可!

結語
如果您對HttpCanary有任何疑問或者建議,可以訪問HttpCanary Github並建立issue!
靜態注入器的使用指南到此結束,感謝您的閱讀!