Php 来自Google places API的Curl POST请求返回错误&引用;服务需要密钥;

Php 来自Google places API的Curl POST请求返回错误&引用;服务需要密钥;,php,curl,google-api,Php,Curl,Google Api,我遇到了一个curl请求的问题——在GooglePlacesAPI上发布了一个文本搜索 下面是代码,但是如果我手动构建URL,请求就可以了&返回正确的搜索数据。我的curl请求(POST)似乎出于某种原因没有发送POST数据 有人知道我做错了什么吗 <?php $options = array( 'url' => 'https://maps.googleapis.com/maps/api/place/textsearch/xml?', 'query' => '

我遇到了一个curl请求的问题——在GooglePlacesAPI上发布了一个文本搜索

下面是代码,但是如果我手动构建URL,请求就可以了&返回正确的搜索数据。我的curl请求(POST)似乎出于某种原因没有发送POST数据

有人知道我做错了什么吗

<?php

$options = array(
    'url' => 'https://maps.googleapis.com/maps/api/place/textsearch/xml?',
    'query' => 'my+query+terms',
    'location' => '43.836296,-79.0851207',
    'radius' =>'5000',
    'key' => '_my_api_key_'
    );

$api = array_shift($options);

$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($ch, CURLOPT_URL, $api);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $options);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$result = curl_exec($ch);
$request = curl_getinfo($ch);

curl_close($ch);

echo '<pre>'; print_r($request); echo '</pre>';
echo '<pre>'; print_r($result); echo '</pre>';

return;
修订的工作代码:

<?xml version="1.0" encoding="UTF-8"?>
<PlaceSearchResponse>
 <status>OK</status>
 <result>
  <name>Forfar</name>
  <type>locality</type>
  <type>political</type>
  <formatted_address>Forfar DD8, UK</formatted_address>
  <geometry>
   <location>
    <lat>56.6435580</lat>
    <lng>-2.8890620</lng>
   </location>
   <viewport>
    <southwest>
     <lat>56.6225256</lat>
     <lng>-2.9239470</lng>
    </southwest>
    <northeast>
     <lat>56.6601780</lat>
     <lng>-2.8580524</lng>
    </northeast>
   </viewport>
  </geometry>
  <icon>https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png</icon>
  <reference>CmRbAAAACjwLAMU8k-MwG-Dmf6KhKmBG5Ms7CHJ6TZyH4g2pZlotgC93vbvl8aAAa3Xfc2sE7GnFFbr48auYaykQItR2jfSRUkr04rG0-luAyb1hm97OtSf6yCDqMzvd3z8e0q14EhA6m7z1cLhYlNt_rXB3K3-xGhQQe0bxNrmWATf8wqWydqlsp16Lrg</reference>
  <id>7a7c726f4d8b907b1bcd39503c4348c6965916d9</id>
  <photo>
   <photo_reference>CmRaAAAABNJLUk7ET6Wa4JXEh9OSwj1s3dvIr25twTy_Yk7ey5n2LxGmVm_anlebTTbJ2e6ZTrtHMa4ij7vYLypy6XMhr6F9CFF0fx9XqQ_0ozgFno_VXuSWDmblc-q4-02nTaHmEhDAuJtLHpMk6RvkltH68iD2GhTCSqmyDYq3qY58O5qJoqJwlrCITg</photo_reference>
   <width>4912</width>
   <height>1920</height>
   <html_attribution><a href="https://maps.google.com/maps/contrib/109648577636572315039/photos">L Hill</a></html_attribution>
  </photo>
  <place_id>ChIJW5AkiE1ghkgRfVEeH582Uzg</place_id>
 </result>
</PlaceSearchResponse>


