在 JSON 获取请求中设置标头

Lan*_*nti 4 json go

我通过以下方式从外部 API 获得 JSON 响应:

func Request(url string, contentType string) []byte {
    resp, err := http.Get(url)
    resp.Header.Set("Content-Type", contentType)
    if err != nil {
        log.Fatal(err)
    }

    body, err := ioutil.ReadAll(resp.Body)
    resp.Body.Close()
    if err != nil {
        log.Fatal(err)
    }

    return body
}

url := fmt.Sprintf("https://example.com/api/category/%s", category)
contentType := "application/json"
body := Request(url, contentType)

res := &JSONRespStruct{}
err := json.Unmarshal([]byte(body), res)
if err != nil {
    log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果我开始使用 对我的网站进行基准测试go-wrk,服务器会崩溃并显示以下错误消息:

2018/01/02 12:13:35 invalid character '<' looking for beginning of value
Run Code Online (Sandbox Code Playgroud)

我认为代码尝试将 JSON 响应解析为 HTML。如何强制以 JSON 格式获取响应?

Cer*_*món 9

您可能希望在请求上设置标头。在响应上设置标头没有影响。

func Request(url string, contentType string) []byte {
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatal(err)
    }
    req.Header.Set("Content-Type", contentType)
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    return body
}
Run Code Online (Sandbox Code Playgroud)