05 Complex Post Request
This is one of the most asked advanced topics in Rest Assured interviews β especially for Automation Engineers using Java.
π§© Scenario: Complex POST Request
You need to send this nested JSON body to create an order:
{
"orderId": 101,
"customer": {
"name": "Nini",
"email": "nini@test.com",
"address": {
"street": "MG Road",
"city": "Bangalore",
"pincode": "560001"
}
},
"items": [
{ "itemName": "Laptop", "quantity": 1, "price": 75000 },
{ "itemName": "Mouse", "quantity": 2, "price": 500 }
],
"payment": {
"mode": "CreditCard",
"transactionId": "TXN12345"
}
}
π’ Step 1: Create POJO Classes
Address.java
public class Address {
private String street;
private String city;
private String pincode;
// Getters and Setters
public String getStreet() { return street; }
public void setStreet(String street) { this.street = street; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getPincode() { return pincode; }
public void setPincode(String pincode) { this.pincode = pincode; }
}
Customer.java
public class Customer {
private String name;
private String email;
private Address address;
// Getters and Setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
}
Item.java
public class Item {
private String itemName;
private int quantity;
private double price;
// Getters and Setters
public String getItemName() { return itemName; }
public void setItemName(String itemName) { this.itemName = itemName; }
public int getQuantity() { return quantity; }
public void setQuantity(int quantity) { this.quantity = quantity; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
Payment.java
public class Payment {
private String mode;
private String transactionId;
// Getters and Setters
public String getMode() { return mode; }
public void setMode(String mode) { this.mode = mode; }
public String getTransactionId() { return transactionId; }
public void setTransactionId(String transactionId) { this.transactionId = transactionId; }
}
Order.java
import java.util.List;
public class Order {
private int orderId;
private Customer customer;
private List<Item> items;
private Payment payment;
// Getters and Setters
public int getOrderId() { return orderId; }
public void setOrderId(int orderId) { this.orderId = orderId; }
public Customer getCustomer() { return customer; }
public void setCustomer(Customer customer) { this.customer = customer; }
public List<Item> getItems() { return items; }
public void setItems(List<Item> items) { this.items = items; }
public Payment getPayment() { return payment; }
public void setPayment(Payment payment) { this.payment = payment; }
}
π’ Step 2: Build Request Body in Java (Serialization)
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import static io.restassured.RestAssured.*;
import java.util.*;
public class ComplexPostExample {
public static void main(String[] args) {
RestAssured.baseURI = "https://api.testing.com"; // Replace with your API URL
// Create Address
Address address = new Address();
address.setStreet("MG Road");
address.setCity("Bangalore");
address.setPincode("560001");
// Create Customer
Customer customer = new Customer();
customer.setName("Nini");
customer.setEmail("nini@test.com");
customer.setAddress(address);
// Create Items
Item item1 = new Item();
item1.setItemName("Laptop");
item1.setQuantity(1);
item1.setPrice(75000);
Item item2 = new Item();
item2.setItemName("Mouse");
item2.setQuantity(2);
item2.setPrice(500);
List<Item> itemList = new ArrayList<>();
itemList.add(item1);
itemList.add(item2);
// Create Payment
Payment payment = new Payment();
payment.setMode("CreditCard");
payment.setTransactionId("TXN12345");
// Create Order
Order order = new Order();
order.setOrderId(101);
order.setCustomer(customer);
order.setItems(itemList);
order.setPayment(payment);
// Send POST request
given()
.contentType(ContentType.JSON)
.body(order)
.when()
.post("/orders")
.then()
.statusCode(201)
.log().all();
}
}
β
Rest Assured automatically converts (serializes) the nested Order object into a complex JSON request body.
π’ Step 3: Validate Response (Deserialization)
Letβs say the API returns the same order details as response.
Order orderResponse =
given()
.contentType(ContentType.JSON)
.body(order)
.when()
.post("/orders")
.then()
.statusCode(201)
.extract()
.as(Order.class); // β
JSON β Java object (Deserialization)
System.out.println("Customer name: " + orderResponse.getCustomer().getName());
System.out.println("First item: " + orderResponse.getItems().get(0).getItemName());
π£ Alternative: Without POJOs (Using HashMap & List)
If you donβt want to create multiple POJO classes, you can use Maps & Lists:
Map<String, Object> address = new HashMap<>();
address.put("street", "MG Road");
address.put("city", "Bangalore");
address.put("pincode", "560001");
Map<String, Object> customer = new HashMap<>();
customer.put("name", "Nini");
customer.put("email", "nini@test.com");
customer.put("address", address);
Map<String, Object> payment = new HashMap<>();
payment.put("mode", "CreditCard");
payment.put("transactionId", "TXN12345");
List<Map<String, Object>> items = new ArrayList<>();
Map<String, Object> item1 = new HashMap<>();
item1.put("itemName", "Laptop");
item1.put("quantity", 1);
item1.put("price", 75000);
items.add(item1);
Map<String, Object> item2 = new HashMap<>();
item2.put("itemName", "Mouse");
item2.put("quantity", 2);
item2.put("price", 500);
items.add(item2);
Map<String, Object> order = new HashMap<>();
order.put("orderId", 101);
order.put("customer", customer);
order.put("items", items);
order.put("payment", payment);
given()
.contentType(ContentType.JSON)
.body(order)
.when()
.post("/orders")
.then()
.statusCode(201)
.log().body();
β
This approach is faster for small test cases,
but POJO-based is recommended for frameworks (cleaner, reusable, and type-safe).
π§ Interview-Ready Summary Answer
βA complex POST request in Rest Assured involves sending a nested JSON structure that includes objects, arrays, and lists.
We can achieve this by using POJO classes with proper relationships or by using HashMaps and Lists.
Rest Assured automatically performs serialization (object β JSON) and deserialization (JSON β object) using Jackson or Gson.
This approach makes test automation more scalable and maintainable for large enterprise APIs.β