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
该程序会连接到您指定的 TCP 主机名和端口,并发送和接收消息。您是否有服务器在监听该连接?我的计算机上没有在 8001 端口运行任何服务,所以我收到了相同的消息。
更多关于Golang服务器返回Bad Request错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好的,收到。
好的,谢谢。可以了。
我在端口8001上使用了netstat命令。 以下是我得到的结果:

这是一个典型的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包可以避免这些底层协议细节问题。

