<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Adeshola Racheal Adetona</title>
    <description>The latest articles on DEV Community by Adeshola Racheal Adetona (@tonathe3rd).</description>
    <link>https://dev.to/tonathe3rd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3572353%2Ff2218471-d241-4634-a077-f2475d1f968b.jpeg</url>
      <title>DEV Community: Adeshola Racheal Adetona</title>
      <link>https://dev.to/tonathe3rd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tonathe3rd"/>
    <language>en</language>
    <item>
      <title>Building a Simple RESTful API in Java</title>
      <dc:creator>Adeshola Racheal Adetona</dc:creator>
      <pubDate>Sat, 18 Oct 2025 14:02:51 +0000</pubDate>
      <link>https://dev.to/tonathe3rd/building-a-simple-restful-api-in-java-24fa</link>
      <guid>https://dev.to/tonathe3rd/building-a-simple-restful-api-in-java-24fa</guid>
      <description>&lt;p&gt;Overview&lt;/p&gt;

&lt;p&gt;Recently, I built a lightweight RESTful API using only Java — no Spring Boot, no frameworks, just the standard Java libraries.&lt;br&gt;
The goal was to create a simple /me endpoint that returns my profile information along with a dynamic cat fact fetched from an external API called Cat Facts API (&lt;a href="https://catfact.ninja/fact" rel="noopener noreferrer"&gt;https://catfact.ninja/fact&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This task validated my ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consume third-party APIs&lt;/li&gt;
&lt;li&gt;Format JSON responses&lt;/li&gt;
&lt;li&gt;Return dynamic data from a Java HTTP server&lt;/li&gt;
&lt;li&gt;Handle errors and timeouts gracefully&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧩 The Task&lt;/p&gt;

&lt;p&gt;The requirements were clear:&lt;/p&gt;

&lt;p&gt;✅ Create a GET endpoint at /me&lt;br&gt;
✅ Return JSON data with this structure:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "status": "success",&lt;br&gt;
  "user": {&lt;br&gt;
    "email": "&lt;a href="mailto:get2adeshola@gmail.com"&gt;get2adeshola@gmail.com&lt;/a&gt;",&lt;br&gt;
    "name": "Adeshola Adetona",&lt;br&gt;
    "stack": "Java"&lt;br&gt;
  },&lt;br&gt;
  "timestamp": "2025-10-18T12:34:56.789Z",&lt;br&gt;
  "fact": "A random cat fact"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Fetch a fresh random fact from Cat Facts API on every request&lt;br&gt;
 Handle API failure gracefully&lt;br&gt;
 Ensure Content-Type: application/json&lt;/p&gt;

&lt;p&gt;Tools &amp;amp; Stack&lt;/p&gt;

&lt;p&gt;Language: Java 17&lt;/p&gt;

&lt;p&gt;Libraries: None (used com.sun.net.httpserver.HttpServer)&lt;/p&gt;

&lt;p&gt;IDE: IntelliJ IDEA&lt;/p&gt;

&lt;p&gt;Version Control: Git + GitHub&lt;/p&gt;

&lt;p&gt;Testing Tool: cURL / Browser&lt;/p&gt;

&lt;p&gt;🧱 Implementation Steps&lt;br&gt;
Step 1 — Create a Simple HTTP Server&lt;/p&gt;

&lt;p&gt;Instead of using Spring Boot, I used Java’s built-in HTTP server:&lt;/p&gt;

&lt;p&gt;HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);&lt;br&gt;
server.createContext("/me", new ProfileHandler());&lt;br&gt;
server.setExecutor(null);&lt;br&gt;
server.start();&lt;br&gt;
System.out.println("Server started on port 8080");&lt;/p&gt;

&lt;p&gt;This created a lightweight server that listens for requests on port 8080.&lt;/p&gt;

&lt;p&gt;Step 2 — Define the Handler&lt;/p&gt;

&lt;p&gt;The handler processes /me requests, fetches a random cat fact, and builds the JSON response:&lt;/p&gt;

