在JSON的GET请求中设置头信息

6

我正在以以下方式从外部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响应?


在使用 ioutil.ReadAll 读取字节后,添加 log.Println(string(body)) 来查看它是否是有效的 JSON。 - mkopriva
在使用http.Get获取响应后,设置响应头对于读取响应正文没有任何影响。您可以省略该行代码。 - mkopriva
你可能需要在HTTP请求中设置头部,而不是响应。使用req.Header.Set("name", "value")来实现。 - Dhanush Gopinath
1
服务器崩溃了?请展示疑似崩溃的代码而不是客户端。 - leaf bebop
1
错误信息非常明确,指出响应中包含了一个意外的<符号,这让我相信您收到的是HTML/XML 响应(而不是JSON)。请创建一个请求,将 Accept头部设置为application/json,并确保正确调用 API。 - Elias Van Ootegem
我刚刚将响应和最后一个请求记录到控制台,服务器崩溃时返回了一个带有403错误页面的HTML错误页面(维护中)。可能是我使用的API受到了速率限制? - Lanti
1个回答

11

你可能想在请求中设置头信息。在响应上设置头信息没有影响。

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
}

我刚刚将响应记录到控制台和最后一个请求,服务器崩溃时确实返回了一个带有403(维护中)的HTML错误页面。可能是我使用的API受到了速率限制? - Lanti
我接受你的答案,因为它解决了正确的标题设置问题。 - Lanti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接