2015-09-07 28 views
10

Ho un percorso come segue:Akka-http: Come impostare intestazioni di risposta

val route = { 
    logRequestResult("user-service") { 
     pathPrefix("user") { 
     get { 
      respondWithHeader(RawHeader("Content-Type", "application/json")) { 
      parameters("firstName".?, "lastName".?).as(Name) { name => 
       findUserByName(name) match { 
       case Left(users) => complete(users) 
       case Right(error) => complete(error) 
       } 
      } 
      } 
     } ~ 
      (put & entity(as[User])) { user => 
      complete(Created -> s"Hello ${user.firstName} ${user.lastName}") 
      } ~ 
      (post & entity(as[User])) { user => 
      complete(s"Hello ${user.firstName} ${user.lastName}") 
      } ~ 
      (delete & path(Segment)) { userId => 
      complete(s"Hello $userId") 
      } 
     } 
    } 
    } 

Il tipo di contenuto della mia risposta deve essere sempre application/json come ho in posa per la richiesta get. Tuttavia, quello che sto ottenendo nei miei test è text/plain. Come imposto correttamente il tipo di contenuto nella risposta?

In una nota a margine, la documentazione di akka-http è uno dei rifiuti più inutili che abbia mai visto. Quasi ogni link al codice di esempio è rotto e le loro spiegazioni indicano semplicemente l'ovvio. Javadoc non ha un esempio di codice e non sono riuscito a trovare la base di codice su Github in modo tale che l'apprendimento dai test di unità non sia più possibile.

+0

Sono d'accordo con te sullo stato dei documenti. Devo dire che, in quanto progetto comunitario, le persone sono libere di prendere l'iniziativa per aiutarle a migliorarle. – acjay

+1

@acjay Ci si può aspettare che gli individui contribuiscano solo dopo aver compreso bene il codice, che è gravemente ostacolato dalla documentazione esistente, scarsa. Sì, si può sempre guardare nel codice sorgente, ma, ancora una volta, questo non è per i principianti, richiede molto tempo e non dovrebbe essere necessario per la maggior parte dei problemi. Se volevano sempre che le persone guardassero il codice sorgente, non dovevano fingere di avere alcuna documentazione. –

risposta

9

ho trovato thisuno post che dice "in spray/Akka-http alcune intestazioni sono trattati appositamente". Apparentemente, il tipo di contenuto è uno di quelli e quindi non può essere impostato come nel mio codice sopra. Si deve invece creare uno HttpEntity con il tipo di contenuto e il corpo della risposta desiderati. Con quella conoscenza, quando ho cambiato la direttiva get come segue, ha funzionato.

import akka.http.scaladsl.model.HttpEntity 
import akka.http.scaladsl.model.MediaTypes.`application/json` 

get { 
    parameters("firstName".?, "lastName".?).as(Name) { name => 
    findUserByName(name) match { 
     case Left(users) => complete(users) 
     case Right(error) => complete(error._1, HttpEntity(`application/json`, error._2)) 
    } 
    } 
}