Ratpack: определить маршруты чтения из списка

Я хочу создать «фиктивный» сервер с помощью Ratpack.

Сначала я читаю из папки и определяю список пар, каждая пара имеет:

  • Путь
  • Имитация ответа для этого пути

Я хочу запустить сервер, который определяет эти маршруты и ответы:


// this is already done; returns smth such as:
def getServerRules() {
  [ path: "/books", response: [...] ],
  [ path: "/books/42", response: [ title: "this is a mock" ] ],
  [ path: "/books/42/reviews", response: [ ... ] ],
  ...
]

def run() {
 def rules = getServerRules()
 ratpack {
   handlers {
     get( ??? rule.path ??? ) {
       render json( ??? rule.response ??? )
     }
   }
 }
}

Могу ли я перебрать эти rules, чтобы каким-то образом определить обработчик для каждого элемента?


person Manu    schedule 07.11.2017    source источник


Ответы (1)


Вы можете определить все свои обработчики, перебирая список определенных правил сервера, как в этом скрипте Ratpack Groovy:

@Grapes([
        @Grab('io.ratpack:ratpack-groovy:1.5.0'),
        @Grab('org.slf4j:slf4j-simple:1.7.25'),
        @Grab('org.codehaus.groovy:groovy-all:2.4.12'),
        @Grab('com.google.guava:guava:23.0'),
])

import static ratpack.groovy.Groovy.ratpack
import static ratpack.jackson.Jackson.json

def getServerRules() {
    [
            [path: "", response: "Hello world!"],
            [path: "books", response: json([])],
            [path: "books/42", response: json([title: "this is a mock"])],
            [path: "books/42/reviews", response: json([])],
    ]
}

ratpack {
    handlers {
        getServerRules().each { rule ->
            get(rule.path) {
                render(rule.response)
            }
        }
    }
}

Как вы можете видеть, все обработчики определены внутри цикла for-each, который перебирает предопределенные правила сервера. Стоит упомянуть две вещи:

  • не начинайте URL-адреса с «/» в начале, иначе конечная точка не будет определена
  • если вы хотите вернуть ответ JSON, оберните тело ответа методом ratpack.jackson.Jackson.json(body), аналогично тому, что я сделал в примере

Выход

curl localhost:5050
Hello World!

curl localhost:5050/books
[]

curl localhost:5050/books/42
{"title":"this is a mock"}

curl localhost:5050/books/42/reviews
[]

Я надеюсь, что это помогает.

person Szymon Stepniak    schedule 07.11.2017
comment
придирки: вам не нужны захваты groovy-all и guava? - person cfrick; 07.11.2017
comment
Идеально. спасибо - person Manu; 07.11.2017
comment
@cfrick Мне пришлось добавить их, иначе скрипт Groovy не запустился правильно - ">gist.githubusercontent.com/wololock/ - person Szymon Stepniak; 07.11.2017
comment
Я запустил его с локально установленным groovy, для которого нужны только slf2j и ratpack. Но, ладно, тогда лучше держи их. - person cfrick; 07.11.2017
comment
@cfrick Я думал, что это может быть мой многомодульный проект и некоторые конфликты путей к классам, которые необходимо разрешить явно, но копирование сценария в /tmp/ratpack.groovy и запуск его с локально установленным Groovy (через SDKMAN!) вызывает то же исключение: gist.githubusercontent.com/wololock/: это довольно странно - person Szymon Stepniak; 07.11.2017