json - 如何在 GET 请求中发送结构
问题描述
如果我创建一个结构,如何将它与 HTTP GET 请求一起发送到 Web 服务器端点?
package main
import (
"encoding/json"
"net/http"
)
type Payload struct {
Endpoint string `json:"endpoint"`
Data map[string]interface{} `json:"data"`
}
/*
eg.
{"endpoint":"some-service", "data": {"userID": "abc123"}}
*/
func main() {
http.HandleFunc("/service", func(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var p Payload
err := decoder.Decode(&p)
if err != nil {
panic(err)
}
// How to attach 'p' ?
resp, err := http.Get("www.example.com/" + p.Endpoint) // Add "data": p.Data
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// handle response here
})
http.ListenAndServe(":8080", nil)
}
接收此数据的端点理想情况下会将其解释为 JSON。
解决方案
HTTPGET
请求不允许请求正文。
如果你必须用 a 来做GET
,基本上你有两个选择:将数据添加为查询参数,或者在 HTTP Header 字段中发送。
请注意,URL 和标头字段都有长度限制,因此如果您想“附加”一个长 JSON 文本,它可能会失败。要发送任意数据,您应该使用另一种方法,例如POST
.
将其添加为查询参数的示例:
u, err := url.Parse("http://www.example.com")
if err != nil {
panic(err)
}
params := url.Values{}
params.Add("data", `{"a":1,"b":"c"}`)
u.RawQuery = params.Encode()
// use u.String() as the request URL
在 Header 字段中发送的示例:
req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("X-Data", `{"a":1,"b":"c"}`)
resp, err := client.Do(req)
推荐阅读
- scala - 如何从 Scala 中数据框 2 中没有的数据框 1 内容中检索数据
- c# - 创建适用于 ASP.Net 和 DynamoDB 的登录
- android - 禁用在特定时间内滑动回收器视图单元格
- jquery - 动画下拉菜单 Bootstrap 4
- three.js - 沿单轴平移 A 框架中的网格
- python - 在xml文件中插入标签
- javascript - n 是 JSON 中的有效起始字符吗?
- javascript - appendin data fto formData,对象为空
- reactjs - React-Redux Actions 可能没有未定义的“类型”属性
- mysql - 创建新记录时,Mysql 偏移量和限制会给出模棱两可的结果