2015-09-07 4 views
10

Я маршрут следующим образом:Акка-клиент: Как установить заголовки ответа

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

Тип содержимого мой ответ должен быть всегда application/json как я это набором для get запроса. Однако то, что я получаю в своих тестах, - text/plain. Как правильно установить тип контента в ответе?

На стороне записки документация akka-http является одной из самых бесполезных кусков мусора, которые я когда-либо видел. Почти каждая ссылка на пример кода нарушена, и их объяснения просто указывают на очевидность. В Javadoc нет примера кода, и я не мог найти свою кодовую базу в Github, поэтому изучение их модульных тестов также не может быть и речи.

+0

Я согласен с вами в отношении состояния документов. Я скажу, что это как проект сообщества, люди могут взять на себя инициативу, чтобы помочь улучшить их. – acjay

+1

@acjay Лица могут рассчитывать только на то, чтобы внести свой вклад, когда они хорошо разбираются в коде, что сильно затруднено существующей, плохой документацией. Да, всегда можно посмотреть в исходном коде, но, опять же, это не для новичков, отнимающих много времени и не должно быть необходимым для большинства проблем. Если они всегда хотели, чтобы люди заглядывали в исходный код, они не должны претендовать на документацию. –

ответ

9

Я нашел thisодин пост, который говорит: «В распылителем/Акка-HTTP некоторые заголовки обрабатываются специально». По-видимому, тип контента является одним из таких и, следовательно, не может быть установлен как в моем коде выше. Нужно вместо этого создать HttpEntity с требуемым типом контента и телом ответа. С этими знаниями, когда я изменил директиву get, это сработало.

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