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

在Go中通过TCP连接发送HTTP请求,为何返回400 Bad Request错误?

问题分析与解决:400 Bad Request错误

导致400错误的核心原因是HTTP协议版本格式错误:你的请求里写的是HTTP1.1,而HTTP协议规范要求版本号必须是HTTP/1.1(带斜杠),服务器无法识别不符合规范的版本标识,因此返回400错误。

除此之外,代码还有几个需要优化的点:

  • 忽略了错误处理:tls.Dial、conn.Write、conn.Read都可能返回错误,直接忽略会导致问题排查困难,实际开发中必须处理这些错误。
  • 单次读取响应不完整:conn.Read只执行一次,可能无法获取完整的HTTP响应,应该循环读取直到连接关闭或读取到完整响应。

修正后的代码示例:

package main

import (
    "crypto/tls"
    "fmt"
    "io"
)

func main() {
    conf := &tls.Config{}
    conn, err := tls.Dial("tcp", "www.google.com:443", conf)
    if err != nil {
        fmt.Printf("连接失败: %v\n", err)
        return
    }
    defer conn.Close()

    data := []byte("GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n")
    _, err = conn.Write(data)
    if err != nil {
        fmt.Printf("写入数据失败: %v\n", err)
        return
    }

    buf := make([]byte, 5000)
    for {
        n, err := conn.Read(buf)
        if err != nil {
            if err == io.EOF {
                break
            }
            fmt.Printf("读取响应失败: %v\n", err)
            return
        }
        fmt.Print(string(buf[:n]))
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:19