Ответ API календаря Google: временно перемещен - PullRequest
0 голосов
/ 27 октября 2011

Когда я делаю запрос к API для получения событий от определенного календаря, иногда он получает перенаправление 302.Странно то, что это случается только иногда, часто 1 из 5.

обнаружил это: http://code.google.com/p/googlecl/issues/detail?id=167 очевидно, это как-то связано с http и https.

Iиспользую oauth с этой областью;'scope' => 'https://www.google.com/calendar/feeds/' и веб-сайт, на котором я тестирую, является http, и я использую https api url, как описано здесь: http://code.google.com/apis/calendar/data/2.0/reference.html

Это ответ, который я получаю:

HttpResponse Object
(
    [body] => 

Moved Temporarily


<H1>Moved Temporarily</H1>
The document has moved here.



    [headers] => Array
        (
            [Expires] => Thu, 27 Oct 2011 10:10:02 GMT
            [Date] => Thu, 27 Oct 2011 10:10:02 GMT
            [Set-Cookie] => S=calendar=Vi6DcnO0BrcmQr-qJAQj7A;Expires=Fri, 26-Oct-2012 10:10:02 GMT;Secure
            [Location] => 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:00&gsessionid=Vi6DcnO0BrcmQr-qJAQj7A
            [Content-Type] => text/html; charset=UTF-8
            [Cache-Control] => private, max-age=0
            [X-Content-Type-Options] => nosniff
            [X-Frame-Options] => SAMEORIGIN
            [X-XSS-Protection] => 1; mode=block
            [Server] => GSE
            [Connection] => close
        )

    [cookies] => Array
        (
            [S] => Array
                (
                    [value] => calendar=Vi6DcnO0BrcmQr-qJAQj7A
                    [expires] => Fri, 26-Oct-2012 10:10:02 GMT
                    [secure] => 1
                )

        )

    [httpVersion] => HTTP/1.1
    [code] => 302
    [reasonPhrase] => Moved Temporarily
    [raw] => HTTP/1.1 302 Moved Temporarily
Expires: Thu, 27 Oct 2011 10:10:02 GMT
Date: Thu, 27 Oct 2011 10:10:02 GMT
Set-Cookie: S=calendar=Vi6DcnO0BrcmQr-qJAQj7A;Expires=Fri, 26-Oct-2012 10:10:02 GMT;Secure
Location: https://www.google.com/calendar/feeds/6okn9orqcq5kgd2ktssvq675k8%40group.calendar.google.com/private/full?alt=jsonc&oauth_consumer_key=p***&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:00&gsessionid=Vi6DcnO0BrcmQr-qJAQj7A
Content-Type: text/html; charset=UTF-8
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Connection: close



Moved Temporarily


<H1>Moved Temporarily</H1>
The document has moved here.



)

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Я наконец-то знаю, как это сделать, знаю.Я прочитал этот раздел: http://code.google.com/apis/calendar/data/2.0/developers_guide_protocol.html#RetrievingEvents


Когда вы отправляете этот запрос GET, Календарь может вернуть HTTP 302 перенаправление;URL перенаправления имеет новый параметр запроса, gsessionid, добавленный к нему.(Обратите внимание, что некоторые методы отправки запроса GET могут не отображать заголовки ответа по умолчанию; если вы получаете пустой ответ, обратитесь к документации своей утилиты HTTP, чтобы узнать, как просмотреть заголовки ответа.) Этот параметр gsessionid - это способ, которым Calendarотслеживает вашу сессию, чтобы улучшить скорость ответа.(Некоторые методы отправки запроса GET могут автоматически следовать за перенаправлениями, а в некоторых случаях Calendar может вообще не отправлять перенаправление; в таких случаях вам не нужно отправлять второй запрос, описанный ниже.) Поэтому после отправкизапрос GET, вы должны прочитать заголовки HTTP ответа, чтобы найти URL с добавленным идентификатором сеанса;Затем вам нужно отправить еще один запрос GET с этим новым URL.(Обратите внимание, что если вы используете командную строку UNIX для отправки запросов, вам, возможно, придется поставить вопросительный знак в новом URL-адресе с обратной косой чертой, чтобы ваша оболочка не интерпретировала его.) В ответ на второй GET-запрос Calendar возвращаеткод состояния HTTP 200 OK и канал, содержащий все события в вашем календаре.Если в вашем календаре только одно событие, Календарь возвращает что-то похожее на следующий канал.Мы немного отредактировали следующий пример, чтобы сделать его немного более читабельным для людей;в частности, реальная лента Календаря содержит действительные значения cookie-файлов и идентификаторы записей.


Поэтому, когда я делаю запрос к API, я проверяю заголовок ответа.Если код ответа = 302, я улавливаю значение gsessionid.Затем я делаю точно такой же запрос, как в первый раз, но затем с приложенным ключом и значением параметра gsessionid.Похоже, это работает для меня.

Для людей, которые хотят видеть мой код, я использую PHP с фреймворком cakephp 2.0 и некоторый класс oauth:

                $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
                                )
                            );

                        }

                    }
1 голос
/ 27 октября 2011

Вы просто следуете перенаправлению на указанный Location.

Если вы используете cURL. Вы устанавливаете эту опцию CURLOPT_FOLLOWLOCATION на true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...