简单的 HTTP Web 服务器

概念

概述

只需几行代码,你就可以运行自己的 HTTP Web 服务器,并控制响应状态、请求头等。

示例 Web 服务器

在此示例中,将客户端的 User-Agent 返回给客户端:

webserver.ts

// 开始在 localhost 的 8080 端口上监听。
const server = Deno.listen({ port: 8080 });
console.log(`HTTP webserver running.  Access it at:  http://localhost:8080/`);

// 连接服务器将作为异步可迭代项产生。
for await (const conn of server) {
  // 为了不阻塞,我们需要分别处理每个连接,而不需要等待函数。
  serveHttp(conn);
}

async function serveHttp(conn: Deno.Conn) {
  // 这将把一个网络连接升级为一个 HTTP 连接。
  const httpConn = Deno.serveHttp(conn);
  // 每个通过 HTTP 连接发送的请求将从 HTTP 连接中作为异步迭代器产生。
  for await (const requestEvent of httpConn) {
    // 原生的 HTTP 服务器使用 Web 标准的 Request 和 Response 对象。
    const body = `Your user-agent is:\n\n${
      requestEvent.request.headers.get("user-agent") ?? "Unknown"
    }`;
    // 请求事件的 .respondWith() 方法是我们将响应发送回客户端的方式。
    requestEvent.respondWith(
      new Response(body, {
        status: 200,
      }),
    );
  }
}

然后使用以下命令运行:

deno run --allow-net webserver.ts

然后在浏览器中导航到 http://localhost:8080/

使用 std/http

ℹ️ 从 ^1.13.x 版本开始,由于 原生 HTTP 绑定的稳定化, std/http 现在支持从 ^0.107.0 起的 原生 HTTP 服务器。 从 0.117.0 版本起删除了旧的服务器模块。

webserver.ts

import { serve } from "https://deno.land/std@$STD_VERSION/http/server.ts";

const port = 8080;

const handler = (request: Request): Response => {
  const body = `Your user-agent is:\n\n${
    request.headers.get("user-agent") ?? "Unknown"
  }`;

  return new Response(body, { status: 200 });
};

console.log(`HTTP webserver running. Access it at: http://localhost:8080/`);
await serve(handler, { port });

然后使用以下命令运行:

deno run --allow-net webserver.ts