Sunday, November 17, 2024
Google search engine
HomeLanguagesJavaSpring MVC – Get University/College Details via REST API

Spring MVC – Get University/College Details via REST API

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:

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
                        http://maven.apache.org/maven-v4_0_0.xsd">
    <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>
    <url>http://maven.apache.org</url>
    <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>
    <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;
        url = new URL("http://universities.hipolabs.com/search?name=" +  name + "&country=" + countryName);
          
        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.

Dominic Rubhabha-Wardslaus
Dominic Rubhabha-Wardslaushttp://wardslaus.com
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

Most Popular

Recent Comments