簡體   English   中英

處理和操作 http 響應列表

[英]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 響應返回。

您當前嘗試的問題

  1. 通過getImageById調用 API 返回一個HttpResponse 您無法確定這個 API 調用的結果是什么。 如果失敗,響應將根本不包含任何圖像。
  2. 您正在嘗試返回List[HttpResponse]作為您的響應。 這個響應應該如何序列化? Akka 不知道你的意思,並試圖找到一個將序列化你的 object (例如到 JSON)但找不到的編組器。
  3. 返回圖像列表需要壓縮它們。 您不能在單個 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所以你最終會得到一個List of Sources 您必須通過連接它們,例如通過concat
  2. 結果 stream 必須通過Compression.gzip
  3. 最后,可以將 stream 放入getImagesByIdsListRoutecomplete方法中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM