REpresentational State Transfer (REST) is an architectural style that defines a set of constraints to be used for creating web services. REST API is a way of accessing web services in a simple and flexible way without having any processing. Spring MVC is a Web MVC Framework for building web applications. It is a spring module same as spring boot, spring-security, etc. The term MVC stands for Model-View-Controller architecture. REST API calls are widely used nowadays to get various information like Weather, Zip code, Cryptocurrency, University details, etc., In this article, let us try to get the university/college details via
http://universities.hipolabs.com/search?country=india&name=kamaraj
Corresponding JSON Output:
http://universities.hipolabs.com/search?country=india
We will get many values for this and let us see the sample
Using Spring Framework, let us implement and get the details of the college. For simplicity, let us pass both parameters namely country and name as parameters
Step by Step Implementation
Project Structure:
This is a maven-driven project. Hence let’s start with
pom.xml
XML
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 < modelVersion >4.0.0</ modelVersion > < groupId >com.college.college_RestAPI</ groupId > < artifactId >College_RestAPI</ artifactId > < packaging >war</ packaging > < version >0.0.1-SNAPSHOT</ version > < name >collegeRestAPI</ name > < properties > < failOnMissingWebXml >false</ failOnMissingWebXml > < spring-version >5.1.0.RELEASE</ spring-version > </ properties > < dependencies > < 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 >ROOT</ 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 > <!-- This should be added to overcome Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer --> < plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-war-plugin</ artifactId > < version >3.3.2</ version > </ plugin > </ plugins > </ build > </ project > |
Let us start with JSP pages which is the page that gets rendered into tomcat when the project runs
index.jsp
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 >Colleges</ title > < link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" > < style type = "text/css" > .main-form, .profile-area { width: 340px; } .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 > < div class = "form-group" > < input id = "searchString" type = "text" class = "form-control" placeholder = "Enter college search name here..." required = "required" > </ div > < div class = "form-group" > < input id = "countryName" type = "text" class = "form-control" placeholder = "Enter country name here..." required = "required" > </ div > < div class = "form-group" > < button onclick = "loadData()" class = "btn btn-primary btn-block" >Find College 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 >Colleges : </ strong >< span id = "associatedcolleges" ></ span ></ p > < p >< strong >Webpages : </ strong >< span id = "associatedwebpages" ></ 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 searchString = document.getElementById("searchString").value; var countryName = document.getElementById("countryName").value; if(searchString != "" && searchString != null && countryName != "" && countryName != null) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var jsonResponse = JSON.parse(this.responseText); document.getElementById("associatedcolleges").innerHTML = jsonResponse.associatedcolleges; document.getElementById("associatedwebpages").innerHTML = jsonResponse.associatedwebpages; document.getElementById("loader").classList.add("hideElement"); document.getElementById("profile").classList.remove("hideElement"); } }; xhttp.open("GET", "getCollegeDetailsBycountryNameAndSearchString?countryName="+ countryName + "&name=" + searchString, true); xhttp.send(); console.log("done"); } else { console.log("Enter country name and search string to check...") } } </ script > </ html > |
Output:
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, http://universities.hipolabs.com/search?name=<collegename>&country=<countryname> is invoked and it will create the JSON Array as given above, From that, we are taking “name” and “web_pages” values alone
Example:
name: Madurai Kamaraj University web_pages: http://www.mkuhyd.com/
To get the details, we have to go through important files of the project
AppConfig.java
Java
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; @Configuration @EnableWebMvc @ComponentScan (basePackages = { "com.college.college_RestAPI" }) public class AppConfig { @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setViewClass(JstlView. class ); resolver.setPrefix( "/" ); resolver.setSuffix( ".jsp" ); return resolver; } } |
SpringMvcDispatcherServletInitializer.java
Java
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class SpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null ; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] { AppConfig. class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } } |
CollegeController.java
Java
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; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @Controller public class CollegeController { @RequestMapping ( "/getCollegeDetailsBycountryNameAndSearchString" ) public @ResponseBody JsonObject getLocalityDetailsByZipCode(String countryName,String name) throws IOException { JsonArray jsonArray = new JsonArray(); jsonArray = getCollegeDetailsByParams(countryName,name); JsonObject finalJsonObject = new JsonObject(); // String country = jsonObject.get("country").toString(); // country = country.replaceAll("^\"|\"$", ""); ArrayList collegeList = new ArrayList(); ArrayList stateList = new ArrayList(); ArrayList webPageList = new ArrayList(); // ArrayList longitudeList = new ArrayList(); // jsonPlacesArray = jsonObject.get("places").getAsJsonArray(); Iterator<JsonElement> objectIterator = jsonArray.iterator(); while (objectIterator.hasNext()) { JsonElement object = objectIterator.next(); JsonObject jObj = object.getAsJsonObject(); // System.out.println(jObj.get("place name").toString() + jObj.get("state").toString() ); collegeList.add(jObj.get( "name" ).toString().replaceAll( "^\"|\"$" , "" )); stateList.add(jObj.get( "state-province" ).toString().replaceAll( "^\"|\"$" , "" )); webPageList.add(jObj.get( "web_pages" ).toString().replaceAll( "^\"|\"$" , "" )); } // finalJsonObject.addProperty("country", country); finalJsonObject.addProperty( "associatedcolleges" , collegeList.toString()); finalJsonObject.addProperty( "associatedcollegesize" , collegeList.size()); finalJsonObject.addProperty( "state" , stateList.toString()); finalJsonObject.addProperty( "statename" , stateList.get( 0 ).toString()); finalJsonObject.addProperty( "associatedwebpages" , webPageList.toString()); finalJsonObject.addProperty( "associatedwebpagesize" , webPageList.size()); return finalJsonObject; } private JsonArray getCollegeDetailsByParams(String countryName,String name) throws IOException { StringBuilder responseData = new StringBuilder(); JsonArray jsonArray = null ; URL url = null ; 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 (BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()))) { String line; while ((line = in.readLine()) != null ) { responseData.append(line); } jsonArray = new Gson().fromJson(responseData.toString(), JsonArray. class ); } return jsonArray; } } |
Conclusion
REST API plays a major role nowadays and as the output is available in the format of JSON Array/Object, it can be rendered on any web page, android coding to get the output in android mobiles, IOS technologies to get the output in apple devices. Hence the vast amount of information is shared across the universe in a fraction of seconds using REST API.