2016-05-10 49 views
7

我稱自己是一位經驗豐富的PHP開發人員,但這讓我瘋狂。我試圖獲取存儲庫的發佈信息以顯示更新警告,但我一直返回403錯誤。爲了簡化它,我使用了GitHubs API的最簡單的用法:GET https://api.github.com/zen。這是一個你好的世界。file_get_contents()每次從api.github.com獲取403

這工作

  • 直接在瀏覽器
  • 使用純curl https://api.github.com/zen在終端
  • 用PHP-Github的-API級等php-github-api

這工作不

  • 與來自PHP-Skript

這是我的整個簡化代碼的簡單file_get_contents()

<?php 
    $content = file_get_contents("https://api.github.com/zen"); 
    var_dump($content); 
?> 

的瀏覽器顯示Warning: file_get_contents(https://api.github.com/zen): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden,可變$content是布爾和false

我想我錯過了某種類型的http-header-fields,但我既沒有在API-Docs中找到這些信息,也沒有使用我的終端curl-調用了任何特殊的頭文件和工程。

你有什麼提示嗎?提前致謝!

+0

你嘗試使用[提琴手(http://www.telerik.com/fiddler)來比較不同的電話? –

+0

是否啓用了'allow_url_fopen'? – Pitchinnate

+0

'allow_url_fopen'已啓用。感謝@RickS提供的工具建議,我將其納入我未來的工作流程中。正如我猜測的那樣,解決方案是一個缺失的標題字段。看到明顯的答案。 –

回答

10

發生這種情況是因爲GitHub要求您發送UserAgent標頭。它不需要是任何特定的。這將做到:

$opts = [ 
     'http' => [ 
       'method' => 'GET', 
       'header' => [ 
         'User-Agent: PHP' 
       ] 
     ] 
]; 

$context = stream_context_create($opts); 
$content = file_get_contents("https://api.github.com/zen", false, $context); 
var_dump($content); 

輸出是:

string(35) "Approachable is better than simple." 
+0

這一個幫助,謝謝。您是否從經驗中知道,或者是否有我監督過的文檔中的任何說明? –

+0

受過教育的猜測;) –

+0

供參考。 https://developer.github.com/v3/#user-agent-required>所有的API請求都必須包含一個有效的User-Agent頭。沒有用戶代理標題的請求將被拒絕。我們要求您使用您的GitHub用戶名或您的應用程序的名稱作爲User-Agent標頭值。這可以讓我們在出現問題時與您聯繫。 – haakym