Как вы отправляете структуру в запросе GET? - PullRequest
0 голосов
/ 02 апреля 2020

Если я создаю структуру, как мне отправить ее с HTTP-запросом GET на конечную точку веб-сервера?

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.

1 Ответ

1 голос
/ 02 апреля 2020

HTTP GET запросы не допускают тела запроса.

Если вам нужно сделать это с GET, в основном у вас есть 2 варианта: добавить данные в качестве параметра запроса или отправить их в поле заголовка HTTP.

Обратите внимание , что поля 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

Пример отправки его в поле заголовка:

req, err := http.NewRequest("GET", "http://example.com", nil)
// ...
req.Header.Add("X-Data", `{"a":1,"b":"c"}`)
resp, err := client.Do(req)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...