Обслуживание данных ответа с динамической длиной

У меня есть приложение, созданное с помощью gin-gonic и golang. Приложение возвращает JSON по запросу. Мой JSON - это массив некоторых структур. У меня есть структуры, созданные одна за другой, когда все будут готовы, я делаю вывод с помощью c.String

func getData(c *gin.Context) {
    jsondoc, err := GetData()

    if err != nil {
        handleError(c, err)
        return
    }
    c.Header("Content-Type", "application/json; charset=utf-8")
    c.String(200, jsondoc)
}

Я хочу провести оптимизацию. Я хочу начать отправку данных пользователю, когда не готов полный JSON. Когда у меня есть первые изображения JSON, я могу начать отправку в клиентский браузер.

Является ли это возможным? Вернуть какой-нибудь читательский интерфейс в джин-гоник, и он будет читать с него до тех пор, пока не откроется?

Обновлять. Есть функция DataFromReader. Например, https://gin-gonic.com/api-example/serving-data-from-reader/. Но для этого требуется установить Content-Length. Для моих данных у меня нет этого значения. Итак, этот заголовок устанавливать не нужно.


person Roman Gelembjuk    schedule 10.02.2019    source источник
comment
golang.org/src/encoding/json/stream.go   -  person Willem    schedule 10.02.2019


Ответы (1)


Я нашел способ сделать это. Это просто, просто напишите свой ответ c.Writer

func getData(c *gin.Context) {
    c.Statue(200)
    c.Header("Content-Type", "application/json; charset=utf-8")
    GetData(c.Writer)
}
func GetData(res io.Writer) {
    res.Write([]byte("["))
    res.Write(moreBytes)
    res.Write(moreBytes2)

..... res.Write ([] byte ("]"))}

Но нет хорошего способа обрабатывать ошибки. Это требует более сложного дизайна

person Roman Gelembjuk    schedule 11.02.2019