[英]Handling and manipulating a list of http responses
我目前正在尝试实现 API 逻辑以从服务器获取多个图像。 此服务器接受图像 ID 并返回 HTTP 响应,其中包含 PNG 格式的图像作为实体。
现在,我们要添加一个新的端点,它接受图像 ID 列表并返回所有图像的列表:
我做了以下事情:
def getImagesFromIds(IdsList: List[String]): Future[List[HttpResponse]] = {
Future.sequence {
IdsList.map(
id => getImageById(id)
)
}
}
这个 function 将收到一个 id 列表,并将调用 getImageById 来获取所有图像,它将返回一个 HttpResponse 列表。
对于路线定义,我做了以下工作:
def getImagesByIdsListRoute: Route = get {
path("by-ids-list") {
entity(as[List[String]]){
upcs =>
complete(getImagesFromIds(upcs))
}
}
}
但我收到以下错误消息:
没有找到参数 m 的隐式:marshalling.toresponsemarshallable[list[httpresponse]]
有没有人知道我们如何编组 http 响应列表,或者是否有任何方法可以改进此逻辑以获取多个 http 响应?
如果我理解正确的话,你想要下载多张图片并将它们作为 HTTP 响应返回。
getImageById
调用 API 返回一个HttpResponse
。 您无法确定这个 API 调用的结果是什么。 如果失败,响应将根本不包含任何图像。List[HttpResponse]
作为您的响应。 这个响应应该如何序列化? Akka 不知道你的意思,并试图找到一个将序列化你的 object (例如到 JSON)但找不到的编组器。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)
}
dataBytes
返回一个Source
所以你最终会得到一个List
of Sources
。 您必须通过连接它们,例如通过concat
。Compression.gzip
。getImagesByIdsListRoute
的complete
方法中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.