无法通过系统代理访问网络

1. 运行环境

go version go1.20.1 windows/amd64//: <> (当前使用的Go版本,及系统版本、系统架构?)

2. 问题描述?

无法访问网址,但是我通过浏览器或者apifox都是可以正常访问的,我的网络没有问题,以下代码可直接执行

package main

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

func main() {

    url1 := "https://api.openai.com/dashboard/billing/credit_grants"
    method := "GET"
    req, err := http.NewRequest(method, url1, nil)
    if err != nil {
        fmt.Println(err)
        return
    }

    var client = &http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyFromEnvironment,
        },
    }
    req.Header.Add("Accept", "*/*")
    req.Header.Add("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")
    req.Header.Add("Authorization", "Bearer ")
    req.Header.Add("Host", "api.openai.com")
    req.Header.Add("OpenAI-Organization", "org-E6WE35xzA24xKfpTzZcZ4qhC")
    req.Header.Add("User-Agent", "Apifox/1.0.0 (https://www.apifox.cn)")
    req.Header.Add("Connection", "keep-alive")

    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}

3. 您期望得到的结果?

4. 您实际得到的结果?

Get "https://api.openai.com/dashboard/billing/credit_grants": dial tcp 168.143.171.189:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
讨论数量: 2

除非开启系统级(底层)代理 (如果是clash对应的则是tun模式) 否则 任何编程语言都不会直接使用到这个代理。

http.ProxyFromEnvironment意思是从系统环境变量中获取代理配置,这通常是Linux下的比如all_proxy=socks5://ip:port go run xx.go

否则需要手动指定ip,比如

package main

import (
    "context"
    "golang.org/x/net/proxy"
    "net"
    "net/http"
)

func main() {

    client := http.Client{
        Transport: &http.Transport{
            DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
                dialer, err := proxy.SOCKS5("tcp", "ip:port", nil, proxy.Direct)
                if err != nil {
                    return nil, err
                }

                return dialer.Dial(network, addr)
            },
        },
    }

    client.Get("http://....")
}
// 依赖 golang.org/x/net/proxy包

或者,手动环境变量


func main() {
    os.Setenv("HTTP_PROXY", "http:/ip:port")
    os.Setenv("HTTPS_PROXY", "https://ip:port")
    c := http.Client{}
    if resp, err := c.Get("https://www.google.com"); err != nil {
        log.Fatalln(err)
    } else {
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        fmt.Printf("%s\n", body)
    }
}
1年前 评论

「Go 学堂」写了一些列的 gin 框架的底层原理知识。还有相关的使用 go 语言写的开源包系列。欢迎关注

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!