REST

restapi2HttpServerDemo

Path
pkg12restapi/restapi2HttpServerDemo.java
Package
pkg12restapi
Study order
2
Run
Single-file source launch
Command
java pkg12restapi/restapi2HttpServerDemo.java
Dependencies
com.sun.net.httpserver.HttpExchange, com.sun.net.httpserver.HttpServer

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg12restapi/restapi2HttpServerDemo.java
1package pkg12restapi;2 3import com.sun.net.httpserver.HttpExchange;4import com.sun.net.httpserver.HttpServer;5import java.io.IOException;6import java.net.InetSocketAddress;7import java.net.URI;8import java.net.http.HttpClient;9import java.net.http.HttpRequest;10import java.net.http.HttpResponse;11import java.nio.charset.StandardCharsets;12 13/*14 * restapi2HttpServerDemo.java15 * ---------------------------16 * Build a minimal HTTP server with the JDK's built-in com.sun.net.httpserver.17 *18 * DEFINITION:19 *   HttpServer (module jdk.httpserver, no dependencies) lets you stand up an20 *   HTTP endpoint in a few lines. Each "context" maps a path to a handler that21 *   reads the request and writes a response. Great for demos, tools, and tests.22 *23 * KEY POINTS:24 *   - createContext(path, handler) registers a route.25 *   - HttpExchange = one request/response pair (method, headers, body, status).26 *   - sendResponseHeaders(status, bodyLength) THEN write the body, then close().27 *   - This demo starts the server and calls it with HttpClient — fully offline.28 */29public class restapi2HttpServerDemo {30 31    public static void main(String[] args) throws Exception {32        HttpServer server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);33 34        // Route: GET /time  -> plain text35        server.createContext("/time", ex ->36                respond(ex, 200, "text/plain", "server time: " + System.currentTimeMillis()));37 38        // Route: GET /greet?name=Ada -> reads a query parameter39        server.createContext("/greet", ex -> {40            String query = ex.getRequestURI().getQuery();          // e.g. name=Ada41            String name = "World";42            if (query != null && query.startsWith("name="))43                name = query.substring("name=".length());44            respond(ex, 200, "text/plain", "Hello, " + name + "!");45        });46 47        server.start();48        int port = server.getAddress().getPort();49        System.out.println("Server listening on http://127.0.0.1:" + port);50 51        // Call our own server to prove it works52        HttpClient client = HttpClient.newHttpClient();53        call(client, "http://127.0.0.1:" + port + "/time");54        call(client, "http://127.0.0.1:" + port + "/greet?name=Ada");55 56        server.stop(0);57        System.out.println("Server stopped.");58    }59 60    static void respond(HttpExchange ex, int status, String type, String body) throws IOException {61        byte[] bytes = body.getBytes(StandardCharsets.UTF_8);62        ex.getResponseHeaders().add("Content-Type", type);63        ex.sendResponseHeaders(status, bytes.length);64        ex.getResponseBody().write(bytes);65        ex.close();66    }67 68    static void call(HttpClient client, String url) throws Exception {69        HttpResponse<String> resp = client.send(70                HttpRequest.newBuilder(URI.create(url)).GET().build(),71                HttpResponse.BodyHandlers.ofString());72        System.out.printf("GET %-30s -> %d  %s%n", url, resp.statusCode(), resp.body());73    }74}