PHP curl 错误请求 400 - mapquest 地理编码
PHP curl bad request 400 - mapquest geocoding
我的 url 是:
http://www.mapquestapi.com/geocoding/v1/batch?key=dNBvDLtTx85L3akdg8vBoHQXrWpDJSEI&location=HEBRON,KY,US&location=CINCINNATI,KY,US&location=CINCINNATI,KY,US&location=BEDFORD PARK,IL,US&location=BEDFORD PARK,IL,US&location=HODGKINS,IL,US&location=HODGKINS,IL,US&location=HODGKINS,IL,US&location=BALDWIN PARK,CA,US&location=BALDWIN PARK,CA,US&location=BALDWIN PARK,CA,US&location=,,US
它很长,但应该符合 https://www.mapquestapi.com/geocoding/
当我 运行 以下 php 代码时,谜底就揭开了:
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_URL, $urlForGeocode);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
$return = curl_exec ($ch);
curl_close ($ch);
echo( $return);
$output = shell_exec('curl ' . $urlForGeocode);
echo( $output);
变量$urlEncode
保存上面url的值。第一个输出是:
<html><body><b>Http/1.1 Bad Request</b></body> </html>
第二个请求的输出是:
{
"info": {
"statuscode": 400,
"copyright": {
"text": "\u00A9 2016 MapQuest, Inc.",
"imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
"imageAltText": "\u00A9 2016 MapQuest, Inc."
},
"messages": ["no 'json' parameter found"]
},
"options": {
"maxResults": -1,
"thumbMaps": true,
"ignoreLatLngInput": false
},
"results": [{
"providedLocation": {},
"locations": []
}]
}
这两个不同的 cURL 请求 return 基本上是同一件事。当我从本地机器上的终端 运行 cURL 时,也会 return 编辑 400。
如果我在浏览器中输入 URL,我并不感到失望,它 return 是我正在寻找的带有 200 状态代码的数据。
浏览器 get 请求和 cURL 有什么不同?
您设置变量 $urlForGeocode
的方式似乎有问题。您使用的是 '
还是 "
?
应该是前者
第二个请求失败,因为 URL 字段中的
(space) 生成格式错误的请求。
正如@Matt the ninja 和@chiliNut 所建议的那样,我需要查看这两个请求之间的区别。
唯一的区别是空格。我尝试了 运行 urlencode()
php 函数以及 rawurlencode()
php 函数,都没有影响结果。
这是我现在使用的而不是url编码:
$urlForGeocodeURLEncoded = str_replace(' ', '%20', $urlForGeocode);
我的 url 是:
http://www.mapquestapi.com/geocoding/v1/batch?key=dNBvDLtTx85L3akdg8vBoHQXrWpDJSEI&location=HEBRON,KY,US&location=CINCINNATI,KY,US&location=CINCINNATI,KY,US&location=BEDFORD PARK,IL,US&location=BEDFORD PARK,IL,US&location=HODGKINS,IL,US&location=HODGKINS,IL,US&location=HODGKINS,IL,US&location=BALDWIN PARK,CA,US&location=BALDWIN PARK,CA,US&location=BALDWIN PARK,CA,US&location=,,US
它很长,但应该符合 https://www.mapquestapi.com/geocoding/
当我 运行 以下 php 代码时,谜底就揭开了:
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_URL, $urlForGeocode);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE);
$return = curl_exec ($ch);
curl_close ($ch);
echo( $return);
$output = shell_exec('curl ' . $urlForGeocode);
echo( $output);
变量$urlEncode
保存上面url的值。第一个输出是:
<html><body><b>Http/1.1 Bad Request</b></body> </html>
第二个请求的输出是:
{
"info": {
"statuscode": 400,
"copyright": {
"text": "\u00A9 2016 MapQuest, Inc.",
"imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
"imageAltText": "\u00A9 2016 MapQuest, Inc."
},
"messages": ["no 'json' parameter found"]
},
"options": {
"maxResults": -1,
"thumbMaps": true,
"ignoreLatLngInput": false
},
"results": [{
"providedLocation": {},
"locations": []
}]
}
这两个不同的 cURL 请求 return 基本上是同一件事。当我从本地机器上的终端 运行 cURL 时,也会 return 编辑 400。
如果我在浏览器中输入 URL,我并不感到失望,它 return 是我正在寻找的带有 200 状态代码的数据。
浏览器 get 请求和 cURL 有什么不同?
您设置变量 $urlForGeocode
的方式似乎有问题。您使用的是 '
还是 "
?
应该是前者
第二个请求失败,因为 URL 字段中的 (space) 生成格式错误的请求。
正如@Matt the ninja 和@chiliNut 所建议的那样,我需要查看这两个请求之间的区别。
唯一的区别是空格。我尝试了 运行 urlencode()
php 函数以及 rawurlencode()
php 函数,都没有影响结果。
这是我现在使用的而不是url编码:
$urlForGeocodeURLEncoded = str_replace(' ', '%20', $urlForGeocode);