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代码如下:
  1. 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



posted @ 2014-12-07 11:53  杜小川  阅读(2971)  评论(0)    收藏  举报