cURL请求在Google App Engine中获取错误的请求版本

时间:2016-01-12 20:01:41

标签: php json google-app-engine curl

我的代码中有一个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。我们的生产系统在谷歌应用引擎上,然而,我获得了浏览器的网站版本而不是JSON。

如果我改变

,我可以让这个cURL请求起作用
google_app_engine.enable_curl_lite = "1"

在项目根目录的php.ini

extension = "curl.so"

但谷歌的documentation坚持要求前者用于制作。另外,使用后者会破坏像Monolog的SlackHandler。

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

1 个答案:

答案 0 :(得分:0)

来自ipinfo.io文档:

  

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

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

/json

感谢NashDev Slack的#php频道上的人们帮助我解决这个问题!