json - 如何在 GET 请求中发送结构

标签 json http go

如果我创建一个结构,如何将它与 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。

最佳答案

HTTP GET requests 不允许请求正文。

如果您必须使用 GET ,基本上您有 2 个选项:将数据添加为查询参数,或将其发送到 HTTP header 字段中。

备注 URL 和 header 字段都有长度限制,所以如果你想“附加”一个长的 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)

关于json - 如何在 GET 请求中发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60988428/

相关文章:

json - 声明一个符合协议(protocol)的泛型常量

javascript - 如何在 Node.js 中将变量从 ejs 获取到 app.js?

c# - 嵌套 JObject 被序列化为空数组

apache - 多线程如何影响 http keep-alive 连接?

http - nginx 将所有非 WWW 重定向到 HTTPS WWW

go - 如何找到等于数组中任意值的字段值

ios - AF网络应用程序/json

javascript - 使用 Linux/Windows CLI 行工具模拟 JavaScript 按钮单击(http 请求)

go - 如何创建一个只接收 channel 的 channel ?

go - 如何访问传递给 Go 程序的命令行参数?