php 调用天气接口

前几天没事的时候,浏览博客看到了一篇免费天气接口的文章,然后调用了一下文章中提到的接口,自己琢磨了半天,把数据处理了一下,虽然现在用不到,但是说不定以后会用,所以打算记录一下,毕竟这也算是自己第一次在博客园里写出了原创的代码 (→_→)

进入正题

1.先放接口:

1.1 返回 json 形式

1.1.1 通过城市名(北京/北京市)获取当前城市当前温度及未来一周天气预报 (Json数据) :包含台湾的主要县市

接口:http://wthrcdn.etouch.cn/weather_mini?city=北京市 ;

1.1.2 通过城市id(101010100)获取当前城市当前温度及未来一周天气预报 (Json数据) :

接口:http://wthrcdn.etouch.cn/weather_mini?citykey=101010100 ;

1.2 返回 XML数据  未测试 -我习惯处理json 所以 XML 接口没测试

1.2.1 通过城市名(北京/北京市)获取当前城市温度、湿度、空气质量主要参数指数、警告、昨日天气、未来天气、日出日落时间:

接口:http://wthrcdn.etouch.cn/WeatherApi?city=北京市;

注意:台湾城市及大陆一些城市的空气质量没有;

1.2.2 通过城市id(101010100)获取当前城市温度、湿度、空气质量主要参数指数、警告、昨日天气、未来天气、日出日落时间:

接口:http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100

关于城市编码的问题,可以去百度一下,我是觉得用编码不太方便(=_=) 也找了一个地址:http://download.csdn.net/detail/luckydarcy/9627565 我没下载,有需要的可以试一下。

声明: 以下内容为原创内容,如果转载,请在文章开始或结尾处标注原文地址:http://www.cnblogs.com/benpaodelulu/p/7131303.html

放完接口开始放代码了,因为我是简单的测试,所以就很粗暴了 (→_→)

2.代码:

2.1 PHP 文件内容:

<?php  

   function tian(){
    $city=$_GET[‘city‘]; //接收城市名

    $url="http://wthrcdn.etouch.cn/weather_mini?city=".$city;
    $str = file_get_contents($url);  //调用接口获得天气数据
    //这一步很重要
  	$result= gzdecode($str);   //解压
    //end
    echo  $result;

   }
   tian();

?>

代码很简单,需要注意的就是 代码当中的$str 是接口返回的天气数据,它是经过gzip 压缩的,如果直接返回 $str  那么在页面上的数据是 乱码,这里要对$str进行解压缩,用到php的一个gzdecode()函数。

还有,返回的数据是json形式的,但是有点难受 (=_=) 它是json形式的字符串A,需要转化成对象B,对象B里面还包含对象C,对象C里包含数组D,数组D里还包含五个对象E F G H I 。下面就来一步一步解析返回的数据。

2.2 模版js代码分析接口返回数据

2.2.1 直接看ajax,打印返回数据:

$.ajax({
	  type: ‘GET‘,
	  url: "./test.php",
	  data: {city:city},
	 datatype: "json",		//"xml", "html", "script", "json", "jsonp", "text".
	  success: function(msg){
console.log(msg);
console.log(Object.prototype.toString.call(msg) )	  	

	  }

	});

打印msg结果如下:

从数据格式来看,很开心,这不就是亲切的json嘛,然而并不是。它,只是一个String类型的字符串。

2.2.2 接着处理返回数据msg,转化成对象,再打印一下

$.ajax({
	  type: ‘GET‘,
	  url: "./test.php",
	  data: {city:city},
	 datatype: "json",		//"xml", "html", "script", "json", "jsonp", "text".
	  success: function(msg){

	  	var data=eval("("+msg+")");  //转化成对象

console.log(data);
console.log(Object.prototype.toString.call(data) );

	  }

	});

打印结果如下:

msg就是一个对象了,打印的结果显示,对象的里data 也是一个对象。点击查看该对象可知:

对象里包含城市,空气质量,天气质量,当前温度等信息,但是具体的数据还是没有,这个时候又看到了数组 (捂脸哭T_T)。

2.2.3 接着获取对象data

	$.ajax({
	  type: ‘GET‘,
	  url: "./test.php",
	  data: {city:city},
	 datatype: "json",		//"xml", "html", "script", "json", "jsonp", "text".
	  success: function(msg){
	  		var data=eval("("+msg+")");

	  		$.each(data, function(key, val) {
	  		  console.log(val);//打印值
	  		  console.log(Object.prototype.toString.call(val));//查看类型
	  		});
	  }
	});

打印结果如下:

从打印的内容来看,data里有一个对象类型,一个数字类型,一个字符串类型的值。对比上面 2.2.2 的打印的结果,可以知道

对象类型的值对应的是属性data,数字类型的值对应的是status,字符串类型对应的值就是desc

这都不重要,重要的是对象类型的值里有想要的数据。

2.2.4  获取对象val

在这一步处理的时候,需要进行判断,因为有用的只是对象类型的值。

