На случай если кому интересно начало.
Коротко:
Аннотации. Да они появились (аж целых две)
Логирование. Пока не везде, но уже имеется.
Автостартер сервера.
Есть два варианта запуска библиотеки:
С аннотациями
Без аннотаций
С аннотациями без наследования
import ru.zoommax.SimpleServer;
import ru.zoommax.next.Request;
import ru.zoommax.next.Response;
import ru.zoommax.next.annotation.Endpoint;
import ru.zoommax.next.annotation.InitWebServer;
import ru.zoommax.next.enums.HttpMethod;
public class AnnotatedStart {
/*
* Аннотируем метод, который будет запускать сервер с помощью аннотации InitWebServer
* В аннотации InitWebServer указываем порт и количество потоков
* По умолчанию порт 8080, а количество потоков 1
* Внутри метода запускаем сервер с помощью SimpleServer.start()
* SimpleServer.start() запускает чтение аннотаций во всех классах внутри пакета
* с последующим запуском сервера (создается синглтон) и добавлением конечных точек
* в список конечных точек сервера.
*/
@InitWebServer(port = 12345, threads = 4)
public static void main(String[] args) {
SimpleServer.start();
}
/*
* Аннотируем метод, который реализует логику конечной точки с помощью аннотации Endpoint
* В аннотации Endpoint указываем путь конечной точки, HTTP метод, код ответа и фильтр длины контента
* По умолчанию метод GET, код ответа 200 и фильтр длины контента -1 (не фильтровать).
* Внутри метода реализуем логику конечной точки.
* Метод должен принимать объект Request и возвращать объект Response.
* В объекте Request содержится вся информация о запросе,
* а в объекте Response формируется ответ на запрос.
*/
@Endpoint(path = "/test", httpMethod = HttpMethod.GET, statusCode = 200, filterContentLength = -1)
public Response test(Request request) {
//Endpoint logic
String body = request.getBodyAsString();
//...
//Return response
return Response.builder()
.bodyAsString(body)
.statusCode(200)
.build();
}
}
С аннотациями и наследованием
import ru.zoommax.SimpleServer;
import ru.zoommax.next.Request;
import ru.zoommax.next.Response;
import ru.zoommax.next.annotation.Endpoint;
import ru.zoommax.next.annotation.InitWebServer;
import ru.zoommax.next.enums.HttpMethod;
@InitWebServer(port = 12345, threads = 4)
public class AnnotatedStartWithExtends extends SimpleServer {
public static void main(String[] args) {
}
@Endpoint(path = "/test", httpMethod = HttpMethod.GET, statusCode = 200, filterContentLength = -1)
public Response test(Request request) {
return Response.builder()
.bodyAsString(request.getBodyAsString())
.statusCode(200)
.build();
}
}
Итого надо запомнить, что:
Метод, который запускает сервер, должен быть аннотирован
@InitWebServer
.@InitWebServer
принимает два параметра:port
иthreads
. По умолчаниюport
равен 8080, аthreads
равен 1.Метод, который реализует логику конечной точки, должен быть аннотирован
@Endpoint
.@Endpoint
принимает четыре параметра:path
,httpMethod
,statusCode
иfilterContentLength
. По умолчаниюhttpMethod
равенHttpMethod.GET
,statusCode
равен 200, аfilterContentLength
равен -1.
Б
import ru.zoommax.SimpleServer;
import ru.zoommax.next.Response;
import ru.zoommax.next.handlers.GetHandlerNew;
import java.util.HashMap;
public class NotAnnotatedStart {
/*
* Запускаем сервер с помощью SimpleServer.start()
* SimpleServer.start() запускает сервер (создается синглтон).
* Далее можно добавлять конечные точки в список конечных точек сервера.
* В SimpleServer.start() нужно указать порт и количество потоков.
*/
public static void main(String[] args) {
SimpleServer.start(12345, 4);
test();
}
/*
* Добавляем конечную точку с помощью SimpleServer.addEndpoint()
* SimpleServer.addEndpoint() принимает два параметра: путь конечной точки и обработчик.
* Внутри обработчика реализуем логику конечной точки.
* Возвращаем объект Response.
*/
public static void test() {
SimpleServer.addEndpoint("/test", new GetHandlerNew() {
@Override
public Response response(String request, HashMap<String, String> requestHeaders, HashMap<String, String> requestParams, String clientIp) {
//Endpoint logic
String body = request;
//...
return Response.builder()
.bodyAsString(body)
.statusCode(200)
.build();
}
});
}
}
Запуск без аннотаций больше похож на старый подход (тем не менее старая реализация помечена как устаревшая в первую очередь из-за изменений в классе Server. Теперь используется класс ServerNext).
Ничего умнее для названия класса ServerNext в голову не пришло.
Кто хочет — может кинуть в меня тапком. Для этого даже есть канал в дискорде))
Кидать в ZooMMaX`а