【问题标题】:PHP CURL GET request returns 500 where bash curl succeedsPHP CURL GET 请求在 bash curl 成功的地方返回 500
【发布时间】:2013-05-23 15:25:01
【问题描述】:

我正在尝试使用 PHP 的 CURL 向服务器发出 GET 请求,但在这样做时遇到了一些困难。当我通过 PHP 发出请求时,我从外部服务器返回 500 错误。但是,如果我使用 bash curl 发出请求,或者在浏览器中访问 URL,它会成功。

我已经将 PHP 精简到了最基本的部分:

$url = 'http://example.com:8080/path/to/service?cmd=my_command&arg=example2.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
print_r(curl_getinfo($ch));
curl_close($ch);

如上所述,这会从 example.com 返回 500 错误。但是,如果我执行以下操作:

[me@host ~] curl "http://example.com:8080/path/to/service?cmd=my_command&arg=example2.com"

我返回了预期的 XML 文档。

什么给了?它必须与 URL 的编码有关,就好像我将 $url var 剥离到仅 http://example.com:8080 PHP CURL 请求现在以 200 响应。我尝试将 & 替换为 %26 -这不起作用(我也不希望它起作用,因为& 在 URL 中有效)。我已经尝试按照php curl sending vars using GET wierd results 的答案的建议进行操作,但这也无济于事。

我在这里缺少什么?我敢肯定这是非常简单的事情,但它让我无法理解。

谢谢!

编辑:我刚刚尝试在 Python 中执行此操作 - 只是想看看发生了什么 - 它在那里工作正常:

import urllib2
r = urllib2.urlopen(theURL)
r.read()

【问题讨论】:

  • 你能给我们curl_getinfo的输出吗?
  • 那里没有什么特别有趣的; http_code 是 500,redirect_count 是 0,content_type 是 text/html;charset=iso-8859-1,url 是我传入的字符串。其余的数据几乎只是传输速度信息。
  • 您将 RETURNTRANSFER 设置为 1,但未捕获 curl_exec 的返回值。要么关闭 RETURNTRANSFER,要么将 curl_exec 的返回值分配给一个变量和 print_r
  • 不影响HTTP请求的结果;它只有在请求完成后才会出现。在这种情况下,将存储在那里(或将进入屏幕)的内容是服务器的 500 页面的 HTML - 这没有多大帮助。

标签: php curl get


【解决方案1】:

事实证明,我正在访问的 API 需要一个用户代理来处理所有请求,但没有提供任何信息来表明这一点。

这很常见吗?除了http://developer.github.com/v3/#user-agent-required

,我找不到任何其他人这样做的例子

我能够通过添加让事情正常工作

curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent: Some-Agent/1.0");

【讨论】:

  • 我刚刚遇到另一个需要特定 User-Agent 标头的 API。即使它是 REST Web 服务 API,它也不适用于非浏览器用户代理。我花了太长时间才弄明白。
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多