2017-07-06 2 views
1

J'ai une application akka-http qui utilise des flux akka pour le traitement des données. Donc, il est logique de compléter la demande avec Source[Result, _] pour obtenir la contre-pression à travers la frontière HTTP gratuitement.Comment compléter une réponse Http Akka avec le code de statut Stream et Custom

Versions:

  • AKKA-http 10.0.7
  • AKKA-flux
  • 2.5.2 akka 2.5.2

Ceci est la version simplifiée du code, et ça fonctionne très bien.

pathEnd { post { entity(asSourceOf[Request]) { _ => 
    complete { 
     Source.single("ok") 
    } 
}}} 

Depuis cette enpoint est censé créer et entité, au lieu de retourner 200 OK au demandeur, je voudrais revenir le code 204 d'état CRÉÉ. Cependant, je ne pouvais pas trouver un moyen de le faire:

  • complete { Created -> source.single("ok") } échoue compilation avec Type mismatch, expected: ToResponseMarshallable, actual: (StatusCodes.Success, Source[String, NotUsed])
  • complete { source.single((Created, "ok")) } échoue avec Type mismatch, expected: ToResponseMarshallable, actual: Source[(StatusCodes.Success, String), NotUsed]
  • complete(Created) { Source.single("ok") } échoue avec Type mismatch, expected: RequestContext, actual: Source[String,NotUsed]
  • complete(Created, Source.signle("ok") échoue avec too many arguments for method complete(m: => ToResponseMarshallable)

Il semble que custom marshaller pourrait être un moyen pour y parvenir, mais cela signifie essentiellement que je vais avoir besoin d'un unmarshaller par point de terminaison, ce qui n'est pas très pratique ou clair. Donc, la question est, y at-il un moyen (plus pratique que personnalisé unmarshaller) pour compléter la demande avec Source[_,_] tout en fournissant également le code d'état.

+0

Vous ne pouvez pas simplement envoyer un 'StatusCodes.Created' comme premier paramètre à' complete'? – Kraylog

+0

@NimrodArgov Mise à jour de la question - en bref soit je fais quelque chose de mal, ou ça ne marche pas aussi bien. Mais merci pour suggestion! – J0HN

+0

Je voulais dire 'complete (Created, Source.single (" ok "))' – Kraylog

Répondre

0

De the documentation:

complete(Created -> "bar") 

Si vous voulez fournir des Source des données puis construire le HttpResponse et le transmettre à complete:

import akka.http.scaladsl.model.HttpEntity.Chunked 
import akka.http.scaladsl.model.ContentTypes 
import akka.http.scaladsl.model.HttpEntity.ChunkStreamPart 

complete { 

    val entity = 
    Chunked(ContentTypes.`text/plain(UTF-8)`, 
      Source.single("ok").map(ChunkStreamPart.apply)) 

    HttpResponse(status = Created, entity=entity) 
} 
0

je frappe ce problème et a pris l'approche de l'utilisation mapResponse pour remplacer le code d'état. C'est l'approche la plus simple que j'ai trouvée.

mapResponse(_.copy(status = StatusCodes.Accepted)) { 
    complete { 
    Source.single("ok") 
    } 
}  

L'inconvénient de la réponse de Ramon est que vous devenez responsable à la fois le flux de triage (à un ByteString), et pour la négociation de contenu.

+0

Merci, je vais essayer et vous le faire savoir (je ne sais pas quand je pourrais revoir ce problème) – J0HN