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))
}
关键修改点:
- 显式配置TLS版本为1.2或更高
- 设置合理的超时时间
- 移除了不必要的请求头,只保留必需的
Authorization和Content-Type - 使用正确的User-Agent
如果仍然失败,可以添加调试信息查看具体错误:
// 在client.Do()后添加
if resp != nil {
fmt.Printf("响应头: %v\n", resp.Header)
fmt.Printf("状态码: %d\n", resp.StatusCode)
}
另外,确保你的API密钥有效且具有查询额度的权限。OpenAI API需要有效的Bearer Token才能返回正确的响应,空令牌会导致认证失败。

