Обслуживание динамических данных ответа длины
У меня есть приложение, созданное с помощью 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, я могу начать отправку в браузер клиента.
Является ли это возможным? Вернуть какой-нибудь интерфейс считывателя в gin-gonic, и он будет читать с него до открытия?
Обновить. Есть функция DataFromReader. Пример: https://gin-gonic.com/api-example/serving-data-from-reader/. Но для этого необходимо установить Content-Length . Для моих данных у меня нет этого значения. Таким образом, этот заголовок не должен быть установлен.
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 ("]"))}
Но нет хорошего способа справиться с ошибками. Это требует более сложного дизайна