Как можно распылить unmarshall список в параметрах запроса
Я новичок в спрей. Я играю с созданием маршрутов, и, хотя мне удается получить параметры из строки запроса с помощью директивы параметров, у меня возникают проблемы, когда я хочу, чтобы один из параметров был списком.
Для этого примера я определил этот класс case:
case class Person(name: String, friends: Int)
мой маршрут в настоящее время выглядит так:
path("test") {
get { parameters('name, 'friend ).as(Person) { p => complete(p) } }
}
это работает нормально, и я могу получить: localhost:8080/test?name=jo&friends=12 и получить то, что я ожидаю.
Я хочу передать список идентификаторов друзей, а не просто количество друзей, поэтому я начал с изменения класса дел следующим образом:
case class Person(name: String, friends: Array[Int])
и мой звонок: localhost:8080/test?name=jo&friends=1,2
это не компилируется. Я получаю несоответствие типов: найдено: Person.type требуется: spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?] get { parameters('name, 'friend).as(Person) { p => ^ комментарий: это указывает на букву P в.as (Person)
Есть идеи, что я делаю не так? Я хотел бы получить ответ о том, как это сделать. Еще лучше было бы объяснить, что это за бесформенный тип, который он ищет. Спасибо
1 ответ
Первый пример работал, так как параметр 'friend
может быть автоматически преобразован из String
в Int
следовательно, удовлетворяя требованиям Person
кейс-класс.
Последний не работает, потому что нет String => Array[Int]
преобразование доступно, поэтому невозможно материализовать Person
из двух строк.
Вы можете сказать, что это лечит как 'friend
а также 'name
как строки, глядя на сообщение об ошибке
spray.routing.HListDeserializer[shapeless.::[String,shapeless.::[String,shapeless.HNil]],?]
можно упростить до чего-то вроде
String :: String :: HNil
то есть он ищет что-то, что может десериализовать две строки во что-то другое.
В итоге, вам нужно будет предоставить собственный десериализатор для анализа "1,2"
в Array[Int]
,
Вот соответствующая документация: http://spray.io/documentation/1.1-SNAPSHOT/spray-httpx/unmarshalling/