http.newRequest 的 json.Marshal 正文如何
Posted
技术标签:
【中文标题】http.newRequest 的 json.Marshal 正文如何【英文标题】:json.Marshal how body of http.newRequest 【发布时间】:2014-09-30 02:01:51 【问题描述】:我正在创建一个用于管理 DigitalOcean Droplets 的小控制台,但出现此错误:
不能在 http.NewRequest 的参数中使用 s(类型 []byte)作为类型 io.Reader: []byte 没有实现 io.Reader(缺少 Read 方法)
如何将 s []bytes
转换为 func NewRequest
的良好值类型?! NewRequest
期望 Body
类型为 io.Reader
..
s, _ := json.Marshal(r);
// convert type
req, _ := http.NewRequest("GET", "https://api.digitalocean.com/v2/droplets", s)
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
req.Header.Set("Content-Type", "application/json")
response, _ := client.Do(req)
【问题讨论】:
第一:检查错误并处理它们。第二:golang.org/pkg/bytes/#NewBuffer 感谢作品!很容易 【参考方案1】:正如@elithrar 所说,使用bytes.NewBuffer
b := bytes.NewBuffer(s)
http.NewRequest(..., b)
这将从[]bytes
创建一个*bytes.Buffer
。而bytes.Buffer
实现了http.NewRequest
所需的io.Reader 接口。
【讨论】:
【参考方案2】:由于您是从某个对象开始的,因此您可以使用 Encode
而不是
Marshal
:
package main
import (
"bytes"
"encoding/json"
"net/http"
)
func main()
m, b := map[string]int"month": 12, new(bytes.Buffer)
json.NewEncoder(b).Encode(m)
r, e := http.NewRequest("GET", "https://***.com", b)
if e != nil
panic(e)
new(http.Client).Do(r)
https://golang.org/pkg/encoding/json#Encoder.Encode
【讨论】:
【参考方案3】:使用bytes.NewReader 从[]byte
创建一个io.Reader
。
s, _ := json.Marshal(r);
req, _ := http.NewRequest("GET",
"https://api.digitalocean.com/v2/droplets",
bytes.NewReader(s))
【讨论】:
以上是关于http.newRequest 的 json.Marshal 正文如何的主要内容,如果未能解决你的问题,请参考以下文章