## Create a Server using `net` module from Node JS ```js import * as net from 'net' const server = net.createServer((socket) => { socket.on("close", () => { socket.end() }) }) server.listen(4221, "localhost") ``` ## Respond with `200` status for any API Request To send a response from the server, you can use `socket.write` #### HTTP Response HTTP Response is made up of three parts, each separated by a [CRLF](https://developer.mozilla.org/en-US/docs/Glossary/CRLF) (`\r\n`): 1. Status line 2. Zero or more headers each ending with CRLF 3. Optional Response Body ```js const server = net.createServer((socket) => { socket.write("HTTP/1.1 200 OK\r\n\r\n") socket.on("close", () => { socket.end() }) }) ``` ## Extract URL Path #### HTTP Request HTTP Request is made up of three parts, each separated by a CRLF (`\r\n`): 1. Request line 2. Zero or more headers, each ending with a CRLF 3. Optional Request Body Example HTTP Request: ```javascript GET /index.html HTTP/1.1\r\nHost: localhost:4221\r\nUser-Agent: curl/7.64.1\r\nAccept: */*\r\n\r\n ``` Here's the breakdown of the request ```javascript // Request line GET // HTTP method /index.html // Request target HTTP/1.1 // HTTP version \r\n // CRLF that marks the end of the request line // Headers Host: localhost:4221\r\n // Header that specifies the server's host and port User-Agent: curl/7.64.1\r\n // Header that describes the client's user agent Accept: */*\r\n // Header that specifies which media types the client can accept \r\n // CRLF that marks the end of the headers // Request body (empty) ``` Note that each header ends in a `CRLF` and the entire header section also ends with `CRLF` To read the request ```js const server = net.createServer((socket) => { socket.on("data", (data) => { const request = data.toString() const [method, path] = request.split(" ") // you can do socket.write socket.write("HTTP/1.1 200 OK\r\n\r\n") }) socket.on("close", () => { socket.end() }) }) ```