背景
有台服务器A需要访问Target上的get url,发现golang代码一直报错EOF
定位过程
- 尝试在本地复现,没有成功,本地测试接口构造了测试接口,返回内容是线上复制的返回内容
- 剥离出请求代码,做测试,发现另一台B(windows)可以,这台A linux会报错EOF
- 使用curl(第二步就用curl可以省好多时间)发现报错curl: (52) Empty reply from server
- A ping Target,成功;A curl任意Target的网址都是(52) Empty reply from server
- 反过来,Target ping A, 成功,curl A,成功
- 使用curl -v --noproxy '*' http://xxx,发现能返回内容,判断是A上设置了代理
前两天遇到台服务器定位代理问题,找到同样的目录,同样的位置/etc/profile,果然有代理
代码的改动,设置Proxy: nil:
func (s *SoftWareBarcode) getXMLValue(urlStr, sofeName string) (string, error) {
// 准备查询参数,传递 SoftName 参数
params := url.Values{}
params.Set("SoftName", sofeName)
// 构建完整的 URL,包括查询参数
fullURL := fmt.Sprintf("%s?%s", urlStr, params.Encode())
client := &http.Client{
Transport: &http.Transport{
Proxy: nil, // 设置为 nil,禁用代理
},
}
// 发起 GET 请求, 这个url直接打开是可以的,但是执行过程中报错EOF
resp, err := client.Get(fullURL)
if err != nil {
// 错误日志
l.Logger.Error(err)
return "", fmt.Errorf("请求失败: %v", err)
}
defer resp.Body.Close()
// 读取响应内容
body, err := io.ReadAll(resp.Body)
if err != nil {
// 错误日志
l.Logger.Error(err)
return "", fmt.Errorf("读取响应失败: %v", err)
}
// 解析 XML
var response Response
err = xml.Unmarshal(body, &response)
if err != nil {
// 错误日志
l.Logger.Error(err)
return "", fmt.Errorf("XML 解析失败: %v", err)
}
// 如果响应的 Value 是空字符串,返回 "unknow"
if response.Value == "" {
return "unknow", nil
}
// 返回解析出来的值
return response.Value, nil
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。