背景

有台服务器A需要访问Target上的get url,发现golang代码一直报错EOF

定位过程

  1. 尝试在本地复现,没有成功,本地测试接口构造了测试接口,返回内容是线上复制的返回内容
  2. 剥离出请求代码,做测试,发现另一台B(windows)可以,这台A linux会报错EOF
  3. 使用curl(第二步就用curl可以省好多时间)发现报错curl: (52) Empty reply from server
  4. A ping Target,成功;A curl任意Target的网址都是(52) Empty reply from server
  5. 反过来,Target ping A, 成功,curl A,成功
  6. 使用curl -v --noproxy '*' http://xxx,发现能返回内容,判断是A上设置了代理

前两天遇到台服务器定位代理问题,找到同样的目录,同样的位置/etc/profile,果然有代理
image.png

代码的改动,设置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
}

vincent
49 声望2 粉丝