Я использую API Google Cloud Vision с приложением php, размещенным на частном VPS, некоторое время без проблем. Я переношу приложение в Google AppEngine и теперь у меня возникают проблемы.
Я использую сообщение CURL для API, но оно не работает в AppEngine. У меня включен биллинг и другие запросы curl работают без проблем. Кто-то упомянул, что вызовы googleapis.com не будут работать в AppEngine, поэтому мне нужно получить доступ к API по-другому. Я не могу найти какие-либо ресурсы в Интернете, чтобы подтвердить это.
Ниже мой код, возвращается ошибка 7 CURL, не удалось подключиться к хосту.
$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>';
Я переключаю свой код, чтобы использовать URLFetch (file_get_contents) вместо CURL. Работает отлично до сих пор. Я до сих пор не уверен, почему CURL не работает.
Запрос curl к API Google не выполняется в PHP, потому что curl использует Sockets API, а IP-адреса Google блокируются с помощью сокетов. Это ограничение задокументировано в Ограничения и ограничения:
Частные, широковещательные, многоадресные и Google IP диапазоны заблокированы
Чтобы отправить POST
запрос, который вы описываете, вы можете использовать потоковые обработчики PHP, предоставляя необходимый контекст для отправки данных вместе. Я адаптировал пример, показанный в Выдача HTTP (S) запросов удовлетворить ваш запрос:
<!-- 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);
Я также рекомендую прочитать Подтверждение идентичности API Google если вы решите использовать средства аутентификации, отличные от ключа API, такие как OAuth.