Networking and Web Development

42.1 HTTP Client

SSL requires -d:ssl (OpenSSL). Third-party: puppy (simple, OS-native TLS), curly (libcurl, multi-threaded).

import std/[httpclient, json]
let client = newHttpClient(timeout = 5000)
defer: client.close()
let resp = client.get("https://api.github.com/repos/nim-lang/Nim")
echo resp.status, " ", parseJson(resp.body)["stargazers_count"]
client.headers = newHttpHeaders({"Content-Type": "application/json"})
discard client.postContent("https://httpbin.org/post", body = $(%*{"a": 1}))

42.2 Web Frameworks

Sinatra-like DSL, mature Full-featured (middleware, sessions, validation, OpenAPI)

Multi-threaded HTTP + WebSocket server (no async; very fast)

Full-stack (SSR, SPA, JS backend, Python bindings) httpbeast / httpx Low-level high-performance servers Frontend SPA (JS backend)

# Jester
import jester
routes:
  get "/":
    resp "Hello from Jester!"
  get "/user/@id":
    resp %*{"id": @"id"}
  post "/echo":
    resp request.body
# Mummy
import mummy, mummy/routers
proc indexHandler(request: Request) =
  var headers: HttpHeaders
  headers["Content-Type"] = "text/plain"
  request.respond(200, headers, "Hello, Mummy!")
var router: Router
router.get("/", indexHandler)
let server = newServer(router)
server.serve(Port(8080))

42.3 Other Networking

std/net (sync sockets, newSocket, connect, send, recvLine), UDP, std/smtp, std/uri, WebSockets (ws, mummy), gRPC (nim-grpc experiments), MQTT (nmqtt), ZeroMQ (nim-zmq), libp2p (nim-libp2p), JSON-RPC (nim-json-rpc).

Templating: std/strtabs + stdtmpl source filters, nimja (Jinja-like, compile-time), karax buildHtml.