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

为何Go语言HTTP请求始终返回200状态码,C#同逻辑却返回307?

Go实现禁止自动重定向的HTTP GET请求(对应C# AllowAutoRedirect=false)

你当前的Go代码问题出在CheckRedirect的逻辑上:返回nil会让客户端自动跟随重定向,这就是为什么你拿到200状态码的原因。要实现和C#中AllowAutoRedirect=false完全一致的效果,需要让CheckRedirect返回http.ErrUseLastResponse,这个错误会告诉Go的HTTP客户端停止后续重定向,直接返回当前收到的3xx响应。

正确的实现代码

package main

import (
	"fmt"
	"net/http"
)

func testrequestingo() error {
	// 配置客户端禁止自动重定向
	client := http.Client{
		CheckRedirect: func(req *http.Request, via []*http.Request) error {
			// 返回该错误表示终止重定向,返回当前的3xx响应
			return http.ErrUseLastResponse
		},
	}

	// 创建GET请求
	req, err := http.NewRequest("GET", "https://mytesturl.com/", nil)
	if err != nil {
		return fmt.Errorf("创建请求失败: %w", err)
	}

	// 设置Accept请求头,和C#代码保持一致
	req.Header.Set("Accept", "text/html")

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("发送请求失败: %w", err)
	}
	defer resp.Body.Close() // 必须关闭响应体,避免资源泄漏

	fmt.Println("StatusCode: ", resp.StatusCode)
	return nil
}

func main() {
	if err := testrequestingo(); err != nil {
		fmt.Printf("请求出错: %v\n", err)
	}
}

针对你遇到的「返回ErrUseLastResponse仍不对」的排查方向

  1. 修正函数签名:你写的func testrequestingo([]string, error)是无效的Go函数签名,会导致代码无法编译执行,必须改成合法的形式(比如上面示例中的无参数返回error)。
  2. 必须处理错误:client.Do(req)之后一定要先检查err,不能直接访问resp.StatusCode——如果请求过程中出错,resp会是nil,直接访问会触发panic。
  3. 匹配请求头细节:C#的HttpClient和Go的默认请求头存在差异,比如User-Agent。部分服务器会根据请求头返回不同的响应,你可以尝试设置和C#一致的User-Agent:
    req.Header.Set("User-Agent", "HttpClient/4.0 (.NET Framework)") // 替换为你C#代码实际使用的User-Agent
    
  4. 抓包对比请求:如果以上都没问题,建议用抓包工具对比C#和Go的请求,看是否存在其他差异(比如Cookie、编码等),服务器可能因为这些差异返回不同的状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:03:26