Как мне создать собственные unmarshallers для обработки списков параметров, используя akka-http? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь демонтировать параметры из входных данных, отправленных на мой маршрут, чтобы маршрут мог обрабатывать параметры и отправлять обратно BadRequest, если параметры неправильно отформатированы. Конкретный параметр, который я рассматриваю при разборе - это запрос orderBy, используемый в приложении REST-ful.

Я думал о структурировании запроса путем объединения нескольких полей с целым числом сортировки. Поле и целое число разделены :, тогда как комбинации поле-целое разделены запятой.

Пример этого запроса будет выглядеть так: /path?orderBy=id:-1,name:1

Я хотел бы создать собственный демаршаллер, который сможет превратить этот список параметров в List[(String, Int)] для отправки в мой запрос, который разложит его и будет использовать в запросе. Akka-http поддерживает CsvList unmarshaller, однако это не подходит для моей реализации.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

На основании ответа, предоставленного Тимом, я смог придумать немного другой ответ.В исходном ответе Тима внутри определения есть ненужный неявный параметр, который можно удалить, поскольку для этой реализации не требуется собственный демон-маршаллер.Это базовый демаршаллер.

Я сделал это:

implicit val pairSeq = Unmarshaller.strict[String, (String, Int)] { string =>
    val Array(a, b) = string.split(':')
    a -> b.toInt
  }

...

import foo.pairSeq

path("PATH") {
  parameter("orderBy".as(CsvSeq[(String, Int)])) { ob =>
    ...
  }
0 голосов
/ 05 апреля 2019

Это должно работать:

implicit def pairSeq(implicit unmarshaller: Unmarshaller[String, (String, Int)]) =
  Unmarshaller.strict[String, (String, Int)] { string =>
    val Array(a, b) = string.split(':')
    a -> b.toInt
  }

...

path("PATH") {
  parameter("orderBy".as(CsvSeq[(String, Int)])) { ob =>
    ...
  }

ob будет List[(String, Int)], если параметр отформатирован правильно.

Для этого используется пользовательский маршаллер для (String, Int), который разделяетстрока в : и преобразует второе значение в Int.Этот пользовательский маршаллер используется CsvSeq для снятия каждого значения, разделенного запятыми в orderBy.

...