Golang如何消费REST API
Golang如何消费REST API
dial tcp 127.0.0.1:8084 :connect connection refused - getting this error while running consumer code for restapi
2 回复
是否有服务在监听 127.0.0.1:8084?
使用 curl 命令是否有效?
更多关于Golang如何消费REST API的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个错误表明你的Go程序无法连接到本地的REST API服务(127.0.0.1:8084)。以下是几种常见原因和对应的解决方案:
1. 检查服务是否正在运行
首先确认REST API服务是否在8084端口启动:
// 检查端口是否被占用的示例
package main
import (
"fmt"
"net"
"time"
)
func checkService(host string, port string) {
address := net.JoinHostPort(host, port)
conn, err := net.DialTimeout("tcp", address, 3*time.Second)
if err != nil {
fmt.Printf("无法连接到 %s:%s - 错误: %v\n", host, port, err)
fmt.Println("请确保REST API服务正在运行")
return
}
defer conn.Close()
fmt.Printf("成功连接到 %s:%s\n", host, port)
}
func main() {
checkService("127.0.0.1", "8084")
}
2. 使用http.Client的正确示例
确保你的消费代码正确处理连接错误:
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func consumeAPI() {
client := &http.Client{
Timeout: 10 * time.Second,
}
url := "http://127.0.0.1:8084/api/endpoint"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Printf("创建请求失败: %v\n", err)
return
}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("连接失败: %v\n", err)
fmt.Println("请检查:")
fmt.Println("1. 服务是否运行 (netstat -an | grep 8084)")
fmt.Println("2. 防火墙设置")
fmt.Println("3. 服务绑定地址 (0.0.0.0 还是 127.0.0.1)")
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
fmt.Printf("响应状态: %d\n", resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(body))
}
func main() {
consumeAPI()
}
3. 带重试机制的消费代码
添加重试逻辑来处理临时连接问题:
package main
import (
"fmt"
"net/http"
"time"
)
func consumeAPIWithRetry(maxRetries int) error {
url := "http://127.0.0.1:8084/api/endpoint"
for i := 0; i < maxRetries; i++ {
resp, err := http.Get(url)
if err != nil {
fmt.Printf("尝试 %d/%d 失败: %v\n", i+1, maxRetries, err)
if i < maxRetries-1 {
time.Sleep(time.Duration(i+1) * time.Second)
continue
}
return err
}
defer resp.Body.Close()
fmt.Printf("请求成功,状态码: %d\n", resp.StatusCode)
return nil
}
return fmt.Errorf("达到最大重试次数")
}
func main() {
if err := consumeAPIWithRetry(3); err != nil {
fmt.Printf("最终失败: %v\n", err)
}
}
4. 验证服务绑定的地址
检查你的REST API服务是否正确绑定到所有接口:
// REST API服务端示例 - 确保绑定到正确地址
package main
import (
"fmt"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/endpoint", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("服务正常运行"))
})
// 绑定到所有网络接口
fmt.Println("服务启动在 http://0.0.0.0:8084")
err := http.ListenAndServe(":8084", mux)
if err != nil {
fmt.Printf("服务启动失败: %v\n", err)
}
}
运行这个服务端代码,然后再次运行你的消费代码。如果问题仍然存在,使用以下命令检查端口监听情况:
# Linux/Mac
netstat -an | grep 8084
lsof -i :8084
# Windows
netstat -an | findstr 8084
确保服务确实在8084端口监听,并且绑定地址是0.0.0.0或127.0.0.1。

