HTTP 錄製與重播卡帶

HTTP 用戶端把 urllib 傳輸寫死,因此一個驅動真實 API 的流程,若沒有可連線的線上伺服器便無法在 CI 重跑。用戶端現在開放 build_call / urllib_transport 接縫,本層在其上加入 VCR 風格的 卡帶:重播會為相符的請求回傳已錄製的回應(純粹、不連網 —— 對 CI 最有價值的一半),而錄製則是 在實際傳輸之上的薄薄一層轉送。

純標準函式庫(json);不匯入 PySide6

無頭 API

from je_auto_control import Cassette, CassetteMissError
from je_auto_control.utils.http_client import build_call, urllib_transport

# 對線上伺服器錄製一次,然後存檔:
cassette = Cassette()
transport = cassette.recording_transport(urllib_transport)
transport(build_call("https://api.example.com/users/1", "GET"))
cassette.save("users.cassette.json")

# 之後永遠重播 —— 具決定性、離線:
cassette = Cassette.load("users.cassette.json")
response = cassette.replay(build_call("https://api.example.com/users/1", "GET"))
assert response["status"] == 200

build_call 把請求參數轉成純 dict(url、method、headers、body、timeout)而不碰網路; urllib_transport 負責實際發送。Cassette.record 儲存一組請求/回應;``replay`` 為符合 match_on``(預設 ``("method", "url"),可加 "body")的請求回傳已錄製的回應,找不到時拋出 CassetteMissErrorreplay_transport / recording_transport 回傳可直接替換的傳輸,讓既有 呼叫端在不變動下把實際流量換成卡帶。

執行器命令

AC_http_replay 接受 cassette``(interactions 清單或 ``{interactions},可為 JSON 字串)、 url 與選用的 method,在不連網的情況下回傳已錄製的 {response}。它以 MCP 工具 ac_http_replay 以及 Script Builder 中 Data 分類下的命令提供。