基于PHP AppEngine的Google云视觉API

基于PHP AppEngine的Google云视觉API,php,google-app-engine,google-cloud-vision,Php,Google App Engine,Google Cloud Vision,我已经将Google Cloud Vision api与托管在私有VPS上的php应用程序一起使用了一段时间,没有出现任何问题。我正在将应用程序迁移到Google AppEngine,现在遇到了一些问题 我在API中使用了一个CURL post,但它在AppEngine上失败了。我启用了计费功能,其他curl请求可以正常工作。有人提到对googleapis.com的调用在AppEngine上不起作用,我需要以不同的方式访问API。我无法在网上找到任何资源来证实这一点 下面是我的代码,返回CURL

我已经将Google Cloud Vision api与托管在私有VPS上的php应用程序一起使用了一段时间,没有出现任何问题。我正在将应用程序迁移到Google AppEngine,现在遇到了一些问题

我在API中使用了一个CURL post,但它在AppEngine上失败了。我启用了计费功能,其他curl请求可以正常工作。有人提到对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>';
$request\u-json={
“请求”:[
{
“图像”:{
“来源”:{
“gcsImageUri”:“gs://bucketname/image.jpg”
}
},
“特点”:[
{
“类型”:“标签检测”,
“最大结果”:200
}
]
}
]
}';
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,'https://vision.googleapis.com/v1/images:annotate?key="谷歌"云"(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\u response=curl\u exec($curl);
$status=curl\u getinfo($curl,CURLINFO\u HTTP\u代码);
如果($status!=200){
die(“Error:$status,response$json_response,curl_Error.curl_Error($curl)。”,curl_errno.curl_errno($curl));
}
curl_close($curl);
回声';
echo$json_响应;
回声';

我将代码切换为使用URLFetch(文件获取内容)而不是CURL。到目前为止工作得很好。我仍然不确定为什么CURL不能工作。

在PHP中,对Google API的CURL请求失败,因为CURL使用套接字API,Google IP被套接字阻止。此限制记录在:

私有、广播、多播和谷歌IP范围被阻止


要发送所描述的
POST
请求,可以使用PHP的流处理程序,提供必要的上下文来发送数据。我已根据您的要求修改了中所示的示例:


$url='1https://vision.googleapis.com/v1/images:annotate';
$url.='?键='。GOOGLE_CLOUD_VISION_KEY;
$data=[
[
“图像”=>[
“来源”=>[
'gcsImageUri'=>'gs://bucketname/image.jpg'
]
],
“功能”=>[
[
'type'=>'LABEL_DETECTION',
“maxResults”=>200
]
]
]
];
$headers=“accept://*\r\n内容类型:application/json\r\n”;
$context=[
“http'=>[
'方法'=>'发布',
'header'=>$headers,
'content'=>json_encode($data),
]
];
$context=stream\u context\u create($context);
$result=file\u get\u contents($url,false,$context);

如果您决定使用身份验证手段而不是像OAuth这样的API密钥,我还建议您阅读。

因为您不能使用cURL连接到google拥有的站点。(这是远程套接字API的限制)此代码不起作用。知道为什么吗?警告:文件获取内容(*************):无法打开流:HTTP请求失败!HTTP/1.0是否还有其他详细日志记录可用?您提供了什么级别的
错误报告()?您可以通过这种方式测试向任何其他端点发送
POST
请求吗?虽然这条信息很简洁,但它确实表明根本没有任何联系,更不用说被拒绝了。如果是这种情况,问题可能是请求函数,而不是Vision API服务器。
<!-- 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);