2
votes

Ajout d'en-têtes à une requête HTTP HttpRequest Akka

J'ai un HTTP Akka existant HttpRequest et je veux y ajouter deux en-têtes.

req.withHeaders(req.headers ++ hs)

Attendu :

  • un nouvel objet 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.


0 commentaires

3 Réponses :


2
votes

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))


1 commentaires

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.



1
votes

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)


4 commentaires

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.



2
votes

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)


1 commentaires

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.