从restful API获取POST类型方法的响应

时间:2016-12-29 13:38:46

标签: json go marshalling decode

如何从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": {}
}

3 个答案:

答案 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)
}