1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xiaozhuai-JHttp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_CN.md 5.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 05:57 e8a9572

JHttp

[中文文档] [English README]

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. : )

  • @py庄稼汉(weihai4099)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xiaozhuai-JHttp.git
git@api.gitlife.ru:oschina-mirror/xiaozhuai-JHttp.git
oschina-mirror
xiaozhuai-JHttp
xiaozhuai-JHttp
master