$.each(data, function(key, val) {
	 if (Object.prototype.toString.call(val) === ‘[object Object]‘){
	  		console.log(val);
	  		var j_city=val.city;
	  		var j_kongqi =val.aqi;
	  		var j_wendu =val.wendu;
	  		var j_ganmao =val.ganmao;

	 }

});

打印结果如下:

到这里结果很明显了,当前这个对象 里面包含yesterday这个对象,forecast这个数组,以及其他有用的值(当前日期的天气情况和城市),上面已经将有用的值进行赋值。

2.2.5 下面接着获取yesterday这个对象:

$.each(data, function(key, val) {

	  	 if (Object.prototype.toString.call(val) === ‘[object Object]‘){
	  		var j_city=val.city;
	  		var j_kongqi =val.aqi;
	  		var j_wendu =val.wendu;
	  		var j_ganmao =val.ganmao;

  			$.each(val, function(key1, val1) {
  				console.log(val1);
  			});

	  	}

});

打印结果如下:

呐,数据已经出来一大半了,这里就是yesterday对象的内容,也就是2.2.4中 yesterday对应的Object。 这里的信息都是昨天的天气情况,有用的话可以进行赋值。

2.2.6  处理 Array[object,object,object,object,object]  这里的Array 也就是 2.2.4 打印结果当中的 forecast  包含 未来五天的天气情况。

处理的方式跟上面一样,这里需要数组里面的对象内容,所以要先判断是数组然后遍历出里面的对象,将有用的值进行赋值。

$.each(val, function(key1, val1) {
  		var z_date =val1.date;
  		var z_fl =val1.fl;
  		var z_fx =val1.fx;
  		var z_high =val1.high;
  		var z_low =val1.low;
  		var z_type =val1.type;
  		if(Object.prototype.toString.call(val1) === ‘[object Array]‘){

  			for(var i=0;i<val1.length;i++){

  				var m_date=val1[i].date;
  				var m_high=val1[i].high;
  				var m_fengli=val1[i].fengli;
  				var m_low=val1[i].low;
  				var m_fengxiang=val1[i].fengxiang;
  				var m_type=val1[i].type;

  				console.log(val1[i].date)
	 	                console.log(val1[i].high)
                                console.log(val1[i].low)
  			} 

  		}
});

简单打印了几个值,结果如下:

到这里基本就结束了,剩下的就是根据需求,将数据追加到模版指定位置了。

最后上一张效果图:

页面虽然丑了点,但是数据有了就好,啊哈哈,开心  \(^?^)?

嗯,这个接口就说到这里啦,一个挂件的第一篇原创。

有点慌 (→_→) 差点忘记放代码了

2.3 前台模版完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf8">
    <title>挂件的测试</title>
     <script src="./jquery-3.0.0.js"></script>
</head>
<body>
    <form action="#">
    <table>
        <tr>
            <td>城市</td>
            <td><input id="cheng" type="text" value=""></td>
        </tr>
        <tr>
            <td colspan="2"><input type="button" value="查询" onclick="cha()"></td>
        </tr>
    </table>
    </form>
    <div id="guajian" style="display:none">
        城市:<span id="city"></span><br>
        空气质量指数:<span  id="kongqi"></span><br>
        当前温度:<span  id="wendu"></span><br>
        天气质量:<span  id="ganmao"></span><br>
        <hr/>
    </div>

    <div id="guajian_div"></div>

