Consuming RESTful API in Spring Boot
In our earlier articles, we learned how to create rest full API's . In this article, we will learn how to invoke or call Rest full API's in spring boot. Essentially we are going to write a simple client to consume a few public RESTful API's. RESTTemplate is for just that, Spring's RESTTemplate is used to write client applications to consume RESTful API
In this article, we will consume two different public API. For that, we will write a standalone Spring Boot App, to consumes the REST API's as follows
API 1: Get all GitHub API's
GET https://api.github.com
API 2: Get all Github repositories for user bootng
GET https://api.github.com/users/bootng/repos
Technologies Used
- Java 11
- Apache Maven 3.5.0
- Spring Boot 2.2.6
- Eclipse IDE
Main Application Class
package com.javaexp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SpringBootApplication
public class ResttemplateApplication {
private static final Logger log = LoggerFactory.getLogger(ResttemplateApplication.class);
public static void main(String args[]) {
log.info("about to call ResttemplateApplication.run()");
SpringApplication.run(ResttemplateApplication.class, args);
log.info("completed executing ResttemplateApplication.run()");
}
}
Our first REST client is as bellow, which calls a REST endpoint and then displays results in the console.
LoadAllGithubEndpoints.java
package com.bootng;
import java.util.Iterator;
import java.util.Map.Entry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
/**
* This Class List all the endpoints from URL https://api.github.com
*
*/
@Component
@Order(1)
public class LoadAllGithubEndpoints implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(ResttemplateApplication.class);
@Override
public void run(String... args) throws Exception {
log.info("about to call LoadAllEndpoint.run()");
RestTemplate restTemplate = new RestTemplateBuilder().build();
ResponseEntity<JsonNode> apis =
restTemplate.getForEntity("https://api.github.com", JsonNode.class);
StringBuilder result = new StringBuilder("\n List of Public API's");
apis.getBody().fields().next().getValue();
Iterator<Entry<String, JsonNode>> it = apis.getBody().fields();
while (it.hasNext()) {
result.append("\n").append(it.next().getValue().asText());
}
log.info(result.toString());
}
}
Our second REST client is as bellow, which calls a REST endpoint and then displays all the repositories for user bootng in the console.
LoadGithubRepo
package com.bootng;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
@Component
@Order(2)
public class LoadGithubRepo implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(ResttemplateApplication.class);
@Override
public void run(String... args) throws Exception {
log.info("about to call LoadGithubRepo.run()");
RestTemplate restTemplate = new RestTemplateBuilder().build();
ResponseEntity<JsonNode> repos = restTemplate
.getForEntity("https://api.github.com/users/bootng/repos", JsonNode.class);
int counter = 1;
StringBuilder result = new StringBuilder("\n List of Repositories");
if (repos.getBody().isArray()) {
for(JsonNode jsonNode : repos.getBody()) {
result.append("\n Repo ").append(counter++).append("::");
result.append(jsonNode.get("name").asText());
}
}
log.info(result.toString());
}
}
Notice that LoadGithubRepo is marked with annotation Order(2) and LoadAllGithubEndpoints is marked with annotation Order(1). That means Spring will execute LoadAllGithubEndpoints first and then LoadGithubRepo.
Building and Running the application
mvn clean install
mvn spring-boot:run
Console Output
20-June-18 16:25:17:627 INFO main c.b.ResttemplateApplication:27 - about to call LoadAllEndpoint.run() 20-June-18 16:25:18:570 INFO main c.b.ResttemplateApplication:40 - List of Public API's https://api.github.com/user https://github.com/settings/connections/applications{/client_id} https://api.github.com/authorizations https://api.github.com/search/code?q={query}{&page,per_page,sort,order} https://api.github.com/search/commits?q={query}{&page,per_page,sort,order} https://api.github.com/user/emails https://api.github.com/emojis https://api.github.com/events https://api.github.com/feeds https://api.github.com/user/followers https://api.github.com/user/following{/target} https://api.github.com/gists{/gist_id} https://api.github.com/hub https://api.github.com/search/issues?q={query}{&page,per_page,sort,order} https://api.github.com/issues https://api.github.com/user/keys https://api.github.com/search/labels?q={query}&repository_id={repository_id}{&page,per_page} https://api.github.com/notifications https://api.github.com/orgs/{org} https://api.github.com/orgs/{org}/repos{?type,page,per_page,sort} https://api.github.com/orgs/{org}/teams https://api.github.com/gists/public https://api.github.com/rate_limit https://api.github.com/repos/{owner}/{repo} https://api.github.com/search/repositories?q={query}{&page,per_page,sort,order} https://api.github.com/user/repos{?type,page,per_page,sort} https://api.github.com/user/starred{/owner}{/repo} https://api.github.com/gists/starred https://api.github.com/users/{user} https://api.github.com/user/orgs https://api.github.com/users/{user}/repos{?type,page,per_page,sort} https://api.github.com/search/users?q={query}{&page,per_page,sort,order} 20-June-18 16:25:18:570 INFO main c.b.ResttemplateApplication:21 - about to call LoadGithubRepo.run() 20-June-18 16:25:19:069 INFO main c.b.ResttemplateApplication:36 - List of Repositories Repo 1::angular-word-merger Repo 2::hansini-static-deploy Repo 3::JUnit5-examples Repo 4::okhttp Repo 5::spring-boot-web-start Repo 6::springboot_docker 20-June-18 16:25:19:071 INFO main c.b.ResttemplateApplication:57 - Started ResttemplateApplication in 3.382 seconds (JVM running for 6.625) 20-June-18 16:25:19:071 INFO main c.b.ResttemplateApplication:17 - completed executing ResttemplateApplication.run()
Get source code and build
- git clone https://github.com/siddharthagit/spring-boot-resttemplate
- cd spring-boot-resttemplate
- mvn clean install
- mvn spring-boot:run
Summary
- In this article, we saw how to write a simple REST client using RESTTEmplate in Spring Boot.
- In our next article, we will see more use cases of using RESTTemplate like for POST/PUT, etc.
No comments :
Post a Comment
Please leave your message queries or suggetions.