&lt;p&gt;public void handle(HttpExchange exchange) throws IOException {&lt;br&gt;
    if ("GET".equals(exchange.getRequestMethod())) {&lt;br&gt;
        String fact = fetchCatFact();&lt;br&gt;
        String response = buildResponse(fact);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    exchange.getResponseHeaders().set("Content-Type", "application/json");
    exchange.sendResponseHeaders(200, response.getBytes().length);

    OutputStream os = exchange.getResponseBody();
    os.write(response.getBytes());
    os.close();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Step 3 — Fetching the Cat Fact&lt;/p&gt;

&lt;p&gt;I connected to the public Cat Facts API using HttpURLConnection:&lt;/p&gt;

&lt;p&gt;private static String fetchCatFact() {&lt;br&gt;
    try {&lt;br&gt;
        URL url = new URL("&lt;a href="https://catfact.ninja/fact%22" rel="noopener noreferrer"&gt;https://catfact.ninja/fact"&lt;/a&gt;);&lt;br&gt;
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();&lt;br&gt;
        conn.setRequestMethod("GET");&lt;br&gt;
        conn.setConnectTimeout(3000);&lt;br&gt;
        conn.setReadTimeout(3000);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String json = reader.lines().collect(Collectors.joining());
    reader.close();

    return new JSONObject(json).getString("fact");
} catch (Exception e) {
    return "Could not fetch cat fact at this time.";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This ensures:&lt;/p&gt;

&lt;p&gt;Each request gets a new cat fact&lt;/p&gt;

&lt;p&gt;If the API fails, a fallback message appears instead&lt;/p&gt;

&lt;p&gt;Step 4 — Generate the JSON Response&lt;br&gt;
private static String buildResponse(String fact) {&lt;br&gt;
    JSONObject response = new JSONObject();&lt;br&gt;
    response.put("status", "success");&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JSONObject user = new JSONObject();
user.put("email", "get2adeshola@gmail.com");
user.put("name", "Adeshola Adetona");
user.put("stack", "Java");

response.put("user", user);
response.put("timestamp", Instant.now().toString());
response.put("fact", fact);

return response.toString();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Testing the API&lt;/p&gt;

&lt;p&gt;I ran the server locally with:&lt;/p&gt;

&lt;p&gt;java ProfileServer&lt;/p&gt;

&lt;p&gt;Then tested it using:&lt;/p&gt;

&lt;p&gt;curl &lt;a href="http://localhost:8080/me" rel="noopener noreferrer"&gt;http://localhost:8080/me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "status": "success",&lt;br&gt;
  "user": {&lt;br&gt;
    "email": "&lt;a href="mailto:get2adeshola@gmail.com"&gt;get2adeshola@gmail.com&lt;/a&gt;",&lt;br&gt;
    "name": "Adeshola Adetona",&lt;br&gt;
    "stack": "Java"&lt;br&gt;
  },&lt;br&gt;
  "timestamp": "2025-10-18T14:22:07.231Z",&lt;br&gt;
  "fact": "Cats sleep for 70% of their lives."&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This task taught me:&lt;/p&gt;

&lt;p&gt;How to serve APIs without frameworks&lt;br&gt;
I now understand how Spring Boot simplifies low-level operations.&lt;/p&gt;

&lt;p&gt;HTTP fundamentals : handling connections, status codes, and headers manually.&lt;/p&gt;

&lt;p&gt;Resilience : implementing fallback responses for third-party API failures.&lt;/p&gt;

&lt;p&gt;Clean JSON formatting and working with timestamps in ISO 8601.&lt;/p&gt;

&lt;p&gt;Version control workflow : initializing a repo, committing, and pushing to GitHub.&lt;/p&gt;

&lt;p&gt;IntelliJ Project Setup&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7x1r5m28c85ay0jvxkjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7x1r5m28c85ay0jvxkjk.png" alt="IntelliJ Project Setup" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running the Server&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ryz60vt3b8ozej7un5j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ryz60vt3b8ozej7un5j.png" alt="Running the Server" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testing with browser&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxddcur4e8vi4z8cdspbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxddcur4e8vi4z8cdspbk.png" alt="Testing with browser" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Tonathe3rd/Dynamic-Profile-Endpoint-HNG" rel="noopener noreferrer"&gt;https://github.com/Tonathe3rd/Dynamic-Profile-Endpoint-HNG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API can be found in the Railway app here: &lt;a href="https://dynamic-profile-endpoint-hng-production.up.railway.app/me" rel="noopener noreferrer"&gt;https://dynamic-profile-endpoint-hng-production.up.railway.app/me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Building this project from scratch reminded me that even without frameworks, Java remains powerful for web development, it just requires a little more setup.&lt;br&gt;
This exercise sharpened my understanding of how HTTP servers, JSON, and APIs work under the hood.&lt;/p&gt;

&lt;p&gt;Author&lt;/p&gt;

&lt;p&gt;Adeshola Adetona&lt;br&gt;
 &lt;a href="mailto:get2adeshola@gmail.com"&gt;get2adeshola@gmail.com&lt;/a&gt;&lt;br&gt;
 Backend Stack: Java&lt;br&gt;
 Cat Fact Enthusiast&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>api</category>
      <category>learning</category>
      <category>java</category>
    </item>
  </channel>
</rss>
