2015-12-22 6 views
1

Я пытаюсь разрешить два типа использования для API: либо предоставлять запрос как часть URI, либо предоставлять его в качестве параметра.Спрей: запрос как часть URI или параметр

Endpoints

/search/myQuery эквивалентно /search?query=myQuery

как должен возвращать один и тот же результат.

Код

вот implmentation настоящее время я использую. Однако он чувствует себя немного шире, так как много кода необходимо повторить.

path("search") { 
    parameter('query) { term => 
    get { 
    complete { performSearch(term) } 
    } 
} ~ 
path("search"/Segment) { searchTerm => 
    get { 
    complete { performSearch(term) } 
    } 
} 

Вопрос

Есть ли более DRY способ выразить это поведение в спрей?

ответ

3

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

val pathOrParameter = path(Segment) | parameter('search) 

path("search") { 
    pathOrParameter { term => 
    get { 
    complete { performSearch(term) } 
    } 
    } 
} 

В дополнение к этому вы можете комбинировать далее, как:

val searchApi = get & path("search") & (path(Segment) | parameter('search)) 

searchApi { term => 
    complete { performSearch(term) } 
} 

Custom Directive страницы объясняет способность спрей сочинить директивы в деталях.

+0

Спасибо большое :) Я пробовал, как вы описали до allready, но без параметра parens '(path (Сегмент) | (поиск))' он не будет компилироваться. ' –

+0

Это тип, поэтому, если типы разные, он не будет компилироваться. Например, 'get' имеет тип' Directive0' и 'parameter ('search)' имеет тип 'Directive1 [String]' so 'get | параметр («поиск») не будет компилироваться. –

+0

Ссылка на страницу «Пользовательская директива» возвращается 404 :( –