如何从请求中读取然后使用该结果执行POST请求然后处理其结果

时间:2014-09-17 13:44:09

标签: rest proxy go

我正在尝试从请求中读取然后使用该结果对另一个端点执行POST请求,然后处理其结果,然后以JSON返回其结果。

到目前为止,我的代码如下:

// POST 
func (u *UserResource) authenticate(request *restful.Request, response *restful.Response) {
    Api := Api{url: "http://api.com/api"}
    usr := new(User)
    err := request.ReadEntity(&usr)
    if err != nil {
        response.WriteErrorString(http.StatusInternalServerError, err.Error())
        return
    }

    api_resp, err := http.Post(Api.url, "text/plain", bytes.NewBuffer(usr))
    if err != nil {
        response.WriteErrorString(http.StatusInternalServerError, err.Error())
        return
    }
    defer api_resp.Body.Close()
    body, err := ioutil.ReadAll(api_resp.Body)
    response.WriteHeader(http.StatusCreated)
    err = xml.Unmarshal(body, usr)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
//  result, err := json.Marshal(usr)
//  response.Write(result)
    response.WriteEntity(&usr)
    fmt.Printf("Name: %q\n", usr.UserName)
}

我正在使用Go Restful包进行写入和读取。

编译文件时出现此错误:

src\login.go:59: cannot use usr (type *User) as type []byte in argument to bytes.NewBuffer

解决此问题的最佳方法是什么,以便我可以正确执行带有效负载的POST?

2 个答案:

答案 0 :(得分:1)

您需要将数据结构编组为切片字节。像这样:

usrXmlBytes, err := xml.Marshal(usr)
if err != nil {
    response.WriteErrorString(http.StatusInternalServerError, err.Error())
    return
}
api_resp, err := http.Post(Api.url, "text/plain", bytes.NewReader(usrXmlBytes))

答案 1 :(得分:0)

http.Postio.Reader作为第三个参数。您可以在io.Reader类型上实施User或更简单地序列化您的数据,并使用bytes pkg来实施io.Reader

b, err := json.Marshal(usr)
if err != nil {
    response.WriteErrorString(http.StatusInternalServerError, err.Error())
    return
}
api_resp, err := http.Post(Api.url, "text/plain", bytes.NewReader(b))