如何在 Golang 中获得 XML 响应?

时间:2021-05-18 08:20:37

标签: xml api go

我必须获得 API 请求的 XML 响应。

我写的 Go 代码是,

type RequestData struct {
    Method        string
    RelativeURL   string
    Parameters    map[string]interface{}
    URLParameters string
}
type ResponseData struct {
    StatusCode int
    Header     http.Header
    Body       map[string]interface{}
}
func ExecRequest(requestData *RequestData) (*ResponseData, error) {
    var requestParameters []byte
    var err error

    ...

    if requestData.Parameters != nil {
        // Unmarshal parameters
        requestParameters, err = xml.Marshal(requestData.Parameters)
        if err != nil {
            return nil, err
        }
    }

    // Create http request
    request, err := http.NewRequest(
        requestData.Method,
        absoluteURL,
        bytes.NewBuffer(requestParameters),
    )
    if err != nil {
        return nil, err
    }

    // Set request headers
    SetRequestHeaders(request)

    // Initialize http client
    httpClient := http.Client{}

    // Execute http request
    response, err := httpClient.Do(request)
    if err != nil {
        return nil, err
    }

    // Create response data struct
    responseData := &ResponseData{
        StatusCode: response.StatusCode,
        Header:     response.Header,
        Body:       make(map[string]interface{}),
    }

    // Convert response body type to byte slice
    defer response.Body.Close()
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        return nil, err
    }

    // Convert body type to map
    err = xml.Unmarshal(body, &responseData.Body)
    if err != nil {
        return nil, err
    }

    return responseData, nil
}

所以在这个主函数中,我调用了所有这些函数

func List(parameters map[string]string) (*sdk.ResponseData, error) {
    
    requestURL := "API endpoint"
    response, err := sdk.ExecRequest(
        &sdk.RequestData{
            Method:        "GET",
            RelativeURL:   requestURL,
            URLParameters: parameters["URLParameters"],
        },
    )
    if err != nil {
        return nil, err
    }

    return response, nil
}

所以这是我得到的错误。 它说unknown type map[string]interface {} exit status 1 我猜这个错误是因为这一行 - Body: make(map[string]interface{}), 在 ExecRequest 的 ResponseData 结构中。我不知道如何为我发送的数据获取 XML 响应,请帮帮我。基本上,在执行这个 GET 请求之后,我必须得到一个 XML 输出。

1 个答案:

答案 0 :(得分:-1)

我认为这个帖子可能会有所帮助:Unmarshal XML Into a Map

我建议将其解组为一个结构体,这是一种惯用的 Go 方法。否则,您需要从 XML 提供自定义解组器以进行映射。