2011-10-27 3 views
0

特定のカレンダーからイベントを取得するためにAPIにリクエストを送信すると、302リダイレクトが発生することがあります。奇妙なことは、これがたまにしか起こらないことです、しばしば5のうち1になります。GoogleカレンダーAPIの応答:一時的に移動されました

in:http://code.google.com/p/googlecl/issues/detail?id=167これは明らかにhttpとhttpsと関係があります。

私はこの範囲で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 


Moved Temporarily

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

Moved Temporarily

The document has moved here. )

答えて

3

私はついにそれを知る方法を知っています。あなたはその要求をGET送信するとhttp://code.google.com/apis/calendar/data/2.0/developers_guide_protocol.html#RetrievingEvents


、カレンダーは、HTTP 302リダイレクトを返すことがあり;:私は、このセクションを読みますリダイレクトURLに新しいクエリパラメータgsessionidが追加されます。 (GET要求を送信するいくつかの方法では、デフォルトで応答ヘッダーが表示されない場合がありますが、空白の応答がある場合は、HTTPユーティリティのマニュアルを参照して応答ヘッダーの表示方法を確認してください)。gsessionidパラメータは、あなたのセッションを追跡し、応答速度を向上させます。 (GET要求を送信するいくつかの方法は、自動的にリダイレクトに従うかもしれません。場合によっては、カレンダーがリダイレクトをまったく送信しない場合もあります(後で説明する2番目の要求を送信する必要はありません)。 GETリクエストを送信した場合は、レスポンスのHTTPヘッダーを読み取ってセッションIDが付加されたURLを見つけなければなりません。その新しいURLで別のGET要求を送信する必要があります。 (UNIXコマンドラインを使用してリクエストを送信している場合は、新しいURLの疑問符の前にバックスラッシュを付けてシェルが解釈しないようにする必要があります)。 HTTP 200 OKステータスコード、およびカレンダー内のすべてのイベントを含むフィード。あなたのカレンダーにイベントが1つしかない場合、カレンダーは次のようなものを返します。私たちは、以下の例を編集して、人間が少し読めるようにしました。特に、実際のカレンダーフィードには、実際のマジッククッキーの値とエントリIDが含まれています。


私はAPIにリクエストすると、応答ヘッダーをチェックします。応答コード= 302の場合、私はgsessionidの値を捕まえます。それから私は最初にやったのと全く同じ要求をしますが、その後gsessionidパラメータのキーと値が添付されています。これは私のために働いているように見えます。 CakePHPの2.0フレームワークと、いくつかのOAuthクラスでPHPを使用して私のコードを見てみたいpoeple、イムについては

   $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

指定したLocationにリダイレクトするだけです。

cURLを使用している場合。このオプションをCURLOPT_FOLLOWLOCATIONからtrueに設定します。

+0

は、私は、httpソケットでCakePHPの2.0を使用しています。また、最初のリクエストのheader.locationとcookieを使って新しいリクエストを作成しようとしましたが、Googleから認証エラーのエラーが出ました。 – Melvin

関連する問題