Golang网络访问失败问题排查与解决

Golang网络访问失败问题排查与解决 我想查询OpenAI的密钥额度,但在网络良好的情况下,使用Go代码访问失败,而使用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))
}

我没有提供密钥,它应该返回一个网页错误,而不是无法访问。


更多关于Golang网络访问失败问题排查与解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang网络访问失败问题排查与解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的代码访问失败是因为缺少必要的TLS配置和正确的请求头设置。OpenAI API要求使用TLS 1.2+协议,并且需要完整的认证信息。以下是修正后的代码:

package main

import (
	"crypto/tls"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

func main() {
	url := "https://api.openai.com/dashboard/billing/credit_grants"
	
	// 配置TLS客户端
	tlsConfig := &tls.Config{
		MinVersion: tls.VersionTLS12,
		MaxVersion: tls.VersionTLS13,
	}
	
	// 创建HTTP客户端
	client := &http.Client{
		Timeout: 30 * time.Second,
		Transport: &http.Transport{
			TLSClientConfig: tlsConfig,
			Proxy:           http.ProxyFromEnvironment,
		},
	}
	
	// 创建请求
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		fmt.Printf("创建请求失败: %v\n", err)
		return
	}
	
	// 设置必要的请求头
	req.Header.Set("Authorization", "Bearer your-api-key-here") // 替换为你的API密钥
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("User-Agent", "Go-http-client/1.1")
	
	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		fmt.Printf("请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()
	
	// 读取响应
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("读取响应失败: %v\n", err)
		return
	}
	
	fmt.Printf("状态码: %d\n", resp.StatusCode)
	fmt.Printf("响应体: %s\n", string(body))
}

关键修改点:

  1. 显式配置TLS版本为1.2或更高
  2. 设置合理的超时时间
  3. 移除了不必要的请求头,只保留必需的AuthorizationContent-Type
  4. 使用正确的User-Agent

如果仍然失败,可以添加调试信息查看具体错误:

// 在client.Do()后添加
if resp != nil {
    fmt.Printf("响应头: %v\n", resp.Header)
    fmt.Printf("状态码: %d\n", resp.StatusCode)
}

另外,确保你的API密钥有效且具有查询额度的权限。OpenAI API需要有效的Bearer Token才能返回正确的响应,空令牌会导致认证失败。

回到顶部