iOS 抓包中請求與響應攔截器,修改請求與響應數(shù)據(jù)

在調(diào)試網(wǎng)絡問題時,有一個明顯的分界點:

  • 只查看請求和響應
  • 主動修改請求和響應,觀察程序行為變化

當調(diào)試目標落在第二種情況,抓包工具是否支持請求 / 響應攔截器,就成了決定效率的關鍵因素。


確認攔截位置,是在發(fā)送前,還是返回后

在動手寫攔截邏輯之前,我會先確認一個我要干預的是請求階段,還是響應階段。

舉兩個常見的調(diào)試目標:

  • 請求發(fā)出前,替換 Header、參數(shù)或 URL
  • 響應返回后,修改字段、狀態(tài)碼或數(shù)據(jù)結(jié)構(gòu)

這一步會直接決定攔截器是否需要同時處理 request 和 response。


代理型工具中的攔截能力

在 Charles、Fiddler 這類代理工具中,攔截通常以規(guī)則或斷點形式存在。

以代理斷點為例:

  • 設置 URL 匹配規(guī)則
  • 請求命中后暫停
  • 手動修改請求內(nèi)容再繼續(xù)發(fā)送

這種方式適合臨時驗證接口行為,但當需要批量、可復現(xiàn)的修改邏輯時,手動斷點的效率會迅速下降。


腳本化攔截的必要性

當調(diào)試需求變成:

  • 每次請求都要自動改 Header
  • 特定接口返回值需要統(tǒng)一替換
  • 多個字段需要條件判斷后再修改

就需要使用腳本型攔截器。

這類攔截器有幾個明確特征:

  • 請求與響應自動進入攔截邏輯
  • 修改過程可重復
  • 行為可通過日志驗證

在抓包大師中啟用請求 / 響應攔截器

在需要對 iOS App 網(wǎng)絡數(shù)據(jù)做深度調(diào)試時,我會使用 抓包大師(Sniff Master) 的攔截器功能。

打開攔截器日志界面

  • 進入代理抓包界面
  • 雙擊右側(cè)插件形狀的攔截器圖標
  • 打開攔截器日志窗口

在這個界面中,可以直接看到:

  • 攔截功能是否啟用
  • 當前攔截日志是否產(chǎn)生

日志是否出現(xiàn),是判斷攔截是否生效的直接依據(jù)。


進入攔截器編輯器,理解代碼結(jié)構(gòu)

在攔截器日志界面中,點擊「編輯攔截器」,會進入代碼編輯窗口。

攔截器使用 JavaScript 編寫,整體結(jié)構(gòu)固定,由三個函數(shù)組成:

function handleRequest(request) {
    return request
}

function handleResponse(response) {
    return response
}

function filterUrl() {
    return []
}

這段代碼本身不會攔截任何請求,它的作用是提供一個完整但空行為的框架。


攔截范圍由 filterUrl 決定

filterUrl() 返回的是一個 URL 規(guī)則數(shù)組。

例如:

function filterUrl() {
    return ["https://api.example.com/*"]
}

只有命中該規(guī)則的請求,才會進入 handleRequesthandleResponse。
如果這里返回空數(shù)組,攔截器不會對任何請求生效。


在請求階段修改數(shù)據(jù)

handleRequest(request) 接收到的是即將發(fā)送給服務器的數(shù)據(jù)

request 對象中可直接訪問:

  • request.URL
  • request.Header
  • request.Body
  • request.IsBase64Body

例如,替換請求 Header 中的某個字段:

function handleRequest(request) {
    request.Header["token"] = "debug-token"
    return request
}

修改完成后返回 request,對服務器而言,這就是最終收到的請求。


在響應階段修改返回結(jié)果

handleResponse(response) 接收的是服務器返回的數(shù)據(jù)。

response 中除了 URL、Header、Body,還包含:

  • response.StatusCode

例如,修改響應內(nèi)容以驗證客戶端邏輯:

function handleResponse(response) {
    response.Body = '{"code":0,"data":"mock"}'
    return response
}

客戶端接收到的就是被替換后的響應內(nèi)容。


攔截器是否生效,用日志驗證

在調(diào)試過程中,我會在攔截函數(shù)中加入日志輸出:

console.log("攔截請求:" + request.URL);

如果日志窗口中出現(xiàn)對應輸出,說明:

  • URL 匹配成功
  • 攔截邏輯被執(zhí)行
  • 修改行為真實生效

這是比“界面有沒有變化”更可靠的判斷方式。


多工具協(xié)同的使用方式

在實際工程中,攔截器很少單獨使用:

  • 用 Wireshark 判斷是否建立連接
  • 用代理工具確認請求路徑
  • 用 抓包大師(Sniff Master)攔截并修改數(shù)據(jù)

每個工具解決的都是不同層級的問題,攔截器負責的是數(shù)據(jù)層面的驗證和控制

參考鏈接:https://www.sniffmaster.net/tutorial/zh/6/6.html

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

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

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