2013-10-04 3 views
1

Я пытаюсь сделать службу отдыха для управления профилем. Таким образом, у меня есть следующий URI для профилей:Маршрутизация в Spray

host/profile/id123123/:action 

Но существуют различные типы профилей, для разных пользователей с различными приборных панелей, поэтому я хочу, чтобы извлечь profileType и id в качестве верхнего пути и работать с различными действиями в рамках этого. Я пытался писать в СУХОЙ образом:

path(Segment/"id" ~ Segment) { (profileType, id) ⇒ 
    get { 
    profileType match { 
     case "admin" ⇒ loadProfilePage[Admin](id) 
    } 
    } ~ 
    path("update") { 
    complete("Profile updated") 
    } 
} 

Но если я введите в адресной строке:

localhost/admin/id123123/update 

Он бросает исключение сервера. В чем проблема?

ответ

6

У вас неправильная структура маршрутизации. Если вы хотите иметь различную логику для разных путей под некоторым общим, в вашем случае path(Segment/"id" ~ Segment), вам необходимо использовать директиву pathPrefix. Тогда правильный путь будет выглядеть следующим образом:

pathPrefix(Segment/"id" ~ Segment) { (profileType, id) ⇒ 
    path("") { 
    get { 
     profileType match { 
     case "admin" ⇒ loadProfilePage[Admin](id) 
     } 
    } 
    } ~ 
    path("update") { 
    complete("Profile updated") 
    } 
} 

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

Update

Я просто хотя немного оптимизации. Я думаю, что у вас будет не только update путь к другим. Таким образом, в данном случае это было бы чище, чтобы сделать следующий маршрут:

pathPrefix(Segment/"id" ~ Segment) { (profileType, id) ⇒ 
    (get | put) { 
    profileType match { 
     case "user" ⇒ 
     path("")(loadProfilePage[User](id)) ~ 
     path("update")(updateProfile[User](id)) ~ 
     path("delete")(deleteProfile[User](id) 
     } 
    } 
    } 
} 

Тем не менее, это не идеальный способ, я бы обобщить его дальше, вызывает только одно, как я понимаю, что бы изменить это profileType

+0

Спасибо за код в части обновления, выглядит действительно круто –