[中文文档] [English README]
author: xiaozhuai
email: 798047000@qq.com
JHttp — это лёгкий HTTP-сервер.
Он может реализовать базовый анализ GET-запросов и POST-форм (поддерживает только формат x-www-form-urlencoded), а также предоставляет простой маршрутизатор.
Не стоит использовать его в проектах, требующих высокой производительности, так как он основан на многопоточной модели без поддержки событийно-ориентированного подхода (Apache также использует многопоточную модель).
Однако вы можете использовать его для создания простого HTTP-сервера в приложениях Android.
Внимание:
Для прослушивания портов меньше 1024 требуются права суперпользователя.
Если вы используете JHttp в среде Android, вы не можете запускать сервер в потоке пользовательского интерфейса.
См. Main.java
:
public class Main {
static HttpServer server;
static final int PORT = 8080;
public static void main(String[] args) {
HttpLog.setLogLevel(HttpLog.LOG_LEVEL_DEBUG); //LOG_LEVEL_INFO по умолчанию
// хорошая идея — использовать это для определения пользовательской страницы ошибок при возникновении ошибки 404
HttpConfig.addCustomPageAction(404, (request, response) -> response.append("404 Not Found, Powered by JHttp"));
try {
server = new HttpServer(PORT);
// пример маршрута, анонимный внутренний класс или лямбда-выражение (на Java 8)
server.addRouter("/", new IHttpRouter() {
@Override
public void onRoute(HttpRequest request, HttpResponse response) {
response.append("hello");
}
});
// пример регулярного маршрута
server.addRouterRegex("/article/(\\w+)", (request, response) -> {
String action = request.getPathinfo().group(1); // (\\w+) возможно добавить, удалить, прочитать и т. д.
response.append(action+" an article");
});
// пример GET-запроса
server.addRouter("/user", (request, response) -> {
String user = request.get("user", "");
response.append("привет, " + user);
});
// пример ответа файла
server.addRouter("/file", (request, response) -> {
try {
response.contentType("text/plain");
response.file("/Users/xiaozhuai/Desktop/test.txt");
} catch (IOException e) {
e.printStackTrace();
}
});
//пример Controller, группа "?<action>" будет именем метода действия
server.addController("/comment/(?<action>\\w+)", ExampleCommentController.class);
server.serv();
} catch (IOException e) {
e.printStackTrace();
}
}
}
В случае с router
и regeRouter
не следует использовать переменные класса-члена для передачи параметров, поскольку это может привести к конкуренции между потоками (потому что все запросы, попадающие на этот маршрут, фактически обрабатываются одним и тем же экземпляром).
Конечно, если вы используете Java 8, лучшим способом будет использование лямбда-выражений, тогда вам не придётся беспокоиться об этой проблеме.
router
и regexRouter
предназначены для обработки некоторых очень простых запросов, поэтому используются лямбда-выражения или экземпляры анонимных внутренних классов, потому что вы вряд ли захотите поместить все эти простые маршруты в отдельный класс и записать их в файл Java. Если речь идёт о сложной бизнес-логике, лучше использовать controller
, а не router
.
Что касается controller
, каждый запрос, попавший на него, обрабатывается новым экземпляром. Поэтому вы можете безопасно использовать переменные класса, это не вызовет конкуренции.
Спасибо следующим участникам за вклад в JHttp. : )
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )