json.Marshal如何体内http.newRequest

时间:2014-08-06 23:57:46

标签: json go type-conversion

我正在努力创建一个用于管理数字海洋飞沫的小控制台,这是我第一次体验Go ..

我有这个错误

cannot use s (type []byte) as type io.Reader in argument to http.NewRequest:
[]byte does not implement io.Reader (missing Read method)

如何为func NewRequest转换一个好类型值的s []字节?! 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)

谢谢!

3 个答案:

答案 0 :(得分:18)

正如@elithrar所说使用bytes.NewBuffer

b := bytes.NewBuffer(s)
http.NewRequest(..., b) 

这将从*bytes.Buffer创建[]bytes。并且bytes.Buffer实现了http.NewRequest所需的io.Reader接口。

答案 1 :(得分:1)

由于您是从某个对象开始的,因此您可以使用 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://stackoverflow.com", b)
   if e != nil {
      panic(e)
   }
   new(http.Client).Do(r)
}

https://golang.org/pkg/encoding/json#Encoder.Encode

答案 2 :(得分:1)

使用 bytes.NewReaderio.Reader 创建 []byte

s, _ := json.Marshal(r);
req, _ := http.NewRequest("GET",
   "https://api.digitalocean.com/v2/droplets",
   bytes.NewReader(s))