Как получить информацию о заголовке http-запроса со стороны сервера с помощью спрея RestAPI

Я новичок в Scala и Spray. Я написал простой REST API в соответствии с инструкциями, приведенными в этом сообщении в блоге. http://www.smartjava.org/content/first-steps-rest-spray-and-scala

И все работают как положено.

Теперь я хочу изменить программу для печати заголовков HTTP, таких как кодировка, язык, удаленный адрес и т. д. Я хотел бы распечатать всю информацию заголовка (цель - регистрировать эту информацию)

Но я не смог найти подходящую документацию или примеры. Может ли кто-нибудь помочь мне сделать это.


person Janaka Priyadarshana    schedule 14.09.2015    source источник
comment
Привет, Тем не менее я не мог найти способ распечатать все заголовки http. В java мы можем получить его как коллекцию, пройтись по ней и распечатать все. I am just wondering why it is so hard with spray and scala ???   -  person Janaka Priyadarshana    schedule 16.09.2015


Ответы (2)


Если вам нужно извлечь определенный заголовок:

optionalHeaderValueByName("Encoding") { encodingHeader =>
  println(encodingHeader)
  complete("hello")
}

в качестве альтернативы вы можете получить доступ к необработанному объекту запроса и напрямую извлечь заголовки. Вот пользовательская директива, которая регистрирует все заголовки:

def logHeaders(): Directive0 = extract(_.request.headers).map(println)

Применение

logHeaders() {
  complete("hello")
}
person Gabriele Petronella    schedule 14.09.2015
comment
Спасибо за быстрый ответ. Для меня работает первый способ. Но я бы предпочел альтернативный способ, и он дает синтаксическую ошибку при вызове foreach ------- Ошибка: (37, 61) значение foreach не является членом spray.routing.Directive1[List[spray. http.HttpHeader]] def logHeaders(): Directive0 = extract(_.request.headers).foreach(println)--------- - person Janaka Priyadarshana; 15.09.2015
comment
упс, попробуй map вместо foreach - person Gabriele Petronella; 15.09.2015
comment
карта тоже не помогает. Я получаю сообщение об ошибке компиляции: ------- Ошибка: (42, 51) значение foreach не является членом spray.routing.Directive1[List[spray.http.HttpHeader]] def logHeaders1() = extract(_. request.headers).foreach(println)----- Вышеупомянутая ошибка, которую я получил, к сожалению, не смог получить список из spray.routing.Directive1 - person Janaka Priyadarshana; 15.09.2015
comment
Как может возникнуть ошибка foreach, если вы используете map? - person Gabriele Petronella; 15.09.2015
comment
карта ничего не сделала для меня. Итак, я все еще борюсь с foreach. Работает ли карта для вас? - person Janaka Priyadarshana; 15.09.2015
comment
если я смогу получить List[spray.http.HttpHeader] из spray.routing.Directive1[List[spray.http.HttpHeader]], я смогу использовать foreach. Как я могу получить что-то от spray.routing.Directive1 - person Janaka Priyadarshana; 15.09.2015

Вот как я заработал.

Директива:

def logHeaders(innerRoute: Route): (RequestContext => Unit) = extract(_.request.headers) { headers =>
  headers.foreach(h => logger.info("header: {} = {}", h.name, h.value))
  innerRoute
}

Применение:

logHeaders() {
  complete("hello")
}
person jasop    schedule 03.12.2015