Javalin — это очень легкая веб-инфраструктура для Kotlin и Java, которая поддерживает WebSockets, HTTP2 и асинхронные запросы. Основные цели Javalin — простота, удобство разработки и первоклассная совместимость между Kotlin и Java.
Javalin — это скорее библиотека, чем фреймворк. Некоторые ключевые моменты:
Вам не нужно ничего расширять
Нет @Annotations
Нет никакого отражения
Никакой другой магии нет; просто код.
Веб-страница проекта — javalin.io (источник — javalin/javalin.github.io).
Прочтите документацию по адресу: javalin.io/documentation.
Краткое описание лицензии можно найти на сайте TLDR Legal.
Интересные вопросы
У нас есть очень активный сервер Discord, где вы можете быстро получить помощь. У нас также есть (гораздо менее активный) Slack, если вы так предпочитаете.
Вклад очень приветствуется. Подробнее о вкладе можно прочитать в нашем руководстве: ВКЛАД.
Пожалуйста, рассмотрите возможность спонсирования или участия Javalin, если вы хотите поддержать проект.
<зависимость>io.javalin javalin <версия>6.3.0версия> зависимость>
реализация("io.javalin:javalin:6.3.0")
import io.javalin.Javalin;public class HelloWorld { public static void main(String[] args) { var app = Javalin.create(/*config*/) .get("/", ctx -> ctx.result("Привет, мир")) .start(7070); } }
import io.javalin.Javalinfun main() { val app = Javalin.create(/*config*/) .get("/") { it.result("Привет, мир") } .start(7070) }
Этот раздел содержит несколько примеров, в основном взятых из документации. Все примеры на Kotlin, но на Java их можно найти в документации (это просто изменения синтаксиса).
Дополнительные примеры можно найти в репозитории javalin-samples.
import io.javalin.Javalinimport io.javalin.apibuilder.ApiBuilder.*fun main() { val app = Javalin.create { config -> config.useVirtualThreads = правда config.http.asyncTimeout = 10_000L config.staticFiles.add("/public") config.staticFiles.enableWebjars() config.router.apiBuilder { путь("/пользователи") { получить (UserController::getAll) сообщение (UserController::create) путь("/{userId}") { получить (UserController::getOne) патч (UserController:: update) удалить (UserController:: удалить) } ws("/events", userController::webSocketEvents) } } }.start(7070) }
app.ws("/websocket/{path}") { ws -> ws.onConnect { ctx -> println("Подключено") } ws.onMessage { ctx -> val user = ctx.message() // конвертируем строку json в объект ctx.send(user) // конвертируем в строку json и отправляем обратно } ws.onClose { ctx -> println("Закрыто") } ws.onError { ctx -> println("Ошибка") } }
app.before("/some-path/*") { ctx -> ... } // выполняется перед запросами к /some-path/*app.before { ctx -> ... } // выполняется перед всеми запросамиapp .after { ctx -> ... } // запускается после всех запросовapp.Exception(Exception.class) { e, ctx -> ... } // запускается, если не было перехвачено Exceptionapp.error(404) { ctx -> .. . } // запускается, если статус 404 (после всех остальных обработчиков)app.wsBefore("/some-path/*") { ws -> ... } // выполняется перед событиями ws в /some-path/*app.wsBefore { ws -> ... } // запускается перед всеми событиями wsapp.wsAfter { ws -> ... } // запускается после всех событий wsapp.wsException(Exception.class) { e, ctx -> ... } // запускается, если не перехвачено исключение в ws обработчик
вар todos = arrayOf(...) app.get("/todos") { ctx -> // сопоставляем массив задач с json-строкой ctx.json(todos) } app.put("/todos") { ctx -> // сопоставляем тело запроса (json) с массивом задач todos = ctx.body>() ctx.status(204) }
app.post("/upload") { ctx -> ctx.uploadedFiles("files").forEach { uploadedFile -> FileUtil.streamToFile(uploadedFile.content(), "upload/${uploadedFile.filename()}") } }
Javalin имеет систему плагинов, которая позволяет добавлять функциональность к основной библиотеке. Список плагинов вы можете найти здесь.
Установить плагин так же просто, как добавить зависимость к вашему проекту и зарегистрировать его в Javalin:
Javalin.create {конфигурация -> config.registerPlugin(MyPlugin()) }
Некоторые из наиболее популярных плагинов:
Плагин Javalin OpenAPI позволяет вам генерировать спецификацию OpenAPI 3.0 для вашего API во время компиляции.
Аннотируйте свои маршруты с помощью @OpenApi
чтобы сгенерировать спецификацию:
@OpenApi( summary = "Получить всех пользователей", идентификатор операции = "getAllUsers", теги = ["Пользователь"], ответы = [OpenApiResponse("200", [OpenApiContent(Array::class)])], путь = "/пользователи", методы = [HttpMethod.GET] )fun getAll(ctx: Context) { ctx.json(UserService.getAll()) }
Также доступны реализации Swagger UI и ReDoc UI для просмотра сгенерированной спецификации в браузере.
Дополнительные сведения см. в Wiki Javalin OpenAPI.
Плагин Javalin SSL позволяет легко настроить SSL для вашего сервера Javalin, поддерживая различные форматы, такие как PEM, PKCS12, DER, P7B и JKS.
Включить SSL на порту 443 так же просто, как:
val плагин = SSLPlugin { conf -> conf.pemFromPath("/путь/к/cert.pem", "/путь/к/key.pem") }Javalin.create { javalinConfig -> javalinConfig.plugins.register(плагин) }.начинать()
Логотип | Спонсор |
---|---|
@barbarysoftware (50 долл./м) | |
КабКэш (50 USD/м) |
Блейк Мизерани за создание Синатры
Пер Вендел за создание Spark
Кристиану Расмуссену — за то, что он отличный парень
Кристиану Куммермо, также за то, что он отличный парень