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