</body>
<script>
function cha(){
    var city=$("#cheng").val();
    $.ajax({
      type: ‘GET‘,
      url: "./test.php",
      data: {city:city},
      datatype: "json",        //"xml", "html", "script", "json", "jsonp", "text".
      success: function(msg){
              var data=eval("("+msg+")");
              $.each(data, function(key, val) {
                 if (Object.prototype.toString.call(val) === ‘[object Object]‘){
                      var j_city=val.city;
                      var j_kongqi =val.aqi;
                      var j_wendu =val.wendu;
                      var j_ganmao =val.ganmao;
                      $("#city").text(j_city);
                      $("#kongqi").text(j_kongqi);
                      $("#wendu").text(j_wendu);
                      $("#ganmao").text(j_ganmao);
                      $("#guajian").show();
                      $.each(val, function(key1, val1) {
                          var z_date =val1.date;
                          var z_fl =val1.fl;
                          var z_fx =val1.fx;
                          var z_high =val1.high;
                          var z_low =val1.low;
                          var z_type =val1.type;
                          if(Object.prototype.toString.call(val1) === ‘[object Array]‘){
                              for(var i=0;i<val1.length;i++){
                                   var m_date=val1[i].date;
                                   var m_high=val1[i].high;
                                   var m_fengli=val1[i].fengli;
                                   var m_low=val1[i].low;
                                   var m_fengxiang=val1[i].fengxiang;
                                   var m_type=val1[i].type;
                                   if (i==0) {
                                       $(‘#guajian_div‘).empty();
                                   }
                                   $(‘#guajian_div‘).append("<div>日期:"+m_date+"<br/>最高温度:"+m_high+"<br/>最低温度:"+m_low+"<br/>天气:"+m_type+"<br/>风力:"+m_fengli+"<br/>风向:"+m_fengxiang+"</div> <span>-----by guajian 2017/7/7</span><hr/>");
                              }
                          }
                      });
                  }
              });
      }
    });
}

</script>
</html>

如果觉得有帮助的话,可以给打赏,手动开心表情包 \(^?^)?

因为没有什么技术含量,我把图片放小点 (=_=)

时间: 2024-08-08 00:39:35

php 调用天气接口的相关文章

Ajax--art-template + 调用天气接口

一.实现原理: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 9 </body> 10 </html> 11 <!--script标签如果指定一个非标准类型ty

调用天气接口获取天气预报

最新做到一个小练习,涉及到天气预报的温度获取,首先感谢众多前辈提供的大量demo,但是美中不足在于,之前大多数demo所使用的天气接口基本上失效,或者收费了.偶然之间找到一个天气的接口 http://doc.tianqiapi.com/603579 (如有侵权请联系作者删除),截图如下: 几近完善的一个接口及例子,感谢 https://www.tianqiapi.com/ 此网站所提供的免费接口.同时此接口还提供了JS调用实例,所以基本上直接引用就可以得到所需要的温度范围了 $(function

利用C++调用天气webservice-gSOAP方法

首先需要下载一个gSOAP工具包 下载路径为:https://sourceforge.NET/projects/gsoap2/ 至于有关于gSOAP的一些用法和包含的文件的说明可从官网查看:http://www.genivia.com/dev.html. 下载和使用gSOAP生成一些库文件提供给C++工程使用: 解压gsoap文件夹,此处解压的是gsoap-2.8文件夹,放在E盘 打开E:\gsoap-2.8\gsoap\bin\win32文件夹 创建一个文件名为wsmap.dat 以文本形式写

PHP调用API接口实现天气查询功能

天气预报查询接口API,在这里我使用的是国家气象局天气预报接口 使用较多的还有:新浪天气预报接口.百度天气预报接口.google天气接口.Yahoo天气接口等等. 1.查询方式 根据地名查询各城市天气情况 2.请求URL地址http://route.showapi.com/9-2 3.接口参数说明: 一.系统级参数(所有接入点都需要的参数): 二.应用级参数(每个接入点有自己的参数): 4.返回参数 以JSON格式返回结果 1)系统级参数(所有接入点都会返回的参数) 2)应用级参数(系统级输出参

调用天气预报接口

方案一: 浏览器由于安全的限制,不允许跨域访问.但是PHP服务器是允许的.我们可以通过使用PHP文件做代理,通过PHP来调用接口. 详细接口分析可参看:http://www.cnblogs.com/wangjingblogs/p/3192953.html 返回JSON格式 PHP代码 <?php //此接口返回json格式 echo file_get_contents('http://www.weather.com.cn/data/cityinfo/101181601.html'); ?> H

关于Silverlight调用天气预报接口问题

问题:因Silverlight客户端不能直接调用webservice接口(外网天气接口),调用会出现跨域访问的问题,即使添加了跨域文件也不好使.解决方法如下 解决方法一:1.在服务端建立一个wcf服务端,在wcf里调用webservice接口(外网天气接口) wcf服务接口IWeatherService.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtim

使用WebService天气接口,自动获取天气,并定时写入数据库

因为我也是菜鸟,所以尽量写的简单些..... 1. 使用的天气接口为 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx ,虽说是免费的,但是有使用次数限制 2. 开发使用的是VS2012 中的 C#控制台程序,开发时需要添加WEB引用,没错,地址就是上面的URL 3. 引用方法:右键项目 -> 添加服务引用 -> 左下角高级选项 -> 添加Web引用,如下图,URL为接口地址,Web引用名随你喜欢就填什么,我填的是We

使用soapui调用webservice接口

soapui是专门模拟调用webservice接口的工具,下面介绍下怎么使用: 1.下载soapui并安装: 2.以免费天气获取接口为例:http://www.webservicex.net/globalweather.asmx?wsdl,访问这个地址在页面上ctrl+s另存为后缀为.wsdl的文件 3.打开soapui,在左侧project上右击new soapui project,选择刚才的wsdl文件生成project 4.生成project如图: 5.点开一个接口的request,如图:

项目中调用天气预报接口

项目中使用的是心知天气的API,下面我就简单总结一下使用的过程: 1. 在心知天气官网注册一个个人账号,这样就会产生一个API秘钥和一个用户ID,用户ID用于签名验证方式.签名指的是通过HMAC-SHA1,对请求参数加密后得到的签名字串进行身份验证,避免了将API密钥明文包含在请求中而造成泄露. 2. 关于签名生成方式如下: (1)构造验证参数字符串 将请求参数按照参数名字典升序排列后,把所有参数param=value用&连接起来,类似URI中Query string的构造方式.目前支持的参数有