Как написать ответ http вне обработчика http.ListenAndServe? - PullRequest
0 голосов
/ 08 мая 2019

Я настраиваю HTTP-сервер в Go, сообщая серверу обрабатывать все запросы с помощью функции putRequestOnQueue:

http.ListenAndServe(":6776", *handler)
http.HandleFunc("/", putRequestOnQueue)

Задача putRequestOnQueue состоит в том, чтобы поместить средство записи ответов в очередь, чтобыбыть удаленным и использованным для возврата ответа в будущем.

func putRequestOnQueue(w http.ResponseWriter, r *http.Request){
    RequestQueue.Put(responseWriter)
}

Однако, похоже, что как только ResponseWriter выходит из области видимости, сервер возвращает 200. Я думаю, это происходит потому, чтооно говорит: «О, функция, которую вы мне сказали, должна была обработать этот запрос, только что потеряла автора, так что я просто выплюну 200».

Но я не хочу такого поведения.Я хочу иметь возможность написать, когда я выберу, из другой функции.Есть ли способ, которым я могу написать ответ от другой функции без преждевременного возврата сервером 200?

1 Ответ

1 голос
/ 08 мая 2019

Как только обработчик возвращается, сервер отправляет ответ / статус.Вам понадобится что-то вроде:

func putRequestOnQueue(w http.ResponseWriter, r *http.Request){
    RequestQueue.Put(responseWriter)
    waitForResponse()
}

Другими словами, putRequestOnQueue не должно возвращаться, пока ответ не будет готов.Вы можете, например, использовать канал или что-то еще, чтобы сделать это ожидание.


Обратите внимание, однако, что это не очень идиоматичный Go.В Go мы не делаем столько асинхронных шаблонов, сколько в других языках, потому что программы стоят дешево.Каждый обработчик HTTP уже вызывается в отдельной goroutine , поэтому вы также можете использовать свой обработчик для выполнения работы вместо для отправки работы, выполняемой в другом месте .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...