2016-04-29 11 views
2

Ich habe die Google Cloud Vision API mit einer PHP-App, die auf einem privaten VPS gehostet wird, eine Weile ohne Probleme verwendet. Ich migriere die App zu Google AppEngine und stoße jetzt auf Probleme.Google Cloud Vision API auf PHP AppEngine

Ich verwende einen CURL-Post an die API, aber es ist auf AppEngine fehlgeschlagen. Ich habe die Fakturierung aktiviert und andere Curl-Anfragen funktionieren ohne Probleme. Jemand hat erwähnt, dass Aufrufe von googleapis.com bei AppEngine nicht funktionieren und dass ich anders auf die API zugreifen muss. Ich kann keine Ressourcen online finden, um dies zu bestätigen.

Unten ist mein Code, CURL Fehler # 7 wird zurückgegeben, konnte keine Verbindung zum Host herstellen.

$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>'; 

Antwort

0

Ich ändere meinen Code, um URLFetch (file_get_contents) anstelle von CURL zu verwenden. Bis jetzt großartig zu arbeiten. Ich bin mir immer noch nicht sicher, warum CURL nicht funktioniert hat.

+0

Da Sie cURL nicht verwenden können, um eine Verbindung zu Google-Websites herzustellen. (Es ist eine Beschränkung der Remote-Socket-API) –

0

Die Curl-Anfrage an eine Google-API schlägt in PHP fehl, da curl die Sockets-API verwendet und Google-IPs mit Sockets blockiert werden. Diese Einschränkung wird in Limitations and restrictions dokumentiert:

Privat, Broadcast-, Multicast- und Google IP-Bereiche sind blockiert


die POST Anfrage zu senden, die Sie beschreiben, Sie PHP-Stream-Handler verwenden können, sofern der notwendige Kontext, um die Daten zu senden. Ich habe das Beispiel in Issuing HTTP(S) Requests gezeigt angepasst Ihre Anfrage gerecht zu werden:

<!-- 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); 

Ich empfehle auch das Lesen Asserting identity to Google APIs sollten Sie andere als eine API-Schlüssel wie OAuth verwenden Mittel zur Authentifizierung entscheiden.

+0

Dieser Code funktioniert nicht. Eine Idee warum? Warnung: file_get_contents (https://vision.googleapis.com/v1/images:annotate?key=*****************): Stream konnte nicht geöffnet werden: HTTP-Anforderung fehlgeschlagen ! HTTP/1.0 – ahsan

+0

Gibt es eine ausführlichere Protokollierung? Welche 'error_reporting()' Ebene hast du zur Verfügung gestellt? Können Sie auf diese Weise versuchen, eine POST-Anforderung an einen anderen Endpunkt zu senden? Obwohl die Botschaft kurz ist, deutet sie darauf hin, dass überhaupt keine Verbindung hergestellt wird, geschweige denn abgelehnt wird. Wenn dies der Fall ist, könnte das Problem die anfordernde Funktion und nicht der ** Vision API ** -Server sein. – Nicholas

Verwandte Themen