google API 之Calendar api v3
由于工作的需要,最近这一周的时间一直在研究google日历的api,无奈自己的英文实在是差劲,加之由于一些公所周知的原因,在国内无法正常访问google的绝大部分服务,也因此给我的工作带来很大的不便,一想到这心里就会有千万匹草泥马奔驰而过,欸?跑题了,不过还好,一周的努力没有白费,总算有呢么一点点收获,赶紧记录下来,免得以后忘记。
因为最近google关闭了大部分api的v2版本,而且v3版本跟v2版本有很大的不同,因此必须升级到最新版本才行。我的目的是通过调用google的calendar api获取到google public calenadar上的假期时间表。
一、先决条件
1、 要是用google的api,首先 要有一个google的账户,这个不用多说。
2、创建一个工程。地址https://console.developers.google.com/project,之后点击你的工程名,然后选择左边侧栏 API & auth,点击APIS,确保你要是使用的api的状态是ON,也就是打开的。
3,继续点击侧边栏的Credentials,这一步非常关键。google给我们提供两种访问api的认证方式,一种是使用oauth协议方式,一种是使用Public API access的方式,这里我们好不犹豫的使用Public API access的方式,点击Create New Key,有四种选项,这里我们选择Browser Key,(其实选择Server Key也好使),在文本框里什么都不填,就是默认所有的访问都可接受,点击创建,Ok,到了这里我们就得到了访问google api,的key。
要调用google的api,google为开发者提供了两种方式:
一种是通过发送http请求,然后 解析请求的返回内容,
一种是是使用google提供的类库,也就是client libraries.
个人感觉使用http请求更加简单和人性化,也只需用到我们刚才申请的api key,因此我采用http请求的方式。
二、其他相关
根据google的文档中说,要使用http请求的方式,首先要了解一下REST协议,这个以后慢慢了解吧,实在没兴趣往下看了。。。
另外 还需要一些json格式文件的知识,以为google calendar api返回的数据内容格式是JSON格式的。
三、开始编码
1、首先要明确的是,我的目的是向google的服务器发送一个请求,这个请求包含一些参数,来指定要请求的内容范围,google 就收请求并验证成功后,将去哦请求的内容返回,我得到Response的数据后进行解析,ok,明确了目的,下一步就好办多了。
2、有关uri
具体的uri格式是:
https://www.googleapis.com/apiName/apiVersion/resourcePath?parameters
具体的calendar 请求uri格式是:
https://www.googleapis.com/calendar/v3/users/me/calendarList?parameters
https://www.googleapis.com/calendar/v3/calendars/calendarID/events/eventID?parameters
具体的参数一详细的uri请根据需求在文档中查询,例如我要是用calendar的api,那么我将使用上面个格式,
关于calendarId,具体可到你自己登陆google首页后,点击进入google 日历,选则其他日历,点击holiday in china,选择日历设置,
要获得holiday的 话,也可到这里查询具体的calendarId,地址:https://gist.github.com/mattn/1438183
因为我要查询所有的holiday,所以在这里查询具体的参数和值:https://developers.google.com/google-apps/calendar/v3/reference/events/list
3、实现方式
具体实现方式可以有很多选择,可以使用java,C#,等,我是用的是jquery ajax,跨域发送请求,具体的js代码如下:
-
var $j = jQuery.noConflict(); $j(document).ready(function(){ var baseQueryUrl ="https://www.googleapis.com/calendar/v3/calendars/";// var calendarId ="zh.china%23holiday@group.v.calendar.google.com";// Id of the calendar which to show //var calendarId = "ja.japanese%23holiday%40group.v.calendar.google.com" var apiKey ="AIzaSyAy0HyGyd1SX97-DNZAu-rQF-j02LT7Q1o"; //public Key for server applications var minYear =2014; var minMonth =1; var minDay =1; var maxYear =2014; var maxMonth =12; var maxDay =31; var paramList ={//search parameters key:apiKey,//apiKey to be authorized maxResults:250,//default is 250,but never be larger 25000 timeMin:newDate(minYear,minMonth,minDay).toISOString(),//date type must be ISO standard format timeMax:newDate(maxYear,maxMonth,maxDay).toISOString(), singleEvents:true, orderBy:"startTime",//make sure if you want them ordered by statrtTime,singleEvents must be true //timeZone:"", //pageToken:"" }; var gdata =newObject();//the object contains items of search result var feedUrl = baseQueryUrl+calendarId+"/events"; $j.ajax({ url:feedUrl, type:"GET", data:paramList, contentType:"application/json;charset=utf-8", dataType:"json", success:function(data){ gdata = decode(data); $j("#loadMessage").text("loaded successfully"); $j("#showResultBtn").css("display","block"); }, error:function(message){ console.log(message); } }); $j("#showResultBtn").click(function(e){ if(!e.defaultPrevented){ var txt ="<p>共有结果:"+gdata.length+"条</p>"; for(i=0;i<gdata.length;i++){ txt +="<p>"+gdata[i].startDate+"--"+gdata[i].endDate+" "+gdata[i].title+"</p>"; } $j("#content").html(txt); } }); }); function decode(entrys){ var days =[]; var cnt =0; if(!entrys){ return days; } //ergodic entrys to decode for(i=0;i<entrys.items.length;i++){ var entry = entrys.items[i]; var startYmd = entry.start.date.toString(); var endYmd = entry.end.date.toString(); if(entry.summary!=null&&entry.summary!='undefined'){ days[cnt]={ startDate:startYmd, endDate:endYmd, title:entry.summary }; } cnt++; } return days; } function formatDateTime(year,month,day){ var padZero =function(value){return("0"+value).slice(-2);}; var y = year ||newDate().getFullYear(); var start =[y,padZero(month||1),padZero(day||1)].join("-"); return start; }
html文件:
<!DOCTYPE html> <html> <head> <title>过渡</title> <metacharset="utf-8"> <scripttype="text/javascript"src="jquery-1.10.2.min.js"></script> <scripttype="text/javascript"src="tool.js"></script> <linkrel="stylesheet"href="style_demo.css"type="text/css"> </head> <body> <divid="calendar"> <pid="laodMessage"></p> <buttonid="showResultBtn"style="display:none">click to display result</button> <divid="content"></div> </div> </body> </html>
PS: 要执行这段程序,必须绕过greate fire wall才行,我试过这个工具勉强可以,也很方便:hoststool,参见http://www.cnblogs.com/magialmoon/p/useful-tools.html

浙公网安备 33010602011771号