谷歌日历API响应:暂时移动


Google calendar API response: moved temporarily

当我向api请求从特定日历获取事件时,有时它会得到302重定向。奇怪的是,这种情况只会偶尔发生,通常是五分之一。

在中发现了以下内容:http://code.google.com/p/googlecl/issues/detail?id=167显然,这与http和https有关。

我在这个范围内使用oauth作用域'=>'https://www.google.com/calendar/feeds/"我正在测试的网站是http,我使用的是https-api-url,就像这里描述的那样:http://code.google.com/apis/calendar/data/2.0/reference.html

这是我得到的回应:

HttpResponse对象([body]=>临时移动

暂时移动

文件已移到此处。[headers]=>数组([过期时间]=>2011年10月27日星期四10:10:02 GMT[日期]=>2011年10月27日星期四10:10:02 GMT[Set Cookie]=>S=calendar=Vi6DcnO0BrcmQr-qJAQj7A;到期时间=2012年10月26日星期五10:10:02 GMT;保护[位置]=>https://www.google.com/calendar/feeds/6okn9orqcq5kgd2ktssvq675k8%40group.calendar.google.com/private/full?alt=jsonc&oauth_consumer_key=paintballboerderij.nl&oauth_nonce=631ebbb152d8f07466fb3f529973b0ce&oauth_signature=VGIfdFlHFOob/TUAO1ArVeeRQ9U%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1319710200&oauth_token=1/EGOUox6t9u1yOZpRXG7FHFfGwP6bRLTZgUjs6dWSTVk&oauth_version=1.0&start max=2011-11-19T23:59:59&start min=2011-11-13T00:00&gsessionid=Vi6DcnO0BrcQr-qJAQj7A[内容类型]=>text.html;charset=UTF-8[缓存控制]=>私有,最大年龄=0[X-Content-Type-Options]=>nosniff[X-Frame-Options]=>SAMEORIGIN[X-XSS-Protection]=>1;mode=块[服务器]=>GSE[连接]=>关闭)[cookies]=>数组([S] =>阵列([value]=>日历=Vi6DcnO0BrcmQr-qJAQj7A[过期时间]=>2012年10月26日星期五10:10:02 GMT[security]=>1))[httpVersion]=>HTTP/1.1[代码]=>302[reasonPhrase]=>暂时移动[原始]=>HTTP/1.1 302暂时移动有效期至:2011年10月27日星期四10:10:02 GMT日期:2011年10月27日星期四10:10:02 GMT设置Cookie:S=日历=Vi6DcnO0BrcmQr-qJAQj7A;到期时间=2012年10月26日星期五10:10:02 GMT;保护地点:https://www.google.com/calendar/feeds/6okn9orqcq5kgd2ktssvq675k8%40group.calendar.google.com/private/full?alt=jsonc&oauth_consumer_key=p***&oauth_nonce=631ebbb152d8f0746fb3f52973b0ce&oauth_signature=VGIfdFlHFOob/TUAO1ArVeeRQ9U%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=139971000&oauth_token=1/EGOUox6t9u1yOZpRXG7FHFfGwP6bRLTZgUjs6dWSTVk&oauth_version=1.0&start max=2011-11-19T23:59:59&start min=2011-11-13T00:00&gsessionid=Vi6DcnO 0BrcmQr-qJAQj7A内容类型:text/html;charset=UTF-8缓存控制:私有,最大年龄=0X-Content-类型选项:nosniffX-Frame-Options:SAMEORIGINX-XSS-保护:1;mode=块服务器:GSE连接:关闭临时移动

暂时移动

文件已移到此处。)

我终于知道如何做到了。我阅读了这一部分:http://code.google.com/apis/calendar/data/2.0/developers_guide_protocol.html#RetrievingEvents


当您发送GET请求时,Calendar可能会返回HTTP 302重定向;重定向URL后面附加了一个新的查询参数gsessionid。(某些发送GET请求的方法可能会自动遵循重定向,在某些情况下,Calendar可能根本不发送重定向;在这种情况下,您不需要发送下面描述的第二个请求。(因此,在发送GET请求后,您必须读取响应的HTTP标头,以找到附加了会话ID的URL;那么您需要使用该新URL发送另一个GET请求。(请注意,如果您使用UNIX命令行发送请求,您可能必须在新URL中的问号前面加一个反斜杠,以防止shell对其进行解释。(作为对第二个GET请求的响应,Calendar返回一个HTTP 200 OK状态代码和一个包含日历中所有事件的提要。如果您的日历中只有一个事件,则calendar会返回类似于以下提要的内容。我们对下面的例子进行了一点编辑,使其更易于人类阅读;特别是,一个真实的Calendar提要包含实际的魔术cookie值和条目ID。


因此,当我向API发出请求时,我会检查响应头。如果响应代码=302,我将获取gsessionid的值。然后,我提出了与第一次完全相同的请求,但随后附加了gsessionid参数键和值。看起来这对我有用。

对于那些想看我的代码的人,我使用带有cakehp2.0框架和一些oauth类的PHP:

                $consumer   = $this->createConsumer();
                    $response   = $consumer->get(
                        $settings['Setting']['access_token_key'], 
                        $settings['Setting']['access_token_secret'], 
                        $find['Calendar']['eventFeedLink'],
                        array(
                            'alt'       => 'jsonc',
                            'start-min' => $_sunday . 'T00:00:00',
                            'start-max' => $_saturday . 'T23:59:59',
                            //'singleevents'    => false
                        )
                    );
                    if($response->code == 302 && isset($response->headers['Location']) && !empty($response->headers['Location'])) {
                        $url    = $response->headers['Location']; 
                        $vars = explode('&',$url);
                        foreach($vars as $string){
                             list($is,$what) = explode('=',$string);
                             if($is == "gsessionid") {
                                 $gsessionid    = $what;
                                 break;
                             }
                        }
                        if(isset($gsessionid) && !empty($gsessionid)) {
                            $response   = $consumer->get(
                                $settings['Setting']['access_token_key'], 
                                $settings['Setting']['access_token_secret'], 
                                $find['Calendar']['eventFeedLink'],
                                array(
                                    'alt'           => 'jsonc',
                                    'start-min'     => $_sunday . 'T00:00:00',
                                    'start-max'     => $_saturday . 'T23:59:59',
                                    'gsessionid'    => $gsessionid
                                    //'singleevents'    => false
                                )
                            );
                        }
                    }

您只需按照重定向到指定的Location即可。

如果您使用的是cURL。将此选项CURLOPT_FOLLOWLOCATION设置为true