在JSON get请求中设置标头

时间:2018-01-02 11:23:53

标签: 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)
}

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

2018/01/02 12:13:35 invalid character '<' looking for beginning of value

我认为代码尝试将JSON响应解析为HTML。我如何强制将响应作为JSON?

1 个答案:

答案 0 :(得分:3)

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

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
}