Go: как мне передать ответ JSON, не распаковывая его

Используя 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». Такое ощущение, что мне лучше построить строку в этот момент.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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)

Другие вопросы по теме