akka 处理和操纵HTTP响应列表

iqjalb3h  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(158)

我目前正在尝试实现API逻辑从服务器获取多个图像,这个服务器接受一个图像id,并返回一个HTTP响应,其中包含PNG格式的图像作为一个实体。
现在,我们要添加一个新的端点,它接受一个图像ID列表并返回所有图像的列表:
我已经做了以下工作:

def getImagesFromIds(IdsList: List[String]): Future[List[HttpResponse]] = {
    Future.sequence {
      IdsList.map(
        id => getImageById(id)
      )
    }
  }

此函数将接收一个id列表并调用getImageById来获取所有图像,它将返回一个HttpResponse列表。
对于路由定义,我做了以下工作:

def getImagesByIdsListRoute: Route = get {
    path("by-ids-list") {
      entity(as[List[String]]){
        upcs =>
          complete(getImagesFromIds(upcs))
      }
    }
  }

但我收到以下错误消息:

未找到参数m的隐式表达式:封送行程。到回应封送行程[清单[http回应]]

有没有人知道我们如何马歇尔一个http响应列表,或者是否有任何方法可以改进这个逻辑来获取多个http响应?

dzhpxtsq

dzhpxtsq1#

如果我理解正确的话,您希望下载多个图像并将其作为HTTP响应返回。

您目前尝试的问题

1.通过getImageById对API的调用返回HttpResponse。您无法确定此API调用的结果是什么。如果调用失败,则响应将根本不包含任何图像。
1.您试图返回List[HttpResponse]作为您的响应。该如何序列化该响应?Akka不知道您的意思,并试图找到一个将您的对象序列化的编组器(例如,到JSON),但找不到。
1.返回图像列表需要对其进行压缩。您不能在单个HTTP响应中返回多个实体。

可能的方法

1.您必须更改getImageById,以便它检查HttpResponse中的内容并返回实体字节。
示例:

response match {
  case HttpResponse(StatusCodes.OK, _, entity, _) =>
    entity.dataBytes
  case resp @ HttpResponse(code, _, _, _) =>
    // Response failed and we don't care about the response entity
    // Details: https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html
    resp.discardEntityBytes()
    // Decide yourself how you want to handle failures
    throw new RuntimeException("Request failed, response code: " + code)
}
  1. dataBytes返回一个Source,所以你会得到一个SourcesList。你必须通过连接它们,例如通过concat
    1.结果流必须通过Compression.gzip压缩。
    1.最后,可以将流放入getImagesByIdsListRoutecomplete方法中。

相关问题