haskell - 如何将 DELETE 请求卷曲到 Yesod?
问题描述
我有一个小的 JSON api,我正在 Yesod 中构建它。为了测试我使用 cUrl 的 API。但是,以下请求返回405 method not allowed
:
curl -X DELETE -H "X-User-Name: $name" -H "X-User-Token: $token" -H "accept:application/json" http://localhost:3000/login
路由文件肯定包含DELETE
作为登录路由上的方法。我正在使用defaultYesodMiddleware
.
这是处理程序:
-- ^ Invalidate the user token
deleteLoginR :: Handler Aeson.Value
deleteLoginR = authenticateUser >>= \u ->
let newU = u { DS.token = "" } in
DS.saveEntity newU >>= \case
Left e -> sendResponseStatus status500 (cs e :: Text)
Right _ -> sendResponseStatus status200 ("Logged out" :: Text)
这是authenticateUser
功能:
{-| Check that a user is properly logged in using the authentication headers -}
authenticateUser :: Handler User
authenticateUser = lookupHeader "X-User-Name" >>= \case
Nothing ->
sendResponseStatus status406 ("X-User-Name not set" :: Text)
Just name ->
lookupHeader "X-User-Token" >>= \case
Nothing ->
sendResponseStatus status406 ("X-User-Token not set" :: Text)
Just token ->
(DS.loadEntities ["User"] constraints Nothing :: Handler (Either Text [User]))
>>= \case
Left e -> sendResponseStatus status500 (cs e :: Text)
Right records -> pure $ List.head records
where constraints = [ Where ("name", Equals, cs name)
, Where ("token", Equals, cs token)
]
和路线声明:
/login LoginR GET POST PATCH DELETE
任何人都可以启发我吗?
解决方案
解决它!这是堆栈中的某种缓存问题,它缓存了旧版本的路由文件。杀戮yesod devel
和奔跑stack build --force-dirty
修复了它。
推荐阅读
- vba - VBA .Execute findText:= 多个选项
- ios - 我们可以有一个圆角而不应用 masktobounds
- python - Pandas - 使用可变列输入计算新列
- react-native - undefined 不是来自 redux 的对象 this.props.auth
- c# - 如何针对 Cron 表达式测试日期
- java - Java Veracode 扫描 - SQL 注入的误报
- tfs - 如何在 TFS 2018 的其他现有发布定义中重用发布和环境变量?
- c# - Fluent Assertions Should().Should().BeEquivalentTo 忽略排除的成员
- javascript - Javascript 代码在调试时正确执行,但在没有运行浏览器开发工具的情况下无法工作
- intellij-idea - 对象到类实例类型转换在正常调试中失败,但在评估模式下传递