快速搞定天气和行程,走遍天下都不怕!

现在的很多综合网站如hao123都提供了很多非常好的便捷的生活小工具,如天气查看(见下图1)、话费充值、火车票查询等。这些小工具作为网站或app的增值项可以用来增加用户粘性,进而提高网站或者app的流量。
(图1)
        我们知道,类似天气或火车票信息都是数据类的API,即API提供的是数据相关的服务,这类API在百度APIStore平台上有很多。下面就以天气和火车票查询为例,讲述一下如何使用APIStore的API服务。
        全球天气预报API是由和风全球天气提供的可以通过HTTP方式获取天气相关的API。目前有付费和免费两个版本,http url分别为http://apistore.baidu.com/apiworks/servicedetail/880.html和http://apistore.baidu.com/apiworks/servicedetail/478.html,其中付费版本提供的功能更全面(数据更全更详尽)。下面的教程是针对免费版的天气API来讲的,付费版和免费版使用方式一致。
       和风全球天气免费版的基本信息下图:
图2
      上图为和风全球天气免费版对应的APIStore服务详情页主要指标,里面要点是接口地址、请求方式、请求参数(服务详情页:http://apistore.baidu.com/apiworks/servicedetail/478.html)。
       其中的接口地址为数据的存放地点,目前只支持http协议格式。请求方法为GET请求(请求方式主要有GETPOSTPUTDELETE等,具体含义@百度回答)。
       apikeyAPIStore平台设定作为调用API时的身份认证,该apikey可以通过登录APIStore详情页就能看到一串32位字符串,那就是自己的apikey。(注意,调用时将apikey放置到header 至于header是什么,如何放到header@百度君回答,下面也会给出php版本如何添加header参数)。
      请求参数,这里的请求参数是放到url中的,可以看到参数只有一个city,而且国外城市支持汉字和拼音,国外城市直接为对应英文地名。
       火车票相关信息可以使用APIStore平台的去哪儿网火车票。其APIStore平台的详情页为:
http://apistore.baidu.com/apiworks/servicedetail/697.html


我们可以看到,去哪儿往火车票服务总共有4个API,分别功能如下:
    (1)车次详情接口:输入车次号和时间(必填),还有始发站和终点站可以获取沿途各站的站点名和时间。
    (2)车站搜索接口:输入接口版本号和车站名,可以得到经过该站的所有列车以及该列车上所剩的座位的类型和张数。
    (3)站站搜索接口:通过输入两个站点,获取这两个站点之间的所有列车信息,包括:列车类型、车次号、所剩座位信息等。
    (4)suggest接口:通过输入一个城市名,可以获取这个城市的所有列车站点。
      
下面就演示如何调用天气服务以及火车票查询服务。同时获取两个服务的信息(方便起见),具体在使用时要展示天气信息就请求天气对应的API,要做火车票信息查询的工具就用火车票服务对应的API。

1.  
2.   
3.      //和风天气免费版API接口,接口为get方式请求,参数为city, 这里的city参数可以是form表单提交的值  
4.      $weather_url = "http://apis.baidu.com/heweather/weather/free?city=beijing";  
5.      //查询两个站点之间的所有列车的url  
6.      $station_url = "http://apis.baidu.com/qunar/qunar_train_service/s2ssearch?version=1.0&from=北京&to=上海&date=2015-10-01";  
7.        
8.      //执行获取天气服务  
9.      $weather_info = getDataFromApi($weather_url);   //数据为json串  
10.     $map_weather = json_decode($weather_info, true);  
11.   
12.     echo $map_weather['HeWeather data service 3.0'][0]['suggestion'];  //获取整体天气指标建议  
13.     //...获取其他指标类似,可以从map_weather中获取  
14.   
15.     $station_info = getDataFromApi($station_url);  
16.     $map_station = json_decode($station_info, true);          //json串解析  
17.     var_dump($map_station['data']['trainList']);              //打印显示列车列表  
18.     //...可以返回给js,html页面显示  
19.      
20.   
21.     /**
22.      * 以get方式请求url对应的内容
23.      * @param string $url 请求的url
24.      * @return array $response 请求url获取的内容
25.      * @throws Exception
26.      */  
27.     function getDataFromApi($url) {  
28.         $ch = curl_init();  
29.   
30.         $header = array(  
31.             'apikey: e9c9f9bab6**********9f8896628f0a',     //在header中设置apikey,apistore平台身份认证所用  
32.         );  
33.   
34.         curl_setopt($ch, CURLOPT_URL, $url);  
35.         curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  
36.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
37.         curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);         //设置请求超时时间  
38.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
39.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  
40.   
41.         $response = curl_exec($ch);  
42.         if (curl_errno($ch))  
43.         {  
44.             throw new Exception('请求url失败!', -1);  
45.         }  
46.   
47.         curl_close($ch);  
48.   
49.         return $response;  
50.     }  
51.   
52.     /**
53.      * 以post方式获取url对应的内容
54.      * @param array $data post提交的内容
55.      * @param string $url 请求url
56.      * @return array $response 请求返回数据
57.      */  
58.     function  postDataFromApi($data, $url) {  
59.        if (!isset($apiUrl) || !is_array($data)) {  
60.           throw new Exception("无效的参数!",-1);  
61.        }  
62.   
63.         $header = array(  
64.             'apikey: e9c9f9bab61**********f8896628f0a',     //在header中设置apikey,apistore平台身份认证所用  
65.         );  
66.   
67.         $ch = curl_init();  
68.         curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);  
69.         curl_setopt($ch, CURLOPT_URL, $url);  
70.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
71.         curl_setopt($ch, CURLOPT_POST, 1);              //设置方式为post  
72.         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);    //设置post的数据  
73.   
74.         $response = curl_exec($ch);  
75.         if (curl_errno($ch))  
76.         {  
77.             throw new Exception('请求url失败!', -1);  
78.         }  
79.   
80.         curl_close($ch);  
81.   
82.        return $response;  
83.     }  

执行以上代码就可以获取天气相关信息(这里获取的是天气建议信息)和两站之间的火车列表信息。
如火车票API的返回结果,如下:


根据以上信息就可以做成类似下面这样的便民小工具了。

         

当然,你还可以同时显示终点站上海的天气情况。如下:


这样,世界就又恢复了和平!!!欢迎各位跟帖讨论!
最后,请移步百度APIStore,寻找属于你的API!!!!


你可能感兴趣的:(技术分享)