Используя Go, я пытаюсь получить несколько ответов JSON одновременно с нескольких конечных точек. Я хотел бы прикрепить каждый из этих ответов к полям в структуре или карте и вернуть эту структуру/карту как объект JSON. (Бэкэнд для паттерна Frontend). Поэтому я сделаю веб-запрос к приложению Go с каким-то идентификатором. Он, в свою очередь, сделает несколько веб-запросов и скомпилирует данные в один большой объект, чтобы вернуть его в качестве ответа.
Я использую Fiber в качестве своего фреймворка, но любой общий веб-фреймворк будет похож:
app.Get("/requests/:identifier", func(c *fiber.Ctx) error {
identifier := c.Params("identifier")
timeout := 1600 * time.Millisecond
client := httpclient.NewClient(httpclient.WithHTTPTimeout(timeout))
res, err := client.Get("https://www.example.com/endpoint?id = " + identifier, nil)
if err != nil{
logger.Error("Timout value exceeded")
return c.Status(503).SendString("Socket Timeout")
}
logger.Info("Fetch success: ")
// Heimdall returns the standard *http.Response object
body, err := ioutil.ReadAll(res.Body)
code := 200
response := &main_response{
Service1: body,
}
return c.Status(code).JSON(response)
})
Проблема, с которой я сталкиваюсь, заключается в том, что мне не нужно разбирать эти данные в Go, так как они мне не нужны (я просто передаю их). Должен ли я демаршалировать его, чтобы я мог установить его как поле в моей структуре ответа, как это?
type main_response struct {
Service1 []byte `json:"service1"`
Service2 map[string]string `json:"service2"`
Service3 map[string]interface{} `json:"service3"`
}
(Я пробовал несколько разных способов сделать это. Попытка использовать массив байтов, кажется, base64 кодирует ответы)
Я хочу маршалировать эту структуру в JSON, прежде чем возвращать ее, поэтому, возможно, у меня мало выбора, поскольку я не могу придумать способ сказать Go «маршалировать только основную структуру, все остальное уже JSON». Такое ощущение, что мне лучше построить строку в этот момент.

Используйте json.RawMessage, чтобы скопировать []byte, содержащий JSON, непосредственно в ответный документ JSON:
type main_response struct {
Service1 json.RawMessage `json:"service1"`
...
}
response := &main_response{
Service1: body,
}
return c.Status(code).JSON(response)