我正在尝试从请求中读取然后使用该结果对另一个端点执行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?
答案 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.Post
将io.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))