2016-04-29 27 views
2

Google Cloud Vision APIをプライベートVPSでホストされているPHPアプリケーションで問題なく使用しています。私はアプリをGoogle AppEngineに移行していて、今問題にぶつかっています。PHP App Engine上のGoogle Cloud Vision API

私はAPIにCURL投稿を使用していますが、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

CURLの代わりにURLFetch(file_get_contents)を使用するようにコードを切り替えています。これまでの素晴らしい仕事。私はCURLがうまくいかなかった理由はまだ分かりません。

+0

Googleの所有サイトに接続するためにcURLを使用することはできません。 (それはリモートソケットAPIの制限です) –

0

curlがSockets APIを使用し、Google IPがソケットでブロックされているため、Google APIへのcurlリクエストはPHPで失敗します。この制限はLimitations and restrictionsに記載されています:

プライベート、ブロードキャスト、マルチキャスト、およびGoogleのIP範囲は、あなたが、あなたがPHPのストリーム・ハンドラを使用することができます説明POSTリクエストを送信するには


をブロックされ、提供しますデータを送信するのに必要なコンテキスト私はあなたの要求に合うように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.googleisis.com/v1/images:annotate?key=*****************):ストリームを開くことに失敗しました:HTTP要求に失敗しました! HTTP/1.0 – ahsan

+0

これ以上の詳細ログはありますか?どのような 'error_reporting()'レベルを指定しましたか?このように他のエンドポイントに 'POST'リクエストを送信することをテストできますか?メッセージは簡潔ですが、接続が全く行われていないことを示唆しています。この場合、** Vision API **サーバーではなく、要求機能に問題がある可能性があります。 – Nicholas

関連する問題