我有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,它将起作用。
答案 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响应,但对第二个响应 (重定向)请求可能是可缓存的。