Simple HTTP web server

Concepts

  • Use Deno’s integrated HTTP server to run your own web server.

Overview

With just a few lines of code you can run your own HTTP web server with control over the response status, request headers and more.

ℹ️ The native HTTP server is currently unstable, meaning the API is not finalized and may change in breaking ways in future version of Deno. To have the APIs discussed here available, you must run Deno with the --unstable flag.

Sample web server

In this example, the user-agent of the client is returned to the client:

webserver.ts:

  1. // Start listening on port 8080 of localhost.
  2. const server = Deno.listen({ port: 8080 });
  3. console.log(`HTTP webserver running. Access it at: http://localhost:8080/`);
  4. // Connections to the server will be yielded up as an async iterable.
  5. for await (const conn of server) {
  6. // In order to not be blocking, we need to handle each connection individually
  7. // in its own async function.
  8. (async () => {
  9. // This "upgrades" a network connection into an HTTP connection.
  10. const httpConn = Deno.serveHttp(conn);
  11. // Each request sent over the HTTP connection will be yielded as an async
  12. // iterator from the HTTP connection.
  13. for await (const requestEvent of httpConn) {
  14. // The native HTTP server uses the web standard `Request` and `Response`
  15. // objects.
  16. const body = `Your user-agent is:\n\n${requestEvent.request.headers.get(
  17. "user-agent",
  18. ) ?? "Unknown"}`;
  19. // The requestEvent's `.respondWith()` method is how we send the response
  20. // back to the client.
  21. requestEvent.respondWith(
  22. new Response(body, {
  23. status: 200,
  24. }),
  25. );
  26. }
  27. })();
  28. }

Then run this with:

  1. deno run --allow-net --unstable webserver.ts

Then navigate to http://localhost:8080/ in a browser.

Using the std/http library

If you do not want to use the unstable APIs, you can still use the standard library’s HTTP server:

webserver.ts:

  1. import { serve } from "https://deno.land/std@$STD_VERSION/http/server.ts";
  2. const server = serve({ port: 8080 });
  3. console.log(`HTTP webserver running. Access it at: http://localhost:8080/`);
  4. for await (const request of server) {
  5. let bodyContent = "Your user-agent is:\n\n";
  6. bodyContent += request.headers.get("user-agent") || "Unknown";
  7. request.respond({ status: 200, body: bodyContent });
  8. }

Then run this with:

  1. deno run --allow-net webserver.ts