java
24 lines · 6 steps
Posting an order with Java's HttpClient
Serialize an order, POST it over HTTP, branch on the status code, and deserialize the reply.
Explained by
highlit
1public OrderConfirmation submitOrder(Order order) throws IOException, InterruptedException {
2 String payload = objectMapper.writeValueAsString(order);
3
4 HttpRequest request = HttpRequest.newBuilder()
5 .uri(URI.create(baseUrl + "/api/v1/orders"))
6 .timeout(Duration.ofSeconds(10))
7 .header("Content-Type", "application/json")
8 .header("Accept", "application/json")
9 .header("Authorization", "Bearer " + apiToken)
10 .POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8))
11 .build();
12
13 HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
14
15 int status = response.statusCode();
16 if (status == 429) {
17 throw new RateLimitedException(response.headers().firstValue("Retry-After").orElse("5"));
18 }
19 if (status >= 400) {
20 throw new OrderApiException("Order submission failed with status " + status + ": " + response.body());
21 }
22
23 return objectMapper.readValue(response.body(), OrderConfirmation.class);
24}
01 / 01
STEP 01
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1Jackson's ObjectMapper bookends the request: one call to serialize outbound, one to deserialize the response.
- 2Inspecting the status code before parsing lets you fail fast with meaningful exceptions instead of a broken body.
- 3The builder pattern on HttpRequest makes headers, timeout, and body read as a single declarative description of the call.
Related explainers
ruby
class Order class InvalidTransition < StandardError; end TRANSITIONS = {
A state machine for order transitions in Ruby
state-machine
data-driven
error-handling
Intermediate
8 steps
java
public class SlidingLogRateLimiter { private final int maxRequests; private final long windowMillis;
How a sliding-log rate limiter works
rate-limiting
concurrency
sliding-window
Advanced
8 steps
java
public final class Slugifier { private static final Pattern NON_LATIN = Pattern.compile("[^\\w-]"); private static final Pattern WHITESPACE = Pattern.compile("[\\s]+");
Building a URL slugifier in Java
regex
unicode-normalization
string-processing
Intermediate
8 steps
rust
use std::cmp::Ordering; use std::str::FromStr; #[derive(Debug, Clone, PartialEq, Eq)]
Parsing and ordering semantic versions in Rust
parsing
trait-implementation
ordering
Intermediate
8 steps
javascript
'use client'; import { useEffect } from 'react'; import * as Sentry from '@sentry/nextjs';
How a Next.js error boundary recovers
error-boundary
error-handling
observability
Intermediate
8 steps
ruby
class Registration < ApplicationRecord belongs_to :event validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
Validating registrations in Rails
validations
i18n
error-handling
Intermediate
8 steps
Share this explainer
Here's the card — post it anywhere.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/posting-an-order-with-java-s-httpclient-explained-java-8504/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.