curso node llamar a un service web api

primero vamos a instalar yargs
y setear que reciba (esta vez sin un comando de por medio) el argumento
de la direccion de la que se quiere saber su clima


const argv=require('yargs').options(
{
   direccion:{
alias:'d',
demand:true,
desc: 'direccion a traer el clima'
}
}).
argv;

console.log(argv.direccion);


entonces si llamamos

node app -d "buenos aires argentina"

obtendremos

buenos aires argentina


vamos a instalar ahora un paquete para poder hacer llamadas a apis externas,
en este caso usaremos Axios (tambien puede ser request)

npm install axios --save

recordar que ponemos el --save para que se registre el paquete en el package.json como un dependencia, de lo contrario, se bajara la libreria sin registrarse la dependencia.

si se quiere instalar una version en especifico simplemente la escribimos antecediendole una arroba:

npm installa axios@0.18.0 --save

ahora ya podemos utilizarlo para llamar al webservice de google de geocoding

const axios=require('axios');

const urlEncoded = encodeURIComponent(argv.direccion);//para que convierta espacios

const apiKey = "AIzaSyBlRKjSjinm50447yd_qWAjvzojhWND7Ip-w";

axios.get(`https://maps.googleapis.com/maps/api/geocode/json?address=${urlEncoded}&key=${apiKey}`)
  .then(function (response) {
    console.log(JSON.stringify(response.data));
  })
  .catch(function (error) {
    console.log(error);
  });


usamos response.data
para que por consola nos muestre solo los datos de la data de geocoding
y JSON.stringify(response.data)
para que nos muestre los datos de los objetos / arrays que trae Data sino no los podremos ver.

por consola los datos apareceran uno al lado del otro si queremos que se vean en distintas lineas
y con margenes usamos

JSON.stringify(response.data,undefined,2));

la respuesta sera algo asi

 {                                                   
 "results": [                                       
   {                                                 
     "address_components": [                         
       {                                             
         "long_name": "Buenos Aires",               
         "short_name": "CABA",                       
         "types": [                                 
           "locality",                               
           "political"                               
         ]                                           
       },                                           
       {                                             
         "long_name": "Buenos Aires",               
         "short_name": "CABA",                       
         "types": [                                 
           "administrative_area_level_1",           
           "political"                               
         ]                                           
       },                                           
       {                                             
         "long_name": "Argentina",                   
         "short_name": "AR",                         
         "types": [                                 
           "country",                               
           "political"                               
         ]                                           
       }                                             
     ],                                             
     "formatted_address": "Buenos Aires, Argentina", 
     "geometry": {                                   
       "bounds": {                                   
         "northeast": {                             
           "lat": -34.5265464,                       
           "lng": -58.33514470000001                 
         },                                         
         "southwest": {                             
           "lat": -34.7051011,                       
           "lng": -58.5314522                       
         }                                           
       },                                           
       "location": {                                 
         "lat": -34.6036844,                         
         "lng": -58.3815591                         
       },                                           
       "location_type": "APPROXIMATE",               
       "viewport": {                                 
         "northeast": {                             
           "lat": -34.5265464,                       
           "lng": -58.33514470000001                 
         },                                         
         "southwest": {                             
           "lat": -34.7051011,                       
           "lng": -58.5314522                       
         }                                           
       }                                             
     },                                             
     "place_id": "ChIJvQz5TjvKvJURh47oiC6Bs6A",     
     "types": [                                     
       "locality",                                   
       "political"                                   
     ]                                               
   }                                                 
 ],                                                 
 "status": "OK"                                     
 }                                                 

entonces..si quisieramos imprimir solo la direccion formateada, la latitud y la longitud hariamos esto:

let results = response.data.results[0];
    let formatted_address = results.formatted_address;

    let lat = results.geometry.location.lat;
    let lng = results.geometry.location.lng;

    console.log(`Direccion: ${formatted_address}`);
 
console.log(`Longitud: ${lng}`);
 
console.log(`Latitud: ${lat}`);



///////////////////////// refactorizando el codigo//////////////////////////////////

vamos a crear una funcion getLugar para que nos devuelva un objeto con las propiedades
direccion,latitud y longitud. Y lo escribiremos en un archivo aparte (lugar/lugar.app) dentro de un carpeta llamada lugar.

lugar.js:


const axios=require('axios');



const getLugar = async (direccion) => {

   let addressEncoded = encodeURI(direccion);
   let apiKey = "AIzaSyBlRKjSjinm507yd_qWAjvzojhWND7Ip-w";

   let resp = await axios.get(`https://maps.googleapis.com/maps/api/geocode/json?address=${addressEncoded}&key=${apiKey}`);

   if(resp.data.status === "ZERO_RESULTS"){
      throw new Error("No se encontraron resultados");
   }
 
   let results = resp.data.results[0];
   return {
     direccion: results.formatted_address,
     longitud:results.geometry.location.lng,
     latitud:results.geometry.location.lat
   }
 
}
   
module.exports = {
  getLugar
}


y en app.js

const argv=require('yargs').options(
{
   direccion:{
alias:'d',
demand:true,
desc: 'direccion a traer el clima'
}
}).
argv;

const { getLugar } = require('./lugar/lugar.js');

getLugar(argv.direccion)
.then(resp=>{
  console.log(resp)
}).catch(e=>console.log(e));




No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable