这是我尝试从中获取内容的网址:
$url = 'http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json';
所以我尝试file_get_contents()
并且那个工作正常。然后我尝试了这个始终有效的功能,但不是在这种情况下。
class SimpleCurl
{
public static function get($url, $params=array())
{
$url = $url . '?' . http_build_query($params, '', '&');
$ch = curl_init();
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false
];
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}
然后我尝试使用以下命令终端:
curl -X GET "http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json"
这很有效。它返回了正确的JSON对象,没有任何问题。 任何人都可以让我知道你如何调试CURL并找出这里的问题是什么?
经过进一步测试和调试后,我发现了以下内容。由于我的项目需要JSON对象,因此我传递了获取的CURL $content
trough $json_data = json_decode($content);
并且它什么也没有返回。空白!
但是,如果我在echo
之前尝试print_r
或json_decode()
,我可能会获得一些RAW信息/文本,而不是JSON对象。什么......
答案 0 :(得分:3)
您没有将$params
传递给get
函数,$url
最终会像http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json一样?请注意附加的?
您可以将get
函数更改为仅在$params
不为空时连接查询字符串,如下所示:
...
if (!empty($params)){
$url = $url . '?' . http_build_query($params, '', '&');
}
答案 1 :(得分:1)
您应该使用CURLOPT_VERBOSE
输出调试信息:
CURLOPT_VERBOSE - 输出详细信息时为TRUE。将输出写入STDERR,或使用CURLOPT_STDERR指定的文件。
虽然如果您在浏览器中运行脚本,但您不会看到详细日志,因为默认情况下它会将所有信息输出到stderr
(通常可以在{{1}中看到该输出})。
因此,要查看记录的信息,您应该查看error.log
,在终端中运行脚本,或者为cURL提供另一个文件处理程序以输出日志。在最简单的情况下,您可以将输出重定向到error.log
,如下所示:
stdout
在这种情况下,您会在浏览器中看到您的日志。或者,您也可以向$options = [
CURLOPT_VERBOSE => true,
CURLOPT_STDERR => fopen('php://stdout', 'w'),
...
];
提供任何其他文件名,以便将日志输出到文件中。