Spec-Zone.ru › Nim 1

asynchttpserver

Этот модуль реализует высокопроизводительный асинхронный HTTP-сервер.

Этот HTTP-сервер не предназначен для использования в производстве, а для тестирования приложений локально. По этой причине при развертывании вашего приложения в производстве вы должны использовать обратный прокси (например, nginx) вместо того, чтобы разрешать пользователям подключаться напрямую к этому серверу.

Пример

Этот пример создаст HTTP-сервер на порту 8080. Сервер будет отвечать на все запросы с кодом ответа 200 OK и "Hello World" в качестве тела ответа.

import asynchttpserver, asyncdispatch

proc main {.async.} =
  var server = newAsyncHttpServer()
  proc cb(req: Request) {.async.} =
    let headers = {"Date": "Tue, 29 Apr 2014 23:40:08 GMT",
        "Content-type": "text/plain; charset=utf-8"}
    await req.respond(Http200, "Hello World", headers.newHttpHeaders())
  
  server.listen Port(8080)
  while true:
    if server.shouldAcceptRequest():
      await server.acceptRequest(cb)
    else:
      poll()

asyncCheck main()
runForever()

Импорты

asyncnet, asyncdispatch, parseutils, uri, strutils, httpcore

Типы

Request = object
  client*: AsyncSocket
  reqMethod*: HttpMethod
  headers*: HttpHeaders
  protocol*: tuple[orig: string, major, minor: int]
  url*: Uri
  hostname*: string          ## The hostname of the client that made the request.
  body*: string
Исходный код Редактировать
AsyncHttpServer = ref object
  socket: AsyncSocket
  reuseAddr: bool
  reusePort: bool
  maxBody: int               ## The maximum content-length that will be read for the body.
  maxFDs: int
Исходный код Редактировать

Константы

nimMaxDescriptorsFallback = 16000
значение по умолчанию, используемое, когда maxDescriptors недоступно. Это значение может быть установлено в командной строке во время компиляции с помощью -d:nimMaxDescriptorsFallback=N Исходный код Редактировать

Процедуры

proc newAsyncHttpServer(reuseAddr = true; reusePort = false; maxBody = 8388608): AsyncHttpServer {...}{.
    raises: [], tags: [].}
Создает новый экземпляр AsyncHttpServer. Исходный код Редактировать
proc sendHeaders(req: Request; headers: HttpHeaders): Future[void] {...}{.
    raises: [Exception], tags: [RootEffect].}
Отправляет указанные заголовки запрошивающему клиенту. Исходный код Редактировать
proc respond(req: Request; code: HttpCode; content: string;
             headers: HttpHeaders = nil): Future[void] {...}{.raises: [Exception],
    tags: [RootEffect].}

Отвечает на запрос с указанным HttpCode, заголовками и содержимым.

Эта процедура не закроет сокет клиента.

Пример:

import json
proc handler(req: Request) {.async.} =
  if req.url.path == "/hello-world":
    let msg = %* {"message": "Hello World"}
    let headers = newHttpHeaders([("Content-Type","application/json")])
    await req.respond(Http200, $msg, headers)
  else:
    await req.respond(Http404, "Not Found")
Исходный код Редактировать
proc listen(server: AsyncHttpServer; port: Port; address = "") {...}{.
    raises: [OSError, Exception, ValueError],
    tags: [RootEffect, WriteIOEffect, ReadIOEffect].}
Прослушивает указанный порт и адрес. Исходный код Редактировать
proc shouldAcceptRequest(server: AsyncHttpServer;
                         assumedDescriptorsPerRequest = 5): bool {...}{.inline,
    raises: [], tags: [].}
Возвращает true, если текущее количество открытых дескрипторов файла процесса все еще находится в пределах максимального предела, и поэтому разумно принять еще один запрос. Исходный код Редактировать
proc acceptRequest(server: AsyncHttpServer; callback: proc (request: Request): Future[
    void] {...}{.closure, gcsafe.}): owned(Future[void]) {...}{.raises: [Exception],
    tags: [RootEffect].}
Принимает один запрос. Напишите явную петлю вокруг этой процедуры, чтобы правильно обработать ошибки. Исходный код Редактировать
proc serve(server: AsyncHttpServer; port: Port;
           callback: proc (request: Request): Future[void] {...}{.closure, gcsafe.};
           address = ""; assumedDescriptorsPerRequest = -1): owned(Future[void]) {...}{.
    raises: [Exception],
    tags: [RootEffect, WriteIOEffect, ReadIOEffect, TimeEffect].}

Начинает процесс прослушивания входящих HTTP-соединений по указанному адресу и порту.

Когда клиент отправляет запрос, вызывается указанная функция обратного вызова.

Если assumedDescriptorsPerRequest равно 0 или больше, сервер учитывает максимальный предел дескрипторов файла процесса. Затем он гарантирует, что у процесса все еще есть ресурсы для assumedDescriptorsPerRequest дескрипторов файлов перед принятием соединения.

Вы должны предпочесть вызывать acceptRequest вместо этого с пользовательской петлей сервера, чтобы контролировать обработку ошибок и ведение журнала.

Исходный код Редактировать
proc close(server: AsyncHttpServer) {...}{.raises: [Exception, LibraryError, SslError],
                                      tags: [RootEffect].}
Завершает экземпляр асинхронного HTTP-сервера. Исходный код Редактировать

Экспорт

Http417, Http503, Http431, ==, contains, Http304, Http406, ==, $, clear, Http408, $, Http411, is3xx, Http418, Http206, HttpMethod, Http101, httpNewLine, Http505, Http413, newHttpHeaders, Http200, []=, Http414, add, Http401, Http205, ==, Http407, Http500, Http404, Http416, Http308, Http302, HttpHeaders, Http300, Http428, Http410, is2xx, Http202, Http502, headerLimit, HttpHeaderValues, contains, newHttpHeaders, $, [], Http305, Http451, Http409, Http504, Http426, hasKey, del, pairs, Http429, HttpVersion, []=, Http421, Http307, Http301, is4xx, Http203, getOrDefault, Http100, Http501, len, Http400, Http403, is5xx, Http415, toString, Http412, Http405, Http303, Http204,
Http201, HttpCode, Http422, []

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/asynchttpserver.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API