Cryptocurrencies are a hot topic now and in the future; they may also be a payment source. Hence a lot of research is getting done. Many REST APIs are available to provide data in JSON format. We are going to see one such REST API as
https://api.wazirx.com/sapi/v1/ticker/24hr?symbol=<Need to provide the symbol of cryptocurrency>
Example:
https://api.wazirx.com/sapi/v1/ticker/24hr?symbol=ethinr
JSON Response:
Let us see how to get a JSON response and render it in JSP pages via a Spring MVC project. Project is prepared as a maven project.
Project Structure:
pom.xml
XML
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 < modelVersion >4.0.0</ modelVersion > < groupId >com.lasttwentyfour.cryptodata</ groupId > < artifactId >lasttwentyfourcryptodataRestAPI</ artifactId > < packaging >war</ packaging > < version >0.0.1-SNAPSHOT</ version > < name >lasttwentyfourcryptodataRestAPI</ 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 >LastTwentyFourDetails</ 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 > |
JSP page that is necessary for invocation
lastTwentyFourCryptoData.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 >Last Twenty Four Cryptocurrency Data</ 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: 500px; } .main-form { margin: 50px auto 0px; } .profile-area { margin: 10px auto; } .main-form section, .profile-area section { margin-bottom: 15px; background: #ffb891; 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; font-family: verdana; } .hideElement { display: none; } table, th, td { border: 1px solid white; border-collapse: collapse; } th, td { background-color: #a0e040; } </ style > </ head > < body > < div class = "main-form" id = "main-form" > < section > < h5 class = "text-center" >Enter a Cryptocurrency to know about its 24 hour data </ h5 > < div class = "form-group" > < input id = "symbol" type = "text" class = "form-control" placeholder = "Enter a Cryptocurrency(btc/eth/icx/bnb etc) ..." required = "required" > </ div > <!-- <h5 class="text-center">Enter a comparison Cryptocurrency </h5> <div class="form-group"> <input id="tsyms" type="text" class="form-control" placeholder="Enter a comparison Cryptocurrency ..." required="required"> </div> --> < div class = "form-group" > < button onclick = "loadData()" class = "btn btn-primary btn-block" >Fetch 24 Hours Crypto Data</ 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" > < center > < table border = "2" col> < tr > < th >< strong >< span id = "cryptosymbol" > </ span > Price In INR </ strong ></ th > </ tr > < tr >< td >< strong >OpenPrice : < span id = "openPrice" ></ span ></ strong ></ td ></ tr > < tr >< td >< strong >LastPrice : < span id = "lastPrice" ></ span ></ strong ></ td ></ tr > < tr >< td >< strong >BidPrice : < span id = "bidPrice" ></ span ></ strong ></ td ></ tr > </ table > </ center > </ 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 symbol = document.getElementById("symbol").value; if(symbol != "" && symbol != null) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var jsonResponse = JSON.parse(this.responseText); document.getElementById("cryptosymbol").innerHTML = jsonResponse.cryptosymbol ; document.getElementById("openPrice").innerHTML = jsonResponse.openPrice; document.getElementById("lastPrice").innerHTML = jsonResponse.lastPrice; document.getElementById("bidPrice").innerHTML = jsonResponse.bidPrice; document.getElementById("loader").classList.add("hideElement"); document.getElementById("profile").classList.remove("hideElement"); } }; xhttp.open("GET", "getCryptodataForLastTwentyFour?cryptoSymbol=" + symbol + "inr", true); xhttp.send(); console.log("done"); } else { console.log("Enter a cryptocurrency...") } } </ script > </ html > |
Output:
Let us provide any symbol of cryptocurrencies. A few examples are provided in the below table.
Cryptocurrency |
Symbol |
---|---|
Bitcoin | btc |
Ethereum | eth |
Tether | USDT |
XRP | XRP |
Litecoin | LTC |
Let us see for eth (Ethereum)
Important java files that need to be looked
AppConfig.java
Java
package com.lasttwentyfour.cryptodata.config; 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.lasttwentyfour.cryptodata" }) 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
package com.lasttwentyfour.cryptodata.config; 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[] { "/" }; } } |
CryptocurrencyLastTwentyFourHourController.java
Java
package com.lasttwentyfour.cryptodata.controller; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; 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 CryptocurrencyLastTwentyFourHourController { @RequestMapping ( "/getCryptodataForLastTwentyFour" ) public @ResponseBody JsonObject getCryptodataForLastTwentyFour(String cryptoSymbol) throws IOException { JsonObject jsonObject = new JsonObject(); jsonObject = getCryptoDetailsForLastTwentyFour(cryptoSymbol); String data = jsonObject.toString().replaceAll( "^\"|\"$" , "" ); StringTokenizer jsonTokenizer = new StringTokenizer(data, "," ); String internalData[]; String expectedCryptocurrencyOutput = null ; while (jsonTokenizer.hasMoreTokens()) { expectedCryptocurrencyOutput = jsonTokenizer.nextToken(); internalData = StringUtils.split(expectedCryptocurrencyOutput, ":" ); System.out.println(internalData[ 0 ]+internalData[ 1 ]); if (internalData[ 0 ].substring( 1 ,internalData[ 0 ].length()- 1 ).equalsIgnoreCase( "baseAsset" )) { jsonObject.addProperty( "cryptosymbol" ,internalData[ 1 ].substring( 1 ,internalData[ 1 ].length()- 1 )); } if (internalData[ 0 ].substring( 1 ,internalData[ 0 ].length()- 1 ).equalsIgnoreCase( "openPrice" )) { jsonObject.addProperty( "openPrice" ,internalData[ 1 ].substring( 1 ,internalData[ 1 ].length()- 1 )); } if (internalData[ 0 ].substring( 1 ,internalData[ 0 ].length()- 1 ).equalsIgnoreCase( "lastPrice" )) { jsonObject.addProperty( "lastPrice" ,internalData[ 1 ].substring( 1 ,internalData[ 1 ].length()- 1 )); } if (internalData[ 0 ].substring( 1 ,internalData[ 0 ].length()- 1 ).equalsIgnoreCase( "bidPrice" )) { jsonObject.addProperty( "bidPrice" ,internalData[ 1 ].substring( 1 ,internalData[ 1 ].length()- 1 )); } } return jsonObject; } private JsonObject getCryptoDetailsForLastTwentyFour(String cryptoSymbol) throws IOException { StringBuilder responseData = new StringBuilder(); JsonObject jsonObject = null ; URL url = null ; // url = new URL("https://api.wazirx.com/sapi/v1/tickers/24hr"); 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 ); } System.out.println(jsonObject); return jsonObject; } } |
Another Example: