file_get_contents() を使ってGoogleのAPIからデータを取得出来ない


例えば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の場合だけこの問題が発生しております。




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

ブラウザでアクセスした場合も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]




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

ブラウザでアクセスした場合も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]

