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.
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}