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 正文如何的主要内容,如果未能解决你的问题,请参考以下文章

go 爬虫

golang:模拟http post请求

go 爬取图片

使用 auth 访问 http 代理

如何在http get请求中设置标头?

go语言中通过http访问需要认证的api