OpenSource REST API URL and Retrieving Data From it By Using Spring MVC
In this internet era, a lot of helper services are available in the form of REST API and mostly REST API provides us the details in the form of JSON/XML. We can use them in our applications and render the data as we like. Here is the list of a few opensource REST API URLs:
API Name | Description | URL |
---|---|---|
CoinGecko | Exchange rates | https://api.coingecko.com/api/v3/exchange_rates |
ExchangeRate-API | Exchange rates | https://open.er-api.com/v6/latest/INR |
Genderize.io | Prediction of gender based on name | https://api.genderize.io?name=rachel |
WeatherDB | To know about the weather | https://weatherdbi.herokuapp.com/data/weather/london |
Zippopotamus | Zipcode information | https://api.zippopotam.us/IN/600028 |
There are still more open-source APIs available. Here we will be learning how to extract the zip code details using Spring MVC:
REST API: http://api.zippopotam.us/IN/<Required Pincode>
Example:
http://api.zippopotam.us/IN/600028
Output: JSON
{ "post code": "600028", "country": "India", "country abbreviation": "IN", "places": [ { "place name": "Fore Shore Estate", "longitude": "80.2417", "state": "Tamil Nadu", "state abbreviation": "TN", "latitude": "13.0206" }, { "place name": "Ramakrishnanagar", "longitude": "80.2417", "state": "Tamil Nadu", "state abbreviation": "TN", "latitude": "13.0206" }, { "place name": "R A Puram Colony", "longitude": "80.2417", "state": "Tamil Nadu", "state abbreviation": "TN", "latitude": "13.0206" } ] }
Now using Spring MVC Framework, let us try to render the REST API details on the screen
Implementation:
It is as depicted Step by Step below where initially let us do see the project structure which is as follows:
A. File: pom.xml
XML
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" > < modelVersion >4.0.0</ modelVersion > < groupId >com.zipCode.zipCode_RestAPI</ groupId > < artifactId >zipCode_RestAPI</ artifactId > < packaging >war</ packaging > < version >0.0.1-SNAPSHOT</ version > < name >profileGenerator</ name > < url >http://maven.apache.org</ url > < properties > < failOnMissingWebXml >false</ failOnMissingWebXml > < spring-version >5.1.0.RELEASE</ spring-version > </ properties > < dependencies > <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-webmvc</ artifactId > < version >${spring-version}</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-test</ artifactId > < version >${spring-version}</ version > </ dependency > <!-- JSTL Dependency --> < dependency > < groupId >javax.servlet.jsp.jstl</ groupId > < artifactId >javax.servlet.jsp.jstl-api</ artifactId > < version >1.2.1</ version > </ dependency > < dependency > < groupId >taglibs</ groupId > < artifactId >standard</ artifactId > < version >1.1.2</ version > </ dependency > <!-- Servlet Dependency --> < dependency > < groupId >javax.servlet</ groupId > < artifactId >javax.servlet-api</ artifactId > < version >3.1.0</ version > < scope >provided</ scope > </ dependency > <!-- JSP Dependency --> < dependency > < groupId >javax.servlet.jsp</ groupId > < artifactId >javax.servlet.jsp-api</ artifactId > < version >2.3.1</ version > < scope >provided</ scope > </ dependency > < dependency > < groupId >com.google.code.gson</ groupId > < artifactId >gson</ artifactId > < version >2.8.6</ version > </ dependency > < dependency > < groupId >commons-io</ groupId > < artifactId >commons-io</ artifactId > < version >2.5</ version > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.12</ version > < scope >test</ scope > </ dependency > </ dependencies > < build > < finalName >Zipcode</ finalName > < sourceDirectory >src/main/java</ sourceDirectory > < plugins > < plugin > < artifactId >maven-compiler-plugin</ artifactId > < version >3.5.1</ version > < configuration > < source >1.8</ source > < target >1.8</ target > </ configuration > </ plugin > < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-war-plugin</ artifactId > < version >3.3.2</ version > </ plugin > < plugin > < groupId >org.codehaus.mojo</ groupId > < artifactId >tomcat-maven-plugin</ artifactId > < version >1.0-beta-1</ version > </ plugin > </ plugins > </ build > </ project > |
B. File: index.jsp
This is the page that gets rendered when the project is deployed in tomcat
HTML
<!DOCTYPE html> < html lang = "en" > < head > < meta charset = "utf-8" > < meta http-equiv = "X-UA-Compatible" content = "IE=edge" > < meta name = "viewport" content = "width=device-width, initial-scale=1" > < title >ZipCode</ title > < link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js" ></ script > < script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" ></ script > < style type = "text/css" > .main-form, .profile-area { width: 500px; background: #FF5733; } .main-form { margin: 50px auto 0px; } .profile-area { margin: 10px auto; } .main-form section, .profile-area section { margin-bottom: 15px; background: #f7f7f7; box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); } .main-form section { padding: 30px; } .profile-area section { padding: 30px 30px 30px; } .profile-area section > div { text-align: center; } .main-form h3 { margin: 0 0 15px; } .form-control, .btn { min-height: 38px; border-radius: 2px; } .btn { font-size: 15px; font-weight: bold; } .hideElement { display: none; } </ style > </ head > < body > < div class = "main-form" id = "main-form" > < section > < h5 class = "text-center" >Enter your zipcode</ h5 > < div class = "form-group" > < input id = "zipcode" type = "text" class = "form-control" placeholder = "Enter zipcode here..." required = "required" > </ div > < div class = "form-group" > < button onclick = "loadData()" class = "btn btn-primary btn-block" >Find Area Details</ button > </ div > </ section > </ div > < div class = "profile-area hideElement" id = "profile-area" > < section > < div id = "loader" class = "hideElement" > < div class = "spinner-border" role = "status" > < span class = "sr-only" >Loading...</ span > </ div > </ div > < div id = "profile" class = "hideElement" > < br >< br > < p >< strong >Country : </ strong >< span id = "country" ></ span ></ p > < p >< strong >State : </ strong >< span id = "statename" ></ span ></ p > < p >< strong >Localities : </ strong >< span id = "associatedplaces" ></ span ></ p > < p >< strong >Latitude : </ strong >< span id = "associatedlatitude" ></ span ></ p > < p >< strong >Longitude : </ strong >< span id = "associatedlongitude" ></ span ></ p > </ div > </ section > </ div > </ body > < script > function loadData() { document.getElementById("profile-area").classList.remove("hideElement"); document.getElementById("loader").classList.remove("hideElement"); document.getElementById("profile").classList.add("hideElement"); var zipCode = document.getElementById("zipcode").value; if(zipCode != "" && zipCode != null) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var jsonResponse = JSON.parse(this.responseText); document.getElementById("country").innerHTML = jsonResponse.country; document.getElementById("statename").innerHTML = jsonResponse.statename; document.getElementById("associatedplaces").innerHTML = jsonResponse.associatedplaces; document.getElementById("associatedlatitude").innerHTML = jsonResponse.associatedlatitude; document.getElementById("associatedlongitude").innerHTML = jsonResponse.associatedlongitude; document.getElementById("loader").classList.add("hideElement"); document.getElementById("profile").classList.remove("hideElement"); } }; xhttp.open("GET", "getLocalityDetailsByZipCode?zipCode=" + zipCode, true); xhttp.send(); console.log("done"); } else { console.log("Enter zipcode...") } } </ script > </ html > |
Output:
On entering any valid zip code. For example 600028, name in the input box, we will get the below details.
Execution Process: From the JSP page, a “GET” method is invoked with the search string and it is redirected to the Spring Controller class, where the REST API URL, <a target="_blank" rel="noopener noreferrer nofollow" href="http://api.zippopotam.us/IN/http://api.zippopotam.us/IN/<valid zipcode> is invoked and it will create the JSON object as given above, From that, we are taking “country”, “state”,”latitude”,”longitude” and “localities” values.
Country : India State : Tamil Nadu Localities : [Fore Shore Estate, Ramakrishnanagar, R A Puram Colony] Latitude : [13.0206, 13.0206, 13.0206] Longitude : [80.2417, 80.2417, 80.2417]
Output: Screen
Required code for retrieving the data and parsing the JSON output is as follows. Important necessary files to achieve the flow
File: AppConfig.java
Java
// Java Program to Illustrate Application // configuration Class // Importing required classes import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; // Annotations @Configuration @EnableWebMvc @ComponentScan (basePackages = { "com.zipCode.zipCode_RestAPI" }) // Class public class AppConfig { @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setViewClass(JstlView. class ); resolver.setPrefix( "/" ); resolver.setSuffix( ".jsp" ); return resolver; } } |
File: SpringMvcDispatcherServletInitializer.java
Java
// Java Program to Illustrate // SpringMvcDispatcherServletInitializer Class // Importing required classes import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; // Class public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // Method 1 @Override protected Class<?>[] getRootConfigClasses() { return null ; } // Method 2 @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { AppConfig. class }; } // Method 3 @Override protected String[] getServletMappings() { return new String[] { "/" }; } } |
File: ZipCodeController.java
Java
// Java Program to Illustrate ZipCodeController Class // Importing required classes import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; // Annotation @Controller // Class public class ZipCodeController { // Method 1 @RequestMapping ( "/getLocalityDetailsByZipCode" ) public @ResponseBody JsonObject getLocalityDetailsByZipCode(String zipCode) throws IOException { JsonObject jsonObject = new JsonObject(); jsonObject = getLocalityDetailsByZip(zipCode); // Parsing the JSONObject JsonObject finalJsonObject = new JsonObject(); String country = jsonObject.get( "country" ).toString(); country = country.replaceAll( "^\"|\"$" , "" ); JsonArray jsonPlacesArray = null ; ArrayList placesList = new ArrayList(); ArrayList stateList = new ArrayList(); ArrayList latitudeList = new ArrayList(); ArrayList longitudeList = new ArrayList(); // Places data is available as JSONArray jsonPlacesArray = jsonObject.get( "places" ).getAsJsonArray(); // It is iterated Iterator<JsonElement> objectIterator = jsonPlacesArray.iterator(); while (objectIterator.hasNext()) { JsonElement object = objectIterator.next(); JsonObject jObj = object.getAsJsonObject(); System.out.println( jObj.get( "place name" ).toString() + jObj.get( "state" ).toString()); placesList.add(jObj.get( "place name" ) .toString() .replaceAll( "^\"|\"$" , "" )); stateList.add( jObj.get( "state" ).toString().replaceAll( "^\"|\"$" , "" )); latitudeList.add( jObj.get( "latitude" ) .toString() .replaceAll( "^\"|\"$" , "" )); longitudeList.add( jObj.get( "longitude" ) .toString() .replaceAll( "^\"|\"$" , "" )); } finalJsonObject.addProperty( "country" , country); finalJsonObject.addProperty( "associatedplaces" , placesList.toString()); finalJsonObject.addProperty( "associatedplacessize" , placesList.size()); finalJsonObject.addProperty( "state" , stateList.toString()); finalJsonObject.addProperty( "statename" , stateList.get( 0 ).toString()); finalJsonObject.addProperty( "associatedlatitude" , latitudeList.toString()); finalJsonObject.addProperty( "associatedlatitudesize" , latitudeList.size()); finalJsonObject.addProperty( "associatedlongitude" , longitudeList.toString()); finalJsonObject.addProperty( "associatedlongitudesize" , longitudeList.size()); return finalJsonObject; } // Method 2 private JsonObject getLocalityDetailsByZip(String zipCode) throws IOException { String data = null ; StringBuilder responseData = new StringBuilder(); JsonObject jsonObject = null ; URL url = null ; url = new URL( "http://api.zippopotam.us/IN/" + zipCode); HttpURLConnection con = (HttpURLConnection)url.openConnection(); con.setRequestMethod( "GET" ); con.setRequestProperty( "User-Agent" , "Mozilla/5.0" ); int responseCode = con.getResponseCode(); System.out.println( "\nSending 'GET' request to URL : " + url); // System.out.println("Response Code : " + // responseCode); // Try block to check for exceptions try (BufferedReader in = new BufferedReader( new InputStreamReader( con.getInputStream()))) { String line; while ((line = in.readLine()) != null ) { responseData.append(line); } jsonObject = new Gson().fromJson( responseData.toString(), JsonObject. class ); } // System.out.println(data); return jsonObject; } } |
Conclusion: This process of code is required for retrieving any REST API call. We need to know whether REST API provides either JSONObject/JSONArray and accordingly we have to parse the data.