天天看點

php 調用天氣接口

這是我在部落格園寫的第一篇原創文章,現在直接複制過來了,CSDN 的部落格搬家功能并不好用,隻能手動了。

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

進入正題 

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結果如下:

php 調用天氣接口

從資料格式來看,很開心,這不就是親切的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) );
	  		
	  }
	  
	});
           

 列印結果如下:

php 調用天氣接口

msg就是一個對象了,列印的結果顯示,對象的裡data 也是一個對象。點選檢視該對象可知:

php 調用天氣接口

對象裡包含城市,空氣品質,天氣品質,目前溫度等資訊,但是具體的資料還是沒有,這個時候又看到了數組 (捂臉哭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));//檢視類型
	  		});
	  }
	});
           

 列印結果如下:

php 調用天氣接口

從列印的内容來看,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;
	  		
	 }
	  		
});
           

 列印結果如下:

php 調用天氣接口

到這裡結果很明顯了,目前這個對象 裡面包含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);
  			});

	  	}
	  		
});
           

 列印結果如下:

php 調用天氣接口

呐,資料已經出來一大半了,這裡就是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)
  			} 

  						
  		}
});                
           

 簡單列印了幾個值,結果如下:

php 調用天氣接口

到這裡基本就結束了,剩下的就是根據需求,将資料追加到模版指定位置了。

最後上一張效果圖:

php 調用天氣接口

頁面雖然醜了點,但是資料有了就好,啊哈哈,開心  \(^∀^)ノ

 嗯,這個接口就說到這裡啦,一個挂件的第一篇原創。

有點慌 (→_→) 差點忘記放代碼了

2.3 前台模版完整代碼:

<!DOCTYPE html>
<html >
<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="查詢" οnclick="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>      

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

因為沒有什麼技術含量,是以把圖檔放小點。

又覺得不太合适,就把圖檔改成手動的了(→_→)

手動圖檔:[圖檔]這是圖檔[/圖檔]

手動:[/滑稽][/滑稽][/滑稽]  

都看到這裡了, 咦,又看到一個接口網站:http://api.help.bj.cn/api/

手動:[/滑稽][/滑稽][/滑稽]