1. 程式人生 > >php 調用天氣接口

php 調用天氣接口

第一次 .cn pan 不定 empty 完整 有用 con 但是

前幾天沒事的時候,瀏覽博客看到了一篇免費天氣接口的文章,然後調用了一下文章中提到的接口,自己琢磨了半天,把數據處理了一下,雖然現在用不到,但是說不定以後會用,所以打算記錄一下,畢竟這也算是自己第一次在博客園裏寫出了原創的代碼 (→_→)

進入正題

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>

如果覺得有幫助的話,可以給打賞,手動開心表情包 \(^?^)?

因為沒有什麽技術含量,我把圖片放小點 (=_=)

技術分享技術分享

php 調用天氣接口