【问题标题】:cURL request getting wrong request version in Google App EnginecURL 请求在 Google App Engine 中获取错误的请求版本
【发布时间】:2016-01-12 20:01:40
【问题描述】:

我的代码中有一个 cURL 请求,在本地运行时可以正常工作:

$url = "http://ipinfo.io/{$_SERVER['REMOTE_ADDR']}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$locale = json_decode($response);

并按预期返回 JSON。但是,我们的生产系统在 Google App Engine 上,我在其中获得了浏览器的网站版本,而不是 JSON。

如果我改变,我可以让这个 cURL 请求工作

google_app_engine.enable_curl_lite = "1"

在我的项目根目录下php.ini

extension = "curl.so"

但 Google 的 documentation 坚持前者将用于生产。此外,使用后者会破坏 Monolog 的 SlackHandler 之类的东西。

有没有办法从这个 cURL 请求中获取 JSON,同时仍然使用 Google 的“cURL Lite”?

【问题讨论】:

  • 也许尝试设置一个空白的用户代理或将其设置为不太可能被视为浏览器的东西?当我从命令行运行您的代码时,我得到了预期的 JSON。当我明确地将用户代理设置为可识别为浏览器的东西时,我得到了 HTML。
  • @PatrickQ 谢谢!我在其他地方找到了帮助并在下面发布了答案。

标签: php json google-app-engine curl


【解决方案1】:

来自 ipinfo.io 文档:

“我们在服务器上做了一点魔术来确定我们应该发送 JSON 响应还是网页。我们通常会做对,但是如果您看到的是网页而不是 JSON(或者想要检查浏览器中的 JSON 输出)您可以通过将 /json 添加到 URL 的末尾来强制 JSON 响应”

在这种情况下,将/json 添加到 URL 的末尾对我有用,但我想要一个更通用的解决方案。由于谷歌的 cURL Lite 在后台使用他们的URL Fetch,ipinfo.io 的“魔法”在某种程度上变得混乱了。我发现通过指定 Accept 标头,不需要添加 /json。在 PHP 中:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));

感谢 NashDev Slack 的 #php 频道上的人们帮助我完成这个!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多