Ratpack dla szybkich i czytelnych RESTów
Jeszcze niedawno Ratpack był rozwiązaniem hipsterkim (co podkreśla domena .io), ale w O'Reilly wydali książkę Learning Ratpack i nieodwracalnie dołączył do mainsteamu. I słusznie, bo jest prostym, ale wielofunkcyjnym narzędziem, takim szwajcarskim scyzorykiem HTTP. Dla mnie chyba największą jego zaletą jest czytelność kodu. Po wejściu do klasy RatpackRestServer po roku, nie musiałam się zastanawiać, co się tam wydarzyło.
Ratpack opiera swoje działanie o handlery. Handler jest opakowaniem dla funkcji działającym na zadanym kontekście. Implementuje tylko metodę handle(final Context ctx). Może zwrócić odpowiedź, albo wykonać swoją pracę i oddelegować kontekst, podając listę handlerów lub wywołać context.next(). Speech Rank póki co, używa jednego handlera, zarządzającego kontrolą dostępu (Access-Control), ale pewnie w przyszłości będzie potrzeba dodania innych.
public class CORSHandler implements Handler {
@Override
public void handle(final Context ctx) throws Exception {
final MutableHeaders headers = ctx.getResponse().getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
headers.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
ctx.next();
}
}
Pisanie endpointów ma bardzo niski próg wejścia. Serwer Ratpackowy z dwoma przykładowymi endpointami może wyglądać tak:
RatpackServer.start(server -> server
.handlers(chain -> chain
.all(new CORSHandler())
.post("api/comment", ctx ->
ctx.parse(Comment.class).then(comment -> {
conferencesRepo.add(comment);
ctx.render(json(comment.getComment()));
}))
.get("api/conference/:id", ctx -> {
ctx.render(json(conferencesRepo.getConference(ctx.getPathTokens().get("id"))));
})
));
Inne rzykłady znajdziesz w dokumentacji. Dużym plusem tego zestawu bibliotek jest łatwość testowania, ale testy zasługują na osobnego posta!
Ratpack opiera swoje działanie o handlery. Handler jest opakowaniem dla funkcji działającym na zadanym kontekście. Implementuje tylko metodę handle(final Context ctx). Może zwrócić odpowiedź, albo wykonać swoją pracę i oddelegować kontekst, podając listę handlerów lub wywołać context.next(). Speech Rank póki co, używa jednego handlera, zarządzającego kontrolą dostępu (Access-Control), ale pewnie w przyszłości będzie potrzeba dodania innych.
public class CORSHandler implements Handler {
@Override
public void handle(final Context ctx) throws Exception {
final MutableHeaders headers = ctx.getResponse().getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
headers.add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
ctx.next();
}
}
Pisanie endpointów ma bardzo niski próg wejścia. Serwer Ratpackowy z dwoma przykładowymi endpointami może wyglądać tak:
RatpackServer.start(server -> server
.handlers(chain -> chain
.all(new CORSHandler())
.post("api/comment", ctx ->
ctx.parse(Comment.class).then(comment -> {
conferencesRepo.add(comment);
ctx.render(json(comment.getComment()));
}))
.get("api/conference/:id", ctx -> {
ctx.render(json(conferencesRepo.getConference(ctx.getPathTokens().get("id"))));
})
));
Komentarze
Prześlij komentarz