Golang服务器返回Bad Request错误如何解决

Golang服务器返回Bad Request错误如何解决 大家好,

我在运行这段代码时遇到了问题:https://goplay.tools/snippet/WtyAy6eaZ66

当我尝试使用 go run main.go localhost:8001 运行此文件时,我收到了 dial tcp 127.0.0.1:8001: connect: connection refused 错误。

在端口 80 上运行是正常的:go run main.go localhost:80

之后,当我在提示符中输入内容并按回车键时,我收到了 ->: HTTP/1.1 400 Bad Request 错误。我无法找出问题所在。

对于任何建议,我都将不胜感激。


更多关于Golang服务器返回Bad Request错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

该程序会连接到您指定的 TCP 主机名和端口,并发送和接收消息。您是否有服务器在监听该连接?我的计算机上没有在 8001 端口运行任何服务,所以我收到了相同的消息。

更多关于Golang服务器返回Bad Request错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,收到。

好的,谢谢。可以了。

我在端口8001上使用了netstat命令。 以下是我得到的结果:

image

这是一个典型的HTTP客户端/服务器配置问题。从错误信息看,主要有两个问题需要解决:

问题1:端口连接被拒绝

端口8001连接被拒绝是因为没有服务器在该端口监听。端口80能工作是因为通常有系统服务在监听。

问题2:Bad Request错误

400 Bad Request通常是因为HTTP请求格式不正确。你的代码中客户端发送的请求不符合HTTP协议规范。

解决方案

1. 首先修复服务器端代码

确保服务器正确监听指定端口:

package main

import (
    "fmt"
    "io"
    "net"
    "os"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s host:port\n", os.Args[0])
        os.Exit(1)
    }
    
    service := os.Args[1]
    
    // 解析地址
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    if err != nil {
        fmt.Fprintf(os.Stderr, "ResolveTCPAddr failed: %s\n", err.Error())
        os.Exit(1)
    }
    
    // 建立连接
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "DialTCP failed: %s\n", err.Error())
        os.Exit(1)
    }
    defer conn.Close()
    
    // 发送正确的HTTP请求
    httpRequest := "GET / HTTP/1.1\r\n" +
                   "Host: " + service + "\r\n" +
                   "Connection: close\r\n" +
                   "\r\n"
    
    _, err = conn.Write([]byte(httpRequest))
    if err != nil {
        fmt.Fprintf(os.Stderr, "Write failed: %s\n", err.Error())
        os.Exit(1)
    }
    
    // 读取响应
    result, err := io.ReadAll(conn)
    if err != nil {
        fmt.Fprintf(os.Stderr, "ReadAll failed: %s\n", err.Error())
        os.Exit(1)
    }
    
    fmt.Println(string(result))
}

2. 使用net/http包简化HTTP请求

更简单的方法是使用标准库的http包:

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s url\n", os.Args[0])
        os.Exit(1)
    }
    
    url := os.Args[1]
    
    resp, err := http.Get(url)
    if err != nil {
        fmt.Fprintf(os.Stderr, "HTTP GET failed: %s\n", err.Error())
        os.Exit(1)
    }
    defer resp.Body.Close()
    
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Read body failed: %s\n", err.Error())
        os.Exit(1)
    }
    
    fmt.Printf("Status: %s\n", resp.Status)
    fmt.Printf("Body:\n%s\n", body)
}

3. 如果需要原始TCP通信,确保发送正确的协议数据

对于原始TCP连接,必须发送符合HTTP协议格式的请求:

// 正确的HTTP请求格式示例
request := fmt.Sprintf("GET / HTTP/1.1\r\nHost: %s\r\nUser-Agent: Go-Client\r\nAccept: */*\r\n\r\n", hostname)

4. 运行示例

对于HTTP服务器测试:

# 在一个终端启动测试服务器
go run -exec "sleep 1" & python3 -m http.server 8001

# 在另一个终端运行客户端
go run main.go http://localhost:8001

原始TCP连接的错误通常是因为发送的数据不符合HTTP协议规范。使用标准库的net/http包可以避免这些底层协议细节问题。

回到顶部