viernes, 6 de febrero de 2015

Consumir un WebService JSON desde JavaScript con Ajax

En muchas ocasiones se nos hace necesario, desde una página HTML, realizar la llamada a un webservice para obtener una serie de resultados. Una buena forma de conseguir esto es utilizar Ajax. Existen múltiples formas de realizar la llamada, y en este post indicaremos simplemente una de ellas. Espero que os sea de utilidad.
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Test consumir WebService</title>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  <script type="text/javascript">
    // Procesar resultados del webservice
    function webServiceResult(data)
    {
      $("#resultado_json").empty();    

      $("#resultado_json").append("Nombre: "+data.name+"<br>");
      $("#resultado_json").append("Pais: "+data.sys.country+"<br>");
      $("#resultado_json").append("Longitud: "+data.coord.lon+"<br>");
      $("#resultado_json").append("Latitud: "+data.coord.lat+"<br>");
      $("#resultado_json").append("Tiempo: "+data.weather[0].main+"<br>");
      $("#resultado_json").append("&nbsp;&nbsp;"+data.weather[0].description+"<br>");
      $("#resultado_json").append("Humedad: "+data.main.humidity+"<br>");
      var tmin = Math.round(10*(data.main.temp_min -273.15)) / 10;
      var tmax = Math.round(10*(data.main.temp_max -273.15)) / 10 ;
      $("#resultado_json").append("Temp. minima: "+tmin+"<br>");
      $("#resultado_json").append("Temp. maxima: "+tmax+"<br>");
    }
      
    // Llamada al webservice
    function callWebService()
    {
      try
      { 
        $.ajax({
          url: "http://api.openweathermap.org/data/2.5/weather",
          data:
          {
              q: "Cordoba,es",
          },
          type: "get",
          async: true,
          contentType: "text/json; charset=utf-8",
          dataType: "jsonp",        
          success: function(msg) { webServiceResult(msg) },
          error: function(jqXmlHttpRequest, textStatus, errorThrown) { alert("Error leyendo datos."); }
        });
      } 
      catch (err) 
      {
        alert(err);
      }
    }
  </script>
  
</head>

<body>

<button type="button" onclick="javascript:callWebService();">Llamar a WS</button>

<div id="resultado_json"></div>

</body>
</html>
Un ejemplo más elaborado, e incluso cargando los datos a consultar desde un fichero JSON, se puede consultar aqui.

7 comentarios :

  1. Muchas gracias. Este código me ha sido de gran utilidad. ¡Saludos!

    ResponderEliminar
  2. Buenos días dice error leyendo datos, alguien me puede ayudar?

    ResponderEliminar
    Respuestas
    1. Hola!
      Yo resolví el problema poniendo "json" en dataType en vez de "jsonp".

      Saludos!

      Eliminar
  3. $("#resultado_json").append("Nombre: "+data.name+"
    ");
    $("#resultado_json").append("Pais: "+data.sys.country+"
    ");
    $("#resultado_json").append("Longitud: "+data.coord.lon+"
    ");
    $("#resultado_json").append("Latitud: "+data.coord.lat+"
    ");
    $("#resultado_json").append("Tiempo: "+data.weather[0].main+"
    ");
    $("#resultado_json").append("  "+data.weather[0].description+"
    ");
    $("#resultado_json").append("Humedad: "+data.main.humidity+"
    ");
    var tmin = Math.round(10*(data.main.temp_min -273.15)) / 10;
    var tmax = Math.round(10*(data.main.temp_max -273.15)) / 10 ;
    $("#resultado_json").append("Temp. minima: "+tmin+"
    ");
    $("#resultado_json").append("Temp. maxima: "+tmax+"
    ");
    }

    en esta sección que va después del nombre, país, longitud etc. son los campos de la base de datos o los datos que voy a pedir

    ResponderEliminar
  4. que significa lo que esta dentro de data!?

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. ya corregi lo de dataType
    Access to XMLHttpRequest at 'http://api.openweathermap.org/data/2.5/weather?q=Cordoba%2Ces' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

    jquery.min.js:4 GET http://api.openweathermap.org/data/2.5/weather?q=Cordoba%2Ces net::ERR_FAILED

    ResponderEliminar

 

Copyright @ 2015 Tosblama