Как правильно определить ресурсы REST в kottpd - PullRequest
0 голосов
/ 27 апреля 2020

Я работаю на REST-сервере в Kotlin, используя kottpd

Вот выдержка из определенных мной ресурсов / URI:

get("/patients") {req, res -> PatientHandler.doGetAll(req, res)}
post("/patients") {req, res -> PatientHandler.doPost(req, res)}

get("/patients/.*") {req, res -> PatientHandler.doGetOne(req, res)}
post("/patients/.*") {req, res -> PatientHandler.doPatch(req, res)}

get("/patients/.*/cases") {req, res -> CaseHandler.doGetAll(req, res)}
post("/patients/.*/cases") {req, res -> CaseHandler.doPost(req, res)}

/patients и /patients/.* до сих пор работали нормально: например, POST: /patients добавляет пациента в список, а GET: /patients/1 возвращает пациента с идентификатором 1.

Однако при вызове POST: /patients/1/cases для добавления случая к пациенту 1 выполняются функции, прикрепленные к POST: /patients/.*.

Я предполагаю (!), Что .* - это подстановочный знак, и поэтому нет различия между идентификатором, каким-то другим путем или каким-либо другим.

Как я могу определить свои ресурсы / URI различать guish между этими случаями? Или, если мои предположения не верны: что я делаю не так?

1 Ответ

0 голосов
/ 29 апреля 2020

Решением было заменить .* на \d+,

например. GET: /patients/\d+/cases или get("/patients/\\d+/cases")

Как указано u / 8bitlives на reddit:

https://github.com/gimlet2/kottpd/blob/master/src/main/kotlin/com/github/gimlet2/kottpd/Server.kt#L128

Похоже на пути используются как чистые регулярные выражения. Итак. * - это «что-нибудь 0 или более раз». Замена подстановочного знака более точным \ d + означает «одно или несколько чисел». Я бы предложил написать пути, избегая подстановочных знаков вообще. И использовать сервис как regex101.com для проверки шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...