# RestTemplate POST Request with JSON and Headers

By Atta Ur Rehman Shah (https://attacomsian.com/about). Published Nov 9, 2019, updated Sep 24, 2022. Topics: Spring Boot.
Canonical URL: https://attacomsian.com/blog/spring-boot-resttemplate-post-request-json-headers

> Learn how to make different kinds of HTTP POST requests with request body parameters, custom request headers, basic HTTP authentication, and more using RestTemplate. 

In this article, you will learn how to make different kinds of HTTP POST requests by using the [RestTemplate](https://attacomsian.com/blog/http-requests-resttemplate-spring-boot) class in a Spring Boot application.

An HTTP POST request is used to create a new resource. The `RestTemplate` class provides several template methods like `postForObject()`, `postForEntity()`, and `postForLocation()` for making POST requests. 

The first two methods are very similar to what we discussed in [RestTemplate's GET request](https://attacomsian.com/blog/spring-boot-resttemplate-get-request-parameters-headers) tutorial. The last method returns the location of the newly created resource instead of the complete resource.

## Simple POST Request

To make a simple HTTP POST request using RestTemplate, you can use the `postForEntity` method and pass the request body parameters as a map object:

```java
// request url
String url = "https://reqres.in/api/users";

// create an instance of RestTemplate
RestTemplate restTemplate = new RestTemplate();

// request body parameters
Map<String, String> map = new HashMap<>();
map.put("name", "John Doe");
map.put("job", "Java Developer");

// send POST request
ResponseEntity<Void> response = restTemplate.postForEntity(url, map, Void.class);

// check response
if (response.getStatusCode() == HttpStatus.OK) {
    System.out.println("Request Successful");
} else {
    System.out.println("Request Failed");
}
```

## POST Request with JSON and Headers

To make a POST request with the JSON request body, we need to set the `Content-Type` request header to `application/json`. The following example demonstrates how to make an HTTP POST request with a JSON request body:

```java
// request url
String url = "https://jsonplaceholder.typicode.com/posts";

// create an instance of RestTemplate
RestTemplate restTemplate = new RestTemplate();

// create headers
HttpHeaders headers = new HttpHeaders();
// set `content-type` header
headers.setContentType(MediaType.APPLICATION_JSON);
// set `accept` header
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

// request body parameters
Map<String, Object> map = new HashMap<>();
map.put("userId", 1);
map.put("title", "Spring Boot 101");
map.put("body", "A powerful tool for building web apps.");

// build the request
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(map, headers);

// send POST request
ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);

// check response
if (response.getStatusCode() == HttpStatus.CREATED) {
    System.out.println("Request Successful");
    System.out.println(response.getBody());
} else {
    System.out.println("Request Failed");
    System.out.println(response.getStatusCode());
}
```

## POST Request with Basic Authentication

The following example demonstrates how to [add basic authentication to RestTemplate](https://attacomsian.com/blog/resttemplate-basic-authentication) POST request:

```java
// request url
String url = "https://reqres.in/api/login";

// create an instance of RestTemplate
RestTemplate restTemplate = new RestTemplate();

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

// add basic authentication
headers.setBasicAuth("username", "password");

// build the request
HttpEntity request = new HttpEntity(headers);

// send POST request
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

// check response
if (response.getStatusCode() == HttpStatus.OK) {
    System.out.println("Login Successful");
} else {
    System.out.println("Login Failed");
}
```

## POST Request with Response Mapped to Java Object

RestTemplate allows you to map the JSON response directly to a Java object. Let us first create a simple `Post` class:

```java
public class Post implements Serializable {

    private int userId;
    private int id;
    private String title;
    private String body;

    public Post() {
    }

    public Post(int userId, int id, String title, String body) {
        this.userId = userId;
        this.id = id;
        this.title = title;
        this.body = body;
    }

    // getters and setters, equals(), toString() .... (omitted for brevity)
}
```

We can now use the above class to map the JSON response, as shown below:

```java
// request url
String url = "https://jsonplaceholder.typicode.com/posts";

// create an instance of RestTemplate
RestTemplate restTemplate = new RestTemplate();

// create headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

// create a post object
Post post = new Post(101, 1, "Spring Boot 101",
                "A powerful tool for building web apps.");

// build the request
HttpEntity<Post> request = new HttpEntity<>(post, headers);

// send POST request
ResponseEntity<Post> response = restTemplate.postForEntity(url, request, Post.class);

// check response
if (response.getStatusCode() == HttpStatus.CREATED) {
    System.out.println("Post Created");
    System.out.println(response.getBody());
} else {
    System.out.println("Request Failed");
    System.out.println(response.getStatusCode());
}
```

Check out the [Making HTTP Requests using RestTemplate in Spring Boot](https://attacomsian.com/blog/http-requests-resttemplate-spring-boot) guide for more RestTemplate examples.