Array
(
    [url] => https://maps.googleapis.com/maps/api/place/textsearch/xml?query=Forfar&location=52,-2.5&radius=50&key=AIzaSyD3tAJwB463-PpaqVS7pcMqWkkqnki0Kgk
    [content_type] => application/xml; charset=UTF-8
    [http_code] => 200
    [header_size] => 394
    [request_size] => 171
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 0.39
    [namelookup_time] => 0
    [connect_time] => 0.047
    [pretransfer_time] => 0.203
    [size_upload] => 0
    [size_download] => 1410
    [speed_download] => 3615
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 0.39
    [redirect_time] => 0
    [certinfo] => Array()  
)
“\u查询\u字符串”,
'位置'=>'43.836296,-79.0851207',
“半径”=>“5000”,
'键'=>'\u我的api\u键'
);
$headers=数组(
“接受:应用程序/xml”,
'内容类型:应用程序/xml',
);
$api=数组移位($options)。http_build_query($options);
$ch=curl_init();
curl_setopt($ch,CURLOPT_VERBOSE,TRUE);//不需要
curl_setopt($ch,CURLINFO_HEADER_OUT,TRUE);
curl_setopt($ch,CURLOPT_URL,$api);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$result=curl\u exec($ch);
//$request=curl_getinfo($ch);//也不需要
卷曲关闭($ch);
回声$结果;
返回;

我不知道您现在是否已将其排序,但您可以尝试类似的方法。这将使用查询字符串作为url的一部分,而不是使用POST

$key='AIzaSyD3tAJwB463-PPAQVS7PCMQWKKQNKI0KK';
$query='Forfar';
$location='52,-2.5';
$cacert='c:/wwwroot/cacert.pem';
$format='xml';
$options=array(
'url'=>'https://maps.googleapis.com/maps/api/place/textsearch/“.$格式。”?”,
'query'=>$query,
“位置”=>$location,
“半径”=>“50”,
“key”=>$key
);
$url=urldecode(数组移位($options)。http构建查询($options));
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLINFO_HEADER_OUT,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_CAINFO,$cacert);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);
$data=curl\u exec($ch);
$info=curl\u getinfo($ch);
卷曲关闭($ch);
回显“”,打印($data,1),打印($info,1),“”;
这就产生了


好啊
福法尔
地点
政治的
英国福法尔DD8
56.6435580
-2.8890620
56.6225256
-2.9239470
56.6601780
-2.8580524
https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png
CMRBAAACJWLAMU8K-MwG-DMF6KHKMBG5MS7CHJ6ZYH4G2PZLOTG93VBVL8AAAA3XFC2SE7GNFFBR48AUYAYKQITR2JFSRUKR04RG0-LUAYB1HM97OTSF6YCDQMZVD3Z8E0Q14EHA6M7Z1HYLU rXB3K3-XGHQE0BXNRMWATF8WYDQLS16RG
7A7C726F4D8B907B1BCD3503C4348C6965916D9
CmRaAAAABNJLUk7ET6Wa4JXEh9OSwj1s3dvIr25twTy Yk7ey5n2LxGmVm和EBTTBJ2E6ZRTHMA4IJ7VYLYP6XMHR6F9CFF0FX9XQQ\u0OZGFNO\uVxUSWDMBLC-q4-02NTAHMEHDAUJTLHPMK6RVKLTH68ID2GHTCSQMYDQ3QY58O5QJOQWLRCITG
4912
1920
ChIJW5AkiE1ghkgRfVEeH582Uzg
排列
(
[网址]=>https://maps.googleapis.com/maps/api/place/textsearch/xml?query=Forfar&location=52,-2.5&半径=50&键=AIzaSyD3tAJwB463-PPAQVS7PCMQWKKQNKI0KK
[content\u type]=>application/xml;字符集=UTF-8
[http_代码]=>200
[标题大小]=>394
[请求大小]=>171
[filetime]=>-1
[ssl\u验证\u结果]=>20
[重定向\u计数]=>0
[总时间]=>0.39
[namelookup\u time]=>0
[连接时间]=>0.047
[预传输时间]=>0.203
[上传大小]=>0
[下载大小]=>1410
[速度下载]=>3615
[速度上传]=>0
[下载内容长度]=>-1
[上传内容长度]=>0
[开始传输时间]=>0.39
[重定向时间]=>0
[certinfo]=>数组()
)

不要使用POST请求,而应尝试使用urlfacepalm的querystring部分中的参数作为GET请求!太尴尬了!是的-get请求是到这里的方法。我认为谷歌只是忽略了任何发布的内容。。。。
<?php

$options = array(
    'url' => 'https://maps.googleapis.com/maps/api/place/textsearch/xml?',
    'query' => '_the_query_string_',
    'location' => '43.836296,-79.0851207',
    'radius' =>'5000',
    'key' => '_my_api_key_'
    );

