You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:25:23