10893


例えばPHP 5.4.39で以下の様なコードを実行すると

[code]

    $data = file_get_contents('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=');
    var_dump($data);
    
[/code]

期待している動作では、以下のjsonが返ってくると思っています。

[code]

    {
     "error": "invalid_token",
     "error_description": "Invalid Value"
    }
    
[/code]

ところが、`bool(false)`となりデータが取得出来ません。  
ブラウザでアクセスした場合は問題がありません。  
試しにUser-Agentを指定した場合でも挙動に変化はありませんでした。

ちなみに

[code]

    $data = file_get_contents('http://www.yahoo.co.jp/');
    
[/code]

とした場合には、問題無くHTMLが取得出来ております。

対応方法としては`cURL`で実装すれば問題無いことはわかっていますが、  
なぜ`file_get_contents()`で出来ないのか知りたいところです。  
恐らくGoogleの場合だけこの問題が発生しております。


CC BY-SA 3.0
2015-06-02T08:11:07.033
10890
2015-06-02T08:52:11.583
7306
question
php
file_get_contents() を使ってGoogleのAPIからデータを取得出来ない


> ブラウザでアクセスした場合は問題がありません。

ブラウザでアクセスした場合もhttp statusは400で返ってきてると思います。  
file_get_contents() は既定値では http statusが400番台500番台のときはコンテンツを取得しません。  
以下のようにすることでエラー時もコンテンツを取得するようになります。

[code]

    $opt = array("http" => array('ignore_errors' => true));
    $data = file_get_contents('https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=', false, stream_context_create($opt));
    var_dump($data);
    
[/code]


CC BY-SA 3.0
2015-06-02T08:52:11.583
10893
2015-06-02T08:52:11.583
7343
10890
answer