Вызов API отдыха из обработчика yesod - PullRequest
1 голос
/ 09 июля 2019

У меня есть веб-сервер yesod с oauth, реализованным с использованием стандартной процедуры в yesodBook.Один из моих обработчиков POST вызывает api rest на другом веб-сервере.Для отдыха используется почтальон.Я сделал следующие изменения, чтобы он работал.Закомментировано

-- yesodMiddleware :: ToTypedContent res => Handler res -> Handler res
-- yesodMiddleware = defaultYesodMiddleware

и

isAuthorized (postBanksR a) _ = return Authorized 

сообщение отправляет мне сообщение об ошибке, когда я пытаюсь его протестировать

Status: 303 See Other 0.000248996s

В основном оно перенаправляется на auth / google.Однако, если я использую GET, это работает.

1 Ответ

2 голосов
/ 09 июля 2019

Короткий ответ : успешные запросы POST часто возвращают 303 ответа, если он успешен.Коды ошибок находятся в диапазоне 400-599 (400-499 для ошибок клиента и 500-599 для ошибок сервера).Коды состояния в диапазоне 300-399 используются для перенаправления на другую конечную точку.

сообщение отправляет мне сообщение об ошибке, когда я пытаюсь проверить его

Status: 303 See Other 0.000248996s

Это не ошибка.POST с правильными данными, как правило, возвращает перенаправление.Это связано с архитектурным шаблоном Post / Redirect / Get [wiki] .

Если запрос действителен, запрос POST, скорее всего, внесет изменения вбаза данных.Если вы не сделаете перенаправление, то обновление страницы в браузере приведет к другому запросу POST (некоторые браузеры сначала предупреждают пользователя об этом).Второе POST может привести к созданию второй записи, внесению второго платежа, заказу второго товара и т. Д. Обычно это не то, чего хочет пользователь.

Это поведение задокументировано в RFC2612 о протоколе HTTP 1.1 [ietf.org] :

Этот метод существует главным образом для разрешения вывода POST-активированного сценарияперенаправить пользовательский агент на выбранный ресурс .Новый URI не является замещающей ссылкой на первоначально запрошенный ресурс.

Мы находим аналогичный результат на Кодах ответов HTTP на странице Учебное пособие по REST API [restfulapi.net] :

303 (см. Другие)

A 303 ответ указывает, что ресурс контроллера имеетзавершил свою работу , но вместо отправки потенциально нежелательного тела ответа он отправляет клиенту URI ресурса ответа.Это может быть URI временного сообщения о состоянии или URI некоторого уже существующего, более постоянного ресурса.

Вообще говоря, код состояния 303 позволяет REST API отправлять ссылку наресурс, не заставляя клиента загружать его состояние .Вместо этого клиент может отправить запрос GET к значению заголовка Location.

Ответ 303 НЕ ДОЛЖЕН кэшироваться, но ответ на второй (перенаправленный) запрос может быть кэширован.

...