$headers = array(
    'Accept: application/xml',
    'Content-Type: application/xml',
    );

$api = array_shift($options) . http_build_query($options);

$ch = curl_init();

curl_setopt($ch, CURLOPT_VERBOSE, TRUE); // not really needed

curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);

curl_setopt($ch, CURLOPT_URL, $api);

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$result = curl_exec($ch);

// $request = curl_getinfo($ch); // also not needed

curl_close($ch);

echo $result;

return;
$key='AIzaSyD3tAJwB463-PpaqVS7pcMqWkkqnki0Kgk';
$query='Forfar';
$location='52,-2.5';
$cacert='c:/wwwroot/cacert.pem';
$format='xml';


$options = array(
    'url'       =>  'https://maps.googleapis.com/maps/api/place/textsearch/'.$format.'?',
    'query'     =>  $query,
    'location'  =>  $location,
    'radius'    =>  '50',
    'key'       =>  $key
);


$url = urldecode( array_shift( $options ) . http_build_query( $options ) );


$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLINFO_HEADER_OUT, false );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_CAINFO, $cacert );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );

$data = curl_exec( $ch );
$info = curl_getinfo( $ch );

curl_close( $ch );

echo '<textarea cols=100 rows=20>',print_r($data,1),print_r($info,1),'</textarea>';
<?xml version="1.0" encoding="UTF-8"?>
<PlaceSearchResponse>
 <status>OK</status>
 <result>
  <name>Forfar</name>
  <type>locality</type>
  <type>political</type>
  <formatted_address>Forfar DD8, UK</formatted_address>
  <geometry>
   <location>
    <lat>56.6435580</lat>
    <lng>-2.8890620</lng>
   </location>
   <viewport>
    <southwest>
     <lat>56.6225256</lat>
     <lng>-2.9239470</lng>
    </southwest>
    <northeast>
     <lat>56.6601780</lat>
     <lng>-2.8580524</lng>
    </northeast>
   </viewport>
  </geometry>
  <icon>https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png</icon>
  <reference>CmRbAAAACjwLAMU8k-MwG-Dmf6KhKmBG5Ms7CHJ6TZyH4g2pZlotgC93vbvl8aAAa3Xfc2sE7GnFFbr48auYaykQItR2jfSRUkr04rG0-luAyb1hm97OtSf6yCDqMzvd3z8e0q14EhA6m7z1cLhYlNt_rXB3K3-xGhQQe0bxNrmWATf8wqWydqlsp16Lrg</reference>
  <id>7a7c726f4d8b907b1bcd39503c4348c6965916d9</id>
  <photo>
   <photo_reference>CmRaAAAABNJLUk7ET6Wa4JXEh9OSwj1s3dvIr25twTy_Yk7ey5n2LxGmVm_anlebTTbJ2e6ZTrtHMa4ij7vYLypy6XMhr6F9CFF0fx9XqQ_0ozgFno_VXuSWDmblc-q4-02nTaHmEhDAuJtLHpMk6RvkltH68iD2GhTCSqmyDYq3qY58O5qJoqJwlrCITg</photo_reference>
   <width>4912</width>
   <height>1920</height>
   <html_attribution><a href="https://maps.google.com/maps/contrib/109648577636572315039/photos">L Hill</a></html_attribution>
  </photo>
  <place_id>ChIJW5AkiE1ghkgRfVEeH582Uzg</place_id>
 </result>
</PlaceSearchResponse>


Array
(
    [url] => https://maps.googleapis.com/maps/api/place/textsearch/xml?query=Forfar&location=52,-2.5&radius=50&key=AIzaSyD3tAJwB463-PpaqVS7pcMqWkkqnki0Kgk
    [content_type] => application/xml; charset=UTF-8
    [http_code] => 200
    [header_size] => 394
    [request_size] => 171
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 0.39
    [namelookup_time] => 0
    [connect_time] => 0.047
    [pretransfer_time] => 0.203
    [size_upload] => 0
    [size_download] => 1410
    [speed_download] => 3615
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 0.39
    [redirect_time] => 0
    [certinfo] => Array()  
)