【问题标题】:How to override response status code when doing a complete of a Source[ByteString, _]?完成 Source [ByteString, _] 时如何覆盖响应状态代码?
【发布时间】:2021-03-29 16:16:59
【问题描述】:

给定如下路线:

get {
  complete(HttpEntity(ContentTypes.`application/json`, source)) 
  //say source is Source[ByteString, _] from the Http response of a third party API
}

如何将来自第 3 方 API 的响应状态代码映射(覆盖)到上述完整信息中。我知道使用 complete(Future(HttpResponse)) 可以做到这一点,但是我们如何使用 Source 来实现呢?

有没有办法使用 mapResponse 或 mapResponseEntity 来实现这一点?

【问题讨论】:

    标签: scala akka akka-stream akka-http


    【解决方案1】:

    使用同时接受代码和实体的complete 重载:

    complete(
      StatusCodes.BlockedByParentalControls, 
      HttpEntity(ContentTypes.`text/plain(UTF-8)`, source))
    

    或者自己构建整个响应并将其交给complete

    complete(HttpResponse(
      StatusCodes.BlockedByParentalControls, 
      entity = HttpEntity(ContentTypes.`text/plain(UTF-8)`, source)))
    

    【讨论】:

    • 我不想自己设置StatusCode。它必须从 Source 传递到 complete,就像从 complete(Future(HttpResponse)) 传递一样。
    • 我认为这是不可能的,响应需要先从标头开始,然后才能开始使用流。您必须以某种方式预先实现流,并观察任何会使您返回状态代码、第一个元素或诸如此类的东西。
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2014-01-08
    • 2022-01-20
    • 2015-06-26
    • 2018-07-28
    • 2017-02-07
    相关资源
    最近更新 更多