当前位置: 首页 > 知识库问答 >
问题:

如何在Ktor中获得call.reponse的超文本传输协议?

池恩
2023-03-14

我用Ktor构建了一个Web服务器,并想缓存API方法结果。但是我不知道如何从下面call.response.代码中获取响应正文

fun Application.module(){

    // before method was called
    intercept(ApplicationCallPipeline.Features) {
        val cache = redis.get("cache")
        if(cache) {
            call.respond(cache)
        }

        return @intercept finish()
    }
    
    // after method was called
    intercept(ApplicationCallPipeline.Fallback) {
        // TODO, how to get call.response.body
        redis.set("cache", call.response.body)
    }
}

如果我无法获得响应体,还有其他解决方案可以在Ktor中缓存API方法的结果吗?

共有1个答案

慎俊艾
2023-03-14

在拦截器内,用于应用程序调用管道(ApplicationCallPipeline)。功能阶段您可以在ApplicationSendPipeline之前添加一个阶段。引擎并拦截它以检索响应正文(内容):

val phase = PipelinePhase("phase")
call.response.pipeline.insertPhaseBefore(ApplicationSendPipeline.Engine, phase)
call.response.pipeline.intercept(phase) { response ->
    val content: ByteReadChannel = when (response) {
        is OutgoingContent.ByteArrayContent -> ByteReadChannel(response.bytes())
        is OutgoingContent.NoContent -> ByteReadChannel.Empty
        is OutgoingContent.ReadChannelContent -> response.readFrom()
        is OutgoingContent.WriteChannelContent -> GlobalScope.writer(coroutineContext, autoFlush = true) {
            response.writeTo(channel)
        }.channel
        else -> error("")
    }

    // Do something with content
}

 类似资料:
  • 我有这个问题: 我需要从服务器下载一个zip文件,这个zip包含。xod和。巴布亚新几内亚。我正在使用AngularJS,JavaSpring,来克服跨域问题,我的htt。获取java spring控制器的角度调用,它将进行真正的get调用。我必须下载zip- 这是我的角度代码: 这是java spring代码: 这是控制台。日志: Object{data:"UEsDBBQACAAIAA5Ipkg

  • 调用SOAX Web服务,并使用groovy脚本检查Web服务响应的超文本传输协议状态。在《骡子3》中,精彩的剧本是... 骡子4中的等价物是什么?谢谢。

  • 我正在阅读以下文档: https://metrics.dropwizard.io/4.2.0/getting-started.html 我已添加 但是接下来要做什么?如何访问指标?

  • 我正在使用下面的代码登录apiendpoint并从中检索数据,但响应似乎已编码,我无法读取内容。我正在使用request-requestes-0.0.1 当我在控制台上打印相同的响应 有人能告诉我如何解码和读取响应中的数据吗

  • 为什么它不起作用? 返回java.net中的错误=

  • 我使用Laravel 8。用户点击一个包含id的链接#()我的应用程序从浏览器收到一个$请求,并通过我的问题是如何将id#输入php变量?