如何在Cask的RawDecorator中返回带错误状态码的响应对象?
在Cask HTTP框架中使用RawDecorator验证devKey并返回错误响应
我尝试在Cask HTTP框架中使用RawDecorator验证devKey,但不清楚当devKey无效时如何返回错误响应。以下是我的尝试代码,但出现了类型不匹配错误。文档说明可以返回响应,但我未找到相关示例,请问如何返回带错误状态码的Response?
class AuthenticatedDevKey extends RawDecorator { override def wrapFunction(ctx: Request, delegate: Delegate) = { // Get the devKey from header val devKey = ctx.headers.getOrElse("devKey", "").toString // Check if this is a valid devKey if(devKey != "" && MicroServiceManager.isExistingDevKey(devKey)) delegate(Map("devKey" -> devKey)) else cask.Response("Invalid DevKey", statusCode = StatusCodes.UNAUTHORIZED) } }
问题原因
出现类型不匹配是因为wrapFunction方法的返回类型要求是DeferredResult[Response[Any]]:
- 验证通过时,
delegate(...)返回的正是这个类型 - 验证失败时,直接返回
cask.Response是Response[String]类型,和前者的DeferredResult类型不兼容
解决方法
需要将错误响应包装成DeferredResult类型,Cask提供了cask.defer方法来完成这个包装,修改后的代码如下:
class AuthenticatedDevKey extends RawDecorator { override def wrapFunction(ctx: Request, delegate: Delegate) = { // Get the devKey from header val devKey = ctx.headers.getOrElse("devKey", "").toString // Check if this is a valid devKey if(devKey != "" && MicroServiceManager.isExistingDevKey(devKey)) delegate(Map("devKey" -> devKey)) else // 用cask.defer包装错误响应,匹配返回类型 cask.defer(cask.Response("Invalid DevKey", statusCode = StatusCodes.UNAUTHORIZED)) } }
补充说明
DeferredResult是Cask的类型别名,涵盖了同步值、异步Future以及异常处理的Either类型,cask.defer可以将普通值快速转换为符合要求的DeferredResult- 如果不需要使用
StatusCodes枚举,也可以直接写状态码数字:statusCode = 401
内容的提问来源于stack exchange,提问作者Samik R
相关产品推荐
相关产品推荐

