Spring – REST JSON Response

REST APIs are becoming popular for the advantages they provide in the development of applications. REST APIs work like a client-server architecture. The client makes a request and a server (REST API) responds back by providing some kind of data. A client can be any front-end framework like Angular, React, etc, or Spring application ( internal/external ) itself. Data can be sent in various formats like plain text, XML, JSON, etc. Of these formats, JSON ( JavaScript Object Notation ) is a standard for transporting data between web applications.
Pre-requisites required are as follows:
- JSON string can be stored in it own file with the ‘.json‘ extension.
- It has the MIME type of – ‘application/json‘.
JSON
JSON is an abbreviation for JavaScript Object Notation. It is a text-based data format following Javascript object syntax. It has syntax somewhat like a Javascript object literal and can be used independently from Javascript. Many programming environments have the ability to parse and generate JSON. It exists as a string and needs to be converted into a native Javascript object to access the data by available global JSON methods of Javascript.
Structure of the JSON
{
"id" : 07,
"framework" : "Spring",
"API" : "REST API",
"Response JSON" : true
}
On sending an array of objects, they are wrapped in the square brackets
[
{
"id" : 07,
"name" : "darshan"
},
{
"id" : 08,
"name" : "DARSHAN"
}
]
- Spring framework’s ‘Starter Web’ dependency provides you with the two essential features of Spring MVC – (Spring’s web framework) and the RESTful ( REST API ) methodology.
- To include ‘Starter Web’ in the Spring application, add the following dependency –
Maven -> pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Project structure – Maven
File: pom.xml (Configurations)
XML
<?xml version="1.0" encoding="UTF-8"?> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>sia</groupId> <artifactId>GFG-JSON-REST-RESPONSE</artifactId> <version>0.0.1-SNAPSHOT</version> <name>GFG-JSON-REST-RESPONSE</name> <description>REST API Response</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build></project> |
File: GfgJsonRestResponseApplication.java ( Bootstrapping of the application )
Java
// Java Program to Illustrate Bootstrapping of an// Applicationpackage gfg;// Importing classesimport org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;// Annotation@SpringBootApplication// Main classpublic class GfgJsonRestResponseApplication { // Main driver method public static void main(String[] args) { SpringApplication.run( GfgJsonRestResponseApplication.class, args); }} |
File: DomainBean.java ( User properties – The data to be transferred )
- Java Beans requires the Getter/Setter methods.
- One can generate them automatically with the ‘@Data’ annotation of the ‘Lombok’ library.
- Dependency is as depicted below as follows:
Maven -> pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Java
// java Program to illustrate DomainBean classpackage gfg;// Importing classimport lombok.Data;// Annotation@Data// Classpublic class DomainBean { String id; String name; String data;} |
File: RestJsonResponse.java ( REST API )
- This class provides RESTful services.
- Essential annotations are –
|
Annotation |
Description |
|---|---|
| @RestController | Combines @Controller and @ResponseBody |
| @RequestMapping | Maps web requests with ‘path’ attribute and response format with ‘produces’ attribute |
| @CrossOrigin | Permits cross-origin web requests on the specific handler classes/methods |
| @GetMapping | Maps GET request on specific handler method |
| @PathVariable | Binds the URI template variables to method parameters |
Java
package gfg;import java.util.ArrayList;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(path="/JSON", produces="application/json")@CrossOrigin(origins="*")public class RestJsonResponse { @GetMapping("/data") public ArrayList<DomainBean> get() { ArrayList<DomainBean> arr = new ArrayList<>(); DomainBean userOne = new DomainBean(); userOne.setId("1"); userOne.setName("@geek"); userOne.setData("Lazyroar"); DomainBean userTwo = new DomainBean(); userTwo.setId("2"); userTwo.setName("@drash"); userTwo.setData("Darshan.G.Pawar"); arr.add(userOne); arr.add(userTwo); return arr; } @GetMapping("/{id}/{name}/{data}") public ResponseEntity<DomainBean> getData(@PathVariable("id") String id, @PathVariable("name") String name, @PathVariable("data") String data) { DomainBean user = new DomainBean(); user.setId(id); user.setName(name); user.setData(data); HttpHeaders headers = new HttpHeaders(); ResponseEntity<DomainBean> entity = new ResponseEntity<>(user,headers,HttpStatus.CREATED); return entity; }} |
Outputs:
An array of JSON object literals
JSON object literal
REST API’s JSON response can be consumed by:
- Spring application itself.
- Front-end application/framework
A: Spring Application
- Spring offers the ‘RestTemplate‘ – a convenient way of handling a REST response.
- It has the HTTP method-specific handler methods.
File: ConsumeResponse.java ( Consume REST API response )
Java
// Java Program to Illustrate Consume REST API responsepackage gfg;// Importing required classesimport org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;// Classpublic class ConsumeResponse { // Creating an object of ResponseEntity class RestTemplate rest = new RestTemplate(); public ResponseEntity<DomainBean> get() { return rest.getForEntity( DomainBean.class, "007", "geek@drash", "Darshan.G.Pawar"); }} |
File: ResponseController.java ( Regular Controller )
A normal Spring controller is used to retrieve the responses from the ‘RestTemplate’ method and returns a view.
Example:
Java
// Java Program to Illustrate Regular Controllerpackage gfg;// Importing required classesimport org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;// Annotation@Controller@RequestMapping("/ConsumeResponse")// Classpublic class ResponseController { @GetMapping("/get") public String get(Model model) { // Creating object of ConsumeResponse class ConsumeResponse data = new ConsumeResponse(); model.addAttribute("response", data.get().getBody()); model.addAttribute("headers", data.get().getHeaders()); return "output"; }} |
File: Output.html ( output of API: Thymeleaf template)
HTML
<!DOCTYPE html><head><title>Lazyroar</title></head><body><h1 style="color:forestgreen" th:text="${response.id}">attributeValue will be placed here</h1><h1 style="color:forestgreen" th:text="${response.name}">attributeValue will be placed here</h1><h1 style="color:forestgreen" th:text="${response.data}">attributeValue will be placed here</h1><h2 style="color:forestgreen; width : 350px" th:text="${headers}">attributeValue will be placed here</h2></body></html> |
Output:
Response with JSON as content type
B: Front-end Application/Framework – Angular
File: consume-json.component.ts ( Angular component )
- This component retrieves the JSON data from the specified URL targeting REST API.
- Retrieved data is stored in a variable.
import { Component, OnInit, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-consume-json',
templateUrl: './consume-json.component.html',
styleUrls: ['./consume-json.component.css']
})
export class ConsumeJsonComponent implements OnInit {
restData : any;
constructor(private http:HttpClient) { }
ngOnInit() {
this.http.get('http://localhost:8080/JSON/data')
.subscribe(data => this.restData = data);
}
}
File: consume-json.component.html ( view of component)
- Get the stored data by dot( . ) notation.
- ‘ngFor’ is an Angular template directive used for iterating through the collection of objects.
HTML
<h1>Rest API Response : JSON</h1><div> <table *ngFor="let json of restData"> <tr> <td>{{json.id}}</td> <td>{{json.name}}</td> <td>{{json.data}}</td> </tr> </table></div> |
File: consume-json.component.css ( Style file )
CSS
h1, tr{ color : green; font-size : 25px;} |
Add - '<app-consume-json></app-consume-json>' in the 'app.component.html' file
Output:
Response retrieved by Angular component
- You can additionally map an object to JSON object literal using the Jackson API.
- Add the following dependency:
Maven -> pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>
Note: This dependency will also automatically add the following libraries to the classpath:
- jackson-annotations
- jackson-core



