You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在响应流传输前用mitmproxy拦截并修改请求?

解决mitmproxy修改GET请求失败的问题及工具作用说明

代码问题分析及修正

你的代码逻辑存在问题,导致修改请求失败:

  • 你直接对BASE_URL执行替换操作并赋值给flow.request.url,这会丢失当前请求的参数部分(比如原请求是BASE_URL?param=xxx,修改后就只剩替换后的基础URL了)。
  • 正确的做法应该是针对当前请求的URL进行替换,而不是固定的BASE_URL。

修正后的代码示例:

from mitmproxy import http

# 先定义你的目标基础URL
BASE_URL = "https://example.com/abc"

def request(flow: http.HTTPFlow) -> None:
    if flow.request.pretty_url.startswith(BASE_URL):
        # 对当前请求的完整URL进行字符串替换
        flow.request.url = flow.request.url.replace('abc', 'def')

如果需要更精准地修改查询参数(而非URL路径),直接操作flow.request.query对象会更可靠:

def request(flow: http.HTTPFlow) -> None:
    if flow.request.pretty_url.startswith(BASE_URL):
        # 修改指定查询参数的值
        flow.request.query["target_param"] = "def"
        # 也可以添加新的查询参数
        flow.request.query["new_param"] = "test_value"

关于request事件触发时机的误解

mitmproxy的request事件确实是在客户端完成整个请求体传输后触发,但GET请求通常没有请求体,所以这个事件对GET请求的触发时机是:客户端发送完请求行和请求头之后、mitmproxy转发请求到服务器之前。这个时机完全允许修改请求的URL、请求头,甚至人为添加请求体,不存在“无法修改请求”的情况,你之前的失败是代码逻辑错误导致的,和事件时机无关。

mitmproxy的核心作用

mitmproxy的核心是作为HTTP/HTTPS代理,实现请求与响应的拦截、修改、记录与重放,典型应用场景包括:

  • 调试接口:修改请求参数、请求头,验证后端接口的逻辑处理
  • 模拟异常:修改响应内容、状态码,测试客户端的异常处理能力
  • 抓包分析:记录所有请求响应,排查接口交互问题
  • 安全测试:构造恶意请求,验证后端的安全防护能力

内容的提问来源于stack exchange,提问作者Tugay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:30:52