En esta era de Internet, muchos servicios auxiliares están disponibles en forma de API REST y, en su mayoría, la API REST nos proporciona los detalles en forma de JSON/XML. Podemos usarlos en nuestras aplicaciones y renderizar los datos como queramos. Aquí está la lista de algunas URL de API REST de código abierto:
Nombre de la API | Descripción | URL |
---|---|---|
CoinGecko | Los tipos de cambio | https://api.coingecko.com/api/v3/exchange_rates |
ExchangeRate-API | Los tipos de cambio | https://open.er-api.com/v6/latest/USD |
Género.io | Predicción de género basada en el nombre | https://api.genderize.io?name=rachel |
WeatherDB | Para saber sobre el clima | https://weatherdbi.herokuapp.com/data/weather/londres |
Zipopótamo | Información del código postal | https://api.zippopotam.us/IN/600028 |
Todavía hay más API de código abierto disponibles. Aquí aprenderemos cómo extraer los detalles del código postal usando Spring MVC:
REST API: http://api.zippopotam.us/IN/<Required Pincode>
Ejemplo:
http://api.zippopotam.us/IN/600028
Salida: 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" } ] }
Ahora, usando Spring MVC Framework , intentemos representar los detalles de la API REST en la pantalla
Implementación:
Es como se muestra paso a paso a continuación, donde inicialmente nos permite ver la estructura del proyecto, que es la siguiente:
A. Archivo: 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. Archivo: index.jsp
Esta es la página que se representa cuando el proyecto se implementa en 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>
Producción:
Al ingresar cualquier código postal válido. Por ejemplo, 600028, nombre en el cuadro de entrada, obtendremos los detalles a continuación.
Proceso de ejecución: desde la página JSP, se invoca un método «GET» con la string de búsqueda y se redirige a la clase Spring Controller, donde se encuentra la URL de la API REST, <a target=»_blank» rel=»noopener noreferrer nofollow» href =»http://api.zippopotam.us/IN/http://api.zippopotam.us/IN/<código postal válido> se invoca y creará el objeto JSON como se indicó anteriormente. De eso, estamos tomando « valores de país”, “estado”, “latitud”, “longitud” y “localidades” .
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]
Salida: Pantalla
El código requerido para recuperar los datos y analizar la salida JSON es el siguiente. Importantes archivos necesarios para lograr el flujo
Archivo: 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; } }
Archivo: 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[] { "/" }; } }
Archivo: 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; } }
Conclusión: este proceso de código es necesario para recuperar cualquier llamada a la API REST. Necesitamos saber si la API REST proporciona JSONObject/JSONArray y, en consecuencia, tenemos que analizar los datos.
Publicación traducida automáticamente
Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA