2016-04-29 53 views
2

我一直使用Google Cloud Vision api與一個私有VPS託管的php應用程序一段時間沒有問題。我正在將該應用遷移到Google AppEngine,現在遇到了問題。谷歌在PHP上的雲視覺API AppEngine

我正在使用CURL發佈到API,但它在AppEngine上失敗。我啓用了計費功能,並且其他捲曲請求無任何問題。有人提到googleapis.com的調用不適用於AppEngine,我需要以不同方式訪問API。我無法在網上找到任何資源來確認。

下面是我的代碼,CURL錯誤#7返回,無法連接到主機。

$request_json = '{ 
      "requests": [ 
       { 
        "image": { 
        "source": { 
         "gcsImageUri":"gs://bucketname/image.jpg" 
        } 
        }, 
        "features": [ 
         { 
         "type": "LABEL_DETECTION", 
         "maxResults": 200 
         } 
        ] 
       } 
      ] 
     }'; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'https://vision.googleapis.com/v1/images:annotate?key='.GOOGLE_CLOUD_VISION_KEY); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-type: application/json')); 
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $request_json); 
$json_response = curl_exec($curl); 
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
if ($status != 200) { 
    die("Error: $status, response $json_response, curl_error " . curl_error($curl) . ', curl_errno ' . curl_errno($curl)); 
} 
curl_close($curl); 
echo '<pre>'; 
echo $json_response; 
echo '</pre>'; 

回答

0

我將我的代碼切換爲使用URLFetch(file_get_contents)而不是CURL。迄今爲止工作很好。我仍然不確定爲什麼CURL不起作用。

+0

因爲你不能使用cURL連接到谷歌擁有的網站。 (這是遠程套接字API的限制) –

0

對PHP的curl請求在PHP中失敗,因爲curl使用套接字API,Google IP使用套接字阻塞。此限制記錄在Limitations and restrictions

私人,廣播,多播和谷歌的IP範圍被封鎖


要發送POST要求你描述,你可以使用PHP的流處理器,提供發送數據的必要上下文。我已經適應在Issuing HTTP(S) Requests所示,以滿足您的要求的例子:

<!-- language: lang-php --> 

$url = 'https://vision.googleapis.com/v1/images:annotate'; 
$url .= '?key=' . GOOGLE_CLOUD_VISION_KEY; 

$data = [ 
    [ 
     'image' => [ 
      'source' => [ 
       'gcsImageUri' => 'gs://bucketname/image.jpg' 
      ] 
     ], 
     'features' => [ 
      [ 
       'type' => 'LABEL_DETECTION', 
       'maxResults' => 200 
      ] 
     ] 
    ] 
]; 

$headers = "accept: */*\r\nContent-Type: application/json\r\n"; 

$context = [ 
    'http' => [ 
     'method' => 'POST', 
     'header' => $headers, 
     'content' => json_encode($data), 
    ] 
]; 
$context = stream_context_create($context); 
$result = file_get_contents($url, false, $context); 

我也建議你閱讀Asserting identity to Google APIs,你應該決定使用像OAuth的API密鑰等認證手段。

+0

這段代碼不工作。任何想法爲什麼? 警告:file_get_contents(https://vision.googleapis.com/v1/images:annotate?key=*****************):無法打開流:HTTP請求失敗! HTTP/1.0 – ahsan

+0

是否有更詳細的日誌記錄可用?你提供了什麼'error_reporting()'級別?您可以測試以這種方式向其他端點發送POST請求嗎?儘管信息很簡潔,但它確實表明根本沒有任何聯繫,更不用說被拒絕了。如果是這種情況,問題可能是請求功能,而不是** Vision API **服務器。 – Nicholas