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

如何使用ktor客户端设置HttpServlet响应的正文

鱼渝
2023-03-14

我有spring boot控制器

@PostMapping(path = ["/download"])
fun getFile(@RequestBody myObjectRq: myObjectRq, httpServletResponse: HttpServletResponse): CompletableFuture<HttpServletResponse> {
    return GlobalScope.async {
       val response = webService.getFile(myObjectRq)
       response?.let {
           httpServletResponse.setHeader("Content-Type", response.headers.get("Content-Type"))
           httpServletResponse.setHeader("Content-Disposition", response.headers.get("Content-Disposition"))
           httpServletResponse.writer.write(String(response.content.toByteArray()))
           httpServletResponse.writer.flush()
           httpServletResponse.status = response.status.value
       }
       httpServletResponse
   }.asCompletableFuture()
}

在其中,我使用服务,该服务反过来使用ktor客户端向外部服务器发送post请求,该服务器应响应发送csv文件。csv文件内容取决于我在myObjectRq中发送的值。

服务:

suspend fun getFile(myObjectRq: myObjectRq): HttpResponse {
    val response = ktorClient.post<HttpResponse> {
        accept(ContentType.Application.OctetStream)
        url(externalWebServerUrl)
        body = myObjectRq
        contentType(ContentType.Application.Json)
    }
    log.info(String(response.content.toByteArray()))
    response
}

正确设置响应的标头,以及日志。方法中的info(String(response.content.toByteArray())打印出接收文件的内容,但我不能将其设置为HttpServletResponse的主体。我不断得到组织。springframework。网状物HttpMediaTypeNotAcceptableException:找不到可接受的表示。

此外,我还得到了httpServletResponse的不适当的阻塞方法调用。编写器哪种中断了ktor客户端的异步质量。我做错了什么?我应该如何解决?

共有2个答案

暨正真
2023-03-14

我实际上设法使用CompletableFuture解决了这个问题

景英杰
2023-03-14

所以,我认为SpringBoot与您的返回类型相混淆。它试图找到一种方法来序列化您的返回

@PostMapping(path = ["/download"])
fun getFile(@RequestBody myObjectRq: myObjectRq, httpServletResponse: HttpServletResponse): CompletableFuture<Void> {
    return GlobalScope.async {
       val response = webService.getFile(myObjectRq)
       response?.let {
           httpServletResponse.setHeader("Content-Type", response.headers.get("Content-Type"))
           httpServletResponse.setHeader("Content-Disposition", response.headers.get("Content-Disposition"))
           httpServletResponse.writer.write(String(response.content.toByteArray()))
           httpServletResponse.writer.flush()
           httpServletResponse.status = response.status.value
       }
       null
   }.asCompletableFuture()
}
 类似资料:
  • 我正在spring应用程序中使用web客户端 我在执行相同操作时面临内存泄漏问题 我正在使用下面的代码获取来自服务的非2xx响应的响应体: 我的问题是,如果我在responseMono上使用dispose方法,处理过程需要很长的时间,而没有它,我会面临内存泄漏问题。我在这里做错什么了吗?

  • 由于我需要使用一些旧服务器,并且由于已从Java8中删除,因此我需要重新启用一些基于RC4的密码。如发行说明中所述,我们必须使用。由于我使用的是Apache HTTP客户端,因此无法找到执行此操作的方法。提前感谢!(我还发现了相当多的半挂车问题,但没有答案,所以想发布一个新的)

  • 在我做了插座之后。多房间聊天应用程序的IO服务器如何使用https://github.com/socketio/socket.io-client-java ? 我搜索了很多,在socket的客户端还没有找到最新的例子。对于android,大多数教程和示例都是针对带有节点的服务器端的。js。

  • 我正在从事RESTWeb服务项目,目前实际上在mozilla的rest客户端中(chrome://restclient/content/restclient.html)它将获取{“id”:“1234”}作为请求json,获取id的详细信息,并从数据库中提供id的所有详细信息,然后转换为json数组,最后将其存储在responsetoservice对象中。 当我点击服务url时,请求到达服务器,状态

  • 问题内容: 因此,已经有一个必须在控制台上运行的Python程序设置了。我将使用Javascript为应用程序构建Web GUI界面。我将如何: 一种。开始处理此Python程序的输入/输出,而无需触摸原始代码。 b。通过Javascript调用将控制台输入发送到Python程序。我已经研究了原始的HTTP请求/ AJAX,但不确定如何将其作为输入发送到Python程序。 问题答案: 一种。处理程

  • 自定义成菜单 说明: 1)启用该功能后,直播客户端可以通过自定义菜单的方式加载用户自定义的网页,方便结合自身业务进行交互操作(客户端5.0.0以上版本支持) 问卷设置 说明: 1)在直播管理页面点击 “问卷设置”,启用该功能后,直播客户端可以通过接口请求的方式将用户问卷库中的问卷导入到客户端中使用 2)关于问卷设置的具体功能及使用方法,请参考:问卷接口开发指南 菜单设置 说明: 1)支持对客户端的