【问题标题】:PHP curl bad request 400 - mapquest geocodingPHP curl 错误请求 400 - mapquest 地理编码
【发布时间】:2016-08-17 11:22:24
【问题描述】:

我的网址是:

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 请求返​​回的内容基本相同。当我从本地机器上的终端运行 cURL 时,也会返回 400。

如果我将 URL 放在浏览器中,我不会失望,它会返回我正在寻找的数据,并带有 200 状态代码。

浏览器获取请求和 cURL 有什么不同?

【问题讨论】:

  • 尝试在chrome中添加curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));,打开开发工具>网络,找到请求并按curl复制,您可以看到它用于发出该请求的所有设置,以便您进行比较。跨度>
  • 您是否尝试过对 url 进行编码,即将空格转换为 %20?此外,要直接回答关于 curl 请求与浏览器请求的不同之处,是用户代理。你试过让 curl 欺骗你的浏览器用户代理吗?
  • 你们都是对的...非常感谢 curl 的副本。我这样做了,查看了 URL,唯一不同的是空格。我不相信它只是空间,所以我没有尝试蝙蝠的权利。嗯,它是。不过有趣的是,我尝试了 urlencode() 和 rawurlencode() 都没有结果。

标签: php curl mapquest


【解决方案1】:

就像@Matt the ninja 和@chiliNut 建议的那样,我需要看看这两个请求之间的区别。

唯一的区别是空格。我尝试运行urlencode() php 函数以及rawurlencode() php 函数,均未影响结果。

这是我现在使用的,而不是 url 编码:

$urlForGeocodeURLEncoded = str_replace(' ', '%20', $urlForGeocode);

【讨论】:

    【解决方案2】:

    您设置变量$urlForGeocode 的方式似乎有问题。您使用的是' 还是"

    应该是前者。

    第二个请求失败,因为 URL 字段中的 (空格)会产生格式错误的请求。

    【讨论】:

    • 关于 url,我将它设置为一个用 ' ' 包围的字符串。我不认为第二个失败是因为空间。该空间是运行命令所必需的(如果您指的是 shell 执行)。
    猜你喜欢
    • 2017-03-04
    • 2014-03-05
    • 1970-01-01
    • 2023-03-11
    • 2011-07-20
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多