如何捕获PowerShell中Invoke-WebRequest生成的原始HTTP请求?
获取PowerShell Invoke-WebRequest的原始请求内容
方法1:启用Debug参数输出请求细节
Invoke-WebRequest自带-Debug参数,开启后会打印底层请求的关键信息,包括请求行、所有请求头、代理交互逻辑,足够和Go的请求做对比:
Invoke-WebRequest -Uri "你的API地址" -Headers @{Authorization="Bearer 你的JWT"} -Debug
方法2:自定义.NET Handler捕获完整请求
PowerShell的Invoke-WebRequest基于.NET的HttpClient,可直接在PowerShell中编写自定义Handler,拦截并输出完整请求结构,和Invoke-WebRequest的底层逻辑完全一致:
Add-Type -TypeDefinition @" using System; using System.Net; using System.Net.Http; using System.Text; public class RequestLoggingHandler : DelegatingHandler { protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { // 输出请求行 Console.WriteLine($"Request: {request.Method} {request.RequestUri}"); // 输出所有请求头 foreach (var header in request.Headers) { Console.WriteLine($"{header.Key}: {string.Join(", ", header.Value)}"); } // GET请求无请求体,若为POST可取消注释以下代码 // if (request.Content != null) // { // var content = request.Content.ReadAsStringAsync().Result; // Console.WriteLine($"Content: {content}"); // } return base.SendAsync(request, cancellationToken); } } "@ # 构建和Invoke-WebRequest行为一致的HttpClient $handler = New-Object RequestLoggingHandler $handler.InnerHandler = New-Object System.Net.Http.HttpClientHandler # 启用系统代理,和PowerShell默认行为对齐 $handler.InnerHandler.UseProxy = $true $handler.InnerHandler.Proxy = [System.Net.WebRequest]::DefaultWebProxy $handler.InnerHandler.Proxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials $client = New-Object System.Net.Http.HttpClient($handler) $client.DefaultRequestHeaders.Authorization = New-Object System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "你的JWT") # 发送请求并打印日志 $response = $client.GetAsync("你的API地址").Result
方法3:校验代理配置一致性
既然环境存在代理,可先确认Go和PowerShell的代理配置是否完全匹配:
- 在PowerShell中查看系统代理:
[System.Net.WebRequest]::DefaultWebProxy.GetProxy("你的API地址")
- 在Go中打印当前使用的代理:
apiURL, _ := url.Parse("你的API地址") proxyURL, err := http.ProxyFromEnvironment(&http.Request{URL: apiURL}) if err == nil { fmt.Printf("Go使用的代理地址: %s\n", proxyURL) }
确保两者使用的代理地址、凭证逻辑完全一致。
内容的提问来源于stack exchange,提问作者Chris-AF
相关产品推荐
相关产品推荐

