从yesod处理程序调用rest API

时间:2019-07-09 13:49:58

标签: haskell yesod

我有yesod网络服务器,使用yesodBook中的标准过程实现了oauth。 我的一个POST处理程序在另一个Web服务器中调用了REST API。 休息使用邮递员。我进行了以下更改以使其起作用。 已注释掉

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

isAuthorized (postBanksR a) _ = return Authorized 

当我尝试对其进行测试时,帖子要求我输入错误

Status: 303 See Other 0.000248996s

基本上,它重定向到auth / google。 但是,如果我使用GET,它将起作用。

1 个答案:

答案 0 :(得分:2)

简短答案:成功的POST请求成功后通常会返回303响应。错误代码在400-599范围内(其中400-499用于客户端错误,500-599用于服务器错误)。 300-399范围内的状态代码用于重定向到另一个端点。

  

当我尝试对其进行测试时,帖子要求我输入错误

Status: 303 See Other 0.000248996s

这不是 错误。具有正确数据的POST通常会返回重定向。这是由于Post/Redirect/Get architectural pattern [wiki]

如果请求有效,则POST请求可能会更改数据库。如果您不进行重定向,则刷新浏览器上的页面将导致另一个POST请求(某些浏览器会首先向用户发出警告)。第二次发布POST可能会导致创建第二条记录,进行第二次付款,订购第二个项目等。这通常不是用户想要的。

此行为记录在RFC 2612 about the HTTP 1.1 protocol [ietf.org]中:

  

此方法主要用于允许输出POST激活的   脚本将用户代理重定向到所选资源。新的   URI不能替代原始请求   资源。

我们在The HTTP Response Codes page on REST API Tutorial [restfulapi.net]上发现了类似的结果:

  

303(另请参见)

     

303响应指示控制器资源已完成其   工作,但是与其发送可能不受欢迎的响应正文,   它向客户端发送响应资源的URI。这可以是   临时状态消息的URI,或某些已经存在的URI   现有的,更永久的资源。

     

通常来说,状态码303是,它允许REST API发送   引用资源而不强制客户端下载资源   状态。而是,客户端可以将GET请求发送到的值   位置标头。

     

绝不能缓存303响应,但对第二个响应   (重定向)请求可能是可缓存的。