我目前正在尝试实现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响应?
1条答案
按热度按时间dzhpxtsq1#
如果我理解正确的话,您希望下载多个图像并将其作为HTTP响应返回。
您目前尝试的问题
1.通过
getImageById
对API的调用返回HttpResponse
。您无法确定此API调用的结果是什么。如果调用失败,则响应将根本不包含任何图像。1.您试图返回
List[HttpResponse]
作为您的响应。该如何序列化该响应?Akka不知道您的意思,并试图找到一个将您的对象序列化的编组器(例如,到JSON),但找不到。1.返回图像列表需要对其进行压缩。您不能在单个HTTP响应中返回多个实体。
可能的方法
1.您必须更改
getImageById
,以便它检查HttpResponse
中的内容并返回实体字节。示例:
dataBytes
返回一个Source
,所以你会得到一个Sources
的List
。你必须通过连接它们,例如通过concat
。1.结果流必须通过
Compression.gzip
压缩。1.最后,可以将流放入
getImagesByIdsListRoute
的complete
方法中。