Capstone: HTTP server
| The spec | |
| :inets httpd sketch | |
| Serve JSON routes | |
| Test with :httpc |
The spec
Expose the todo list over HTTP using OTP stdlib servers only. Three behaviors define the whole project.
- The server listens on port 4001 and answers on localhost.
- A GET route serves the todo list as a JSON string.
- Unknown paths answer with a not found status.
:inets httpd sketch
The sketch below starts a plain HTTP service on port 4001 with stdlib modules only. Read it as a shape, not a full production config: start the client library, then start the service with a small property list where the port stays clearly visible.
:inets.start()
{:ok, _pid} = :httpd.start_service(
port: 4001,
server_name: ~c"todo",
server_root: ~c"/tmp",
document_root: ~c"/tmp",
modules: [:mod_esi]
)
Serve JSON routes
Each route is a function from request to response. The todos route returns a JSON string with a success status and a JSON content type set by the server module.
def list_json do
"{\"todos\": []}"
end
Build JSON by hand here to stay inside the standard library. A JSON package becomes worth adding only when hand-built strings start to sprawl.
Test with :httpc
Verify the route with the stdlib client. Start the server, request the todos path, and assert the success code plus the body shape.
{:ok, {{_, 200, _}, _, body}} = :httpc.request(:get, {~c"http://localhost:4001/todos", []}, [], [])
assert to_string(body) == "{\"todos\": []}"
Next: Hero roadmap: the whole course on one page
Article author: Arthur Isaev