如何从POST方法中获取json响应?目前我只能获取状态 - 401 Unauthorized和StatusCode - 401
func postUrl(url string, byt []byte) (*http.Response, error) {
tr := &http.Transport{
DisableCompression: true,
}
client := &http.Client{Transport: tr, Timeout: 10 * time.Second}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(byt))
req.Header.Set("X-Custom-Header", "myvalue")
req.Header.Set("Content-Type", "application/json")
req.Header.Add("Authorization", "Basic "+basicAuth("username", "password"))
resp, err := client.Do(req)
return resp, err
}
上面的代码产生输出:
{
"errorMessages": [
"You do not have the permission to see the specified issue.",
"Login Required"
],
"errors": {}
}
答案 0 :(得分:1)
无论您获得什么状态,读取响应的方式(如果有的话)都是相同的。
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
答案 1 :(得分:0)
正如弗兰克所说,无论响应中的状态代码如何,您都可以简单地阅读其正文以使用其拥有的任何内容。
特别是对于JSON消息的情况,根据您是否事先知道JSON消息结构(或希望您的代码依赖于它),您有两个选项。
如果您知道结构并且可以进行硬编码(并且您获得了一些类型安全性和更好的客户端代码),您可以:
type ErrorResponse struct {
Messages []string `json:"errorMessages"`
}
然后当您检测到错误状态代码时,将响应正文解组为该结构:
if resp.StatusCode % 100 != 2 {
var error ErrorResponse
err := json.Unmarshall(resp.Body, &error)
// check err != nil ...
// user error.ErrorMessages for whatever you want
}
或者,如果您不想依赖于JSON结构(在某种程度上),您可以尝试将其解组为map [string] interface {}并尝试以您认为的通用方式使用它可以(通常不是很有用)。
答案 2 :(得分:0)
此问题与http响应和http方法无关。用json解码器解码json字符串(在这种情况下是http响应体)。
(与您的代码段没有直接关系)
type Transition struct {
Transition map[string]int
}
func main() {
resp, err := postUrl(url, byt)
if err != nil {
log.Fatal(err)
}
var trans Transition
decoder := json.NewDecoder(resp.Body)
if err := decoder.Decode(&trans); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", trans)
}