2016-01-07 7 views
0

Я следующий код в спрей для разбора службы REST вызывается пользователем:Путь разбора для REST API в Spray

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEndOrSingleSlash { 
     pathEnd { 
      get { 
      complete("/v0/pets") 
      } 
     } ~ 
     get { 
      complete("/v0/pets/") 
     } 
     } ~ 
     parameters('id ?) { 
     id => 
      get { 
      complete("/v0/pets?id=" + id) 
      } 
     } 
    } 
    } 
} 

Проблема заключается в том, что он не ведет себя, как ожидалось. Я ожидаю следующее поведение из кода:

http://127.0.0.1/v0/pets => /v0/pets 
http://127.0.0.1/v0/pets/ => /v0/pets/ 
http://127.0.0.1/v0/pets?id=1234 = > /v0/pets?id=Some(1234) 

Но, я получаю следующие результаты для запросов:

http://127.0.0.1/v0/pets => /v0/pets 
http://127.0.0.1/v0/pets/ => /v0/pets 
http://127.0.0.1/v0/pets?id=1234 => /v0/pets 

ответ

1
pathPrefix("v0") { 
    pathPrefix("pets") { 
    pathEndOrSingleSlash { 
     get { 
     } 
    } 
    } 
} 

матчи http://127.0.0.1/v0/pets?id=1234.

Вот почему

GET /v0/pets?id=1234 
^ ^^^ 
|___|___|__|____ get 
    | | | 
    | | | 
    | | |__ pathEndOrSlash 
    | | 
    | |__ pathPrefix("pets") 
    | 
    |__ pathPrefix("v0") 

Вам нужно, прежде чем перехватить parameter. Попробуйте

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     parameters('id ?) { 
     id => 
      get { 
      complete("/v0/pets?id=" + id) 
      } 
     } ~ 
     pathEndOrSingleSlash { 
     pathEnd { 
      get { 
      complete("/v0/pets") 
      } 
     } ~ 
     get { 
      complete("/v0/pets/") 
     } 
     } 
    } 
    } 
} 
+0

Спасибо @ gabriele-petronella за ваш ответ. Но с вашим предлагаемым решением последние два пути никогда не выполняются. Оба они просто выполняются только по первому пути и выводят вывод как/v0/pets /? Id = None – Chuchu

+0

oh да, мой плохой, опциональность 'id' заставляет его вводить первый путь в любом случае. Решение mfirry - путь. –

2

Одна из вопроса здесь в том, что, поскольку id объявлен как optional ваш parameter маршрут обрабатывает как наличие и отсутствие его (и, обрабатывающим v0/pets).

Один из способов сделать это (и я также предполагаю, что вы хотите обрабатывать только get запросов).

Вы в основном просто объявить idне опциональный на вашем parameter маршруту:

val route = get { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEnd { 
     parameter('id) { id => 
      complete("/v0/pets?id=" + id) 
     } ~ complete("/v0/pets") 
     } ~ 
     pathSingleSlash { 
     complete("/v0/pets/") 
     } 
    } 
    } 
} 

Другой способ в основном только использует тот факт, что id является необязательным параметром, так что вы просто совпадение рисунка на Option:

val route = { 
    pathPrefix("v0") { 
    pathPrefix("pets") { 
     pathEnd { 
     get { 
      parameters('id ?) { id => 
      id match { 
       case Some(id) => complete("/v0/pets?id=" + id) 
       case None => complete("/v0/pets") 
      } 
      } 
     } 
     } ~ 
     pathSingleSlash { 
     get { 
      complete("/v0/pets/") 
     } 
     } 
    } 
    } 
}