J'ai un HTTP Akka existant HttpRequest
et je veux y ajouter deux en-têtes.
req.withHeaders(req.headers ++ hs)
Attendu :
HttpRequest
avec les en-têtes supplémentaires Actuel:
.addHeaders
attend un java.lang.Iterable
et ne compile pas. Quelle est la manière recommandée de faire cela dans Scala?
Il existe une solution de contournement, mais elle est un peu brouillonne:
val req: HttpRequest = ??? val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b")) req.addHeaders(hs)
Exécution de Scala 2.12.8 et Akka HTTP 10.1.7.
3 Réponses :
Une alternative consiste à utiliser foldLeft
et addHeader
:
val req: HttpRequest = ??? val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b")) hs.foldLeft(req)((r, h) => r.addHeader(h))
Ce n'est toujours pas très lisible. Je me demande s'il y a une raison pour laquelle «.addheaders» est pour l'API Java mais pas pour Scala.
Vous pouvez copier la HttpRequest existante dans une nouvelle HttpRequest avec les en-têtes
val req: HttpRequest = ??? val hs: Seq[HttpHeader] = Seq(RawHeader("a", "b")) val reqWithHeaders: HttpRequest = req.copy(headers=hs)
Cela ajoute-t-il ou remplace-t-il les en-têtes précédents?
Cela remplace les en-têtes précédents. Si vous voulez également des en-têtes antérieurs, changez-les en val reqWithHeaders: HttpRequest = req.copy (headers = this.headers ++ hs)
..qui n'est pas très différent de la solution de contournement dans ma question. De toute façon, aucune des réponses n'a mentionné pourquoi Akka HTTP prendrait en charge une seule syntaxe ( .addHeaders
) uniquement pour l'API Java. C'était censé être la question.
Je ne suis pas sûr mais je pense que Scala HttpHeader étend jm.HttpHeader (akka.http.javadsl.model, Java Model) Et addHeaders, withHeaders
sont des méthodes de jm.HttpHeaders, donc pour les remplacer, la signature de méthode doit être identique à la méthode Jm.HttpHeaders. Par conséquent, Scala HttpHeaders
prend java Iterable pour certaines de ses méthodes. Encore une fois, la réponse est ma compréhension du code source. N'hésitez pas à me corriger.
Une autre solution de contournement qui est peut-être un tout petit morceau moins brouillon. C'est à peu près ainsi que addHeaders
est défini dans la source . Je n'ai malheureusement aucune idée de la raison pour laquelle addHeaders
n'est pas exposé dans l'API scala.
req.mapHeaders(_ ++ hs)
Neat et merci pour le lien vers les sources - je les vérifie trop rarement. La vraie réponse semble être d'implémenter .addHeaders sur l'API Scala mais je ne travaille pas vraiment avec Akka HTTP pour le moment, donc je ne serai pas celui qui le fera.