Open In App

Spring MVC – Get Exchange Rate Values using REST API

Improve
Improve
Like Article
Like
Save
Share
Report

People are doing business, and developing software for geographical locations. That means the calculation of a software price will vary globally. During those scenarios, we need to know about the exchange rates for a given currency. Nowadays many open source REST API calls are available and among that there is a call available to get exchange rates as well

https://api.exchangerate-api.com/v4/latest/<Any currency we need to give here>

Example:

https://api.exchangerate-api.com/v4/latest/INR

Corresponding JSON Output:

 

Using Spring MVC, we can retrieve the JSON response that got from the REST API call and render it on our pages. Via a maven-driven project, let us do that. So, let us start with the full project structure and pom.xml file.

Step by Step Implementation

Project Structure:

Project Structure

 

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.exchangeRate.exchangeRate_Rest_API</groupId>
    <artifactId>exchangeRate_Rest_API</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>
        <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>ExchangeRate</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>


Invocation file : getExchangeRates.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>ExchangeRate</title>
    <style type="text/css">
        .main-form, .profile-area {
            width: 500px;
        }
        .main-form {
            margin: 50px auto 0px;
        }
        .profile-area {
            margin: 10px auto;
        }
        .main-form section, .profile-area section {
            margin-bottom: 15px;
            background: #33FFF9;
            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 currency</h5>
        <div class="form-group">
            <input id="currency" type="text" class="form-control" placeholder="Enter currency here..." required="required">
        </div>
        <div class="form-group">
            <button onclick="loadData()" class="btn btn-primary btn-block">Find ExchangeRate 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>Indian Currency(INR) : </strong><span id="INR"></span></p>
  
              
<p><strong>British Pound(GBP)    : </strong><span id="GBP"></span></p>
  
              
<p><strong>Euro(Euro)               : </strong><span id="EUR"></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 currency = document.getElementById("currency").value;
  
        var otherCurrency1,otherCurrency2;
        if(currency != "" && currency != null) {
            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    var jsonResponse = JSON.parse(this.responseText);
                    document.getElementById("INR").innerHTML = jsonResponse.INR;
                    document.getElementById("GBP").innerHTML = jsonResponse.GBP;
                    document.getElementById("EUR").innerHTML = jsonResponse.EUR;
                    document.getElementById("loader").classList.add("hideElement");
                    document.getElementById("profile").classList.remove("hideElement");
                }
            };
            xhttp.open("GET", "getExchangeRateDetailsByCurrency?currency=" + currency, true);
            xhttp.send();
            console.log("done");
        } else {
            console.log("Enter currency...")
        }
    }
</script>
</html>


Output:

Output

 

Let us try to give INR in the place of entering currency here

Output

 

Output

 

Output

 

Now let us see the important java files for getting the exchange rate values

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.exchangeRate.exchangeRate_Rest_API" })
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[] { "/" };
    
    
}


ExchangeRateController.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.StringTokenizer;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
  
@Controller
public class ExchangeRateController {
  
    @RequestMapping("/getExchangeRateDetailsByCurrency")
    public @ResponseBody
    JsonObject getExchangeRateDetails(String  currency) throws IOException {
  
        JsonObject jsonObject = new JsonObject();
        String data = getExchangeRateData(currency);
        data = data.replaceAll("^\"|\"$", "");
        StringTokenizer jsonTokenizer = new StringTokenizer(data,",");
        String internalData[];
        String expectedExchangeRateOutput = null;
        ArrayList otherCurrencies = new ArrayList();
          
        // Here given provisions to get the 
        // value of GBP and EUR for INR
        if (currency.equalsIgnoreCase("INR")) {
            otherCurrencies.add("GBP");
            otherCurrencies.add("EUR");
        }
        
        // Here given provisions to get the 
        // value of INR and EUR for GBP
        if (currency.equalsIgnoreCase("GBP")) {
            otherCurrencies.add("INR");
            otherCurrencies.add("EUR");
        }
        
        // Here given provisions to get the value
        // of GBP and INR for EUR
        if (currency.equalsIgnoreCase("EUR")) {
            otherCurrencies.add("INR");
            otherCurrencies.add("GBP");
        }
        while (jsonTokenizer.hasMoreTokens()) {  
            expectedExchangeRateOutput = jsonTokenizer.nextToken();
            internalData = StringUtils.split(expectedExchangeRateOutput,":");
            System.out.println(internalData[0]+internalData[1]);
            if (internalData[0].substring(2,internalData[0].length()-1).equalsIgnoreCase(currency)) {
                jsonObject.addProperty(currency, internalData[1]);                
            }
            if (internalData[0].substring(1,internalData[0].length()-1).equalsIgnoreCase(otherCurrencies.get(0).toString())) {
                jsonObject.addProperty(otherCurrencies.get(0).toString(), internalData[1]);
            }
            if (internalData[0].substring(1,internalData[0].length()-1).equalsIgnoreCase(otherCurrencies.get(1).toString())) {
                jsonObject.addProperty(otherCurrencies.get(1).toString(), internalData[1]);
            }
        
  
        return jsonObject;
    }
  
    private String getExchangeRateData(String currency) throws IOException {
        String data = null;
        StringBuilder responseData = new StringBuilder();
        JsonObject jsonObject = null;
        URL url = null;
        url = new URL("https://api.exchangerate-api.com/v4/latest/" + currency);        
        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);
            }
            jsonObject = new Gson().fromJson(responseData.toString(), JsonObject.class);
              
            data = jsonObject.get("rates").toString();
  
        }
        // System.out.println(data);
        return data;
    }
}


For rendering different exchange rate values, we need to modify the ExchangeRateController.java file according to our needs.

Conclusion

REST APIs are independent and highly scalable. Hence it can be consumed in web technologies like Java, JSP, Spring combinations, or other platforms too. Similarly, as it is providing the response as JSON, it is highly supportive to prepare android applications as well as IOS applications. In a way, we can say that world has shrunk and quick responses are available from many open-source REST API calls.



Last Updated : 29 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments