Verwenden der HTTP-Header zum Aufheben des Marshalls einer Antwort mit spray-client
-
21-12-2019 - |
Frage
Ich benutze spray-client
um auf einen REST-Service zuzugreifen.Ein Teil der vom Server zurückgegebenen Daten befindet sich in den HTTP-Antwortheadern (der Rest befindet sich im Antworttext).
Um die Antwort aufheben zu können, verwende ich eine Unmarshaller
.Der Unmarshaller kann jedoch nur auf den Antworttext zugreifen (als Instanz von HttpEntity
) und alle Header scheinen zu diesem Zeitpunkt nicht zugänglich zu sein.
Hier ist die aktuelle Pipeline und die Unmarshaller-Codes:
implicit val IDsUnmarshaller =
Unmarshaller[List[ID]](MediaTypes.`text/plain`) {
case HttpEntity.NonEmpty(contentType, data) =>
data.asString.split("\n").toList.map( ID(_) )
}
val pipeline: HttpRequest => Future[List[ID]] = (
encode(Gzip)
~> sendReceive
~> decode(Deflate)
~> unmarshal[List[ID]]
)
Gibt es überhaupt Zugang zu ihnen, wenn man sie entmarshallt?Gibt es eine Lösung?
Lösung
Wenn Sie einen FromResponseUnmarshaller anstelle eines einfachen Unmarshallers angeben, haben Sie auch Zugriff auf die Header.
In dieser Datei finden Sie Möglichkeiten zum Erstellen von FromResponseUnmarshallern: https://github.com/spray/spray/blob/master/spray-httpx/src/main/scala/spray/httpx/unmarshalling/Deserializer.scala
Z.B.sie können eine implizite Funktion bereitstellen HttpResponse => List[ID]
und das sollte aufgegriffen werden.