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.0127.0.0.1

回到顶部