我正在使用WordPress REST API获取页面内容。我使用的URL是:
https://sitename.org/wp-json/wp/v2/pages/4322
当我在浏览器中打开那个URL时,我得到的是有效的响应。
但当我尝试通过cURL使用相同的URL时,我得到:
无法连接到主机
我使用的代码是:
$page_id = 4322;
$wp_api_url = "https://sitename.org/wp-json/wp/v2/pages/".$page_id;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $wp_api_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
if (FALSE === $response)
{
echo curl_error($ch); // <---- failing here
}
else
{
echo \'<pre>\';
print_r(json_decode($response, true));
echo \'</pre>\';
}
curl_close($ch);
这就引出了一个问题:
那么为什么它可以通过浏览器工作呢在通过cURL调用API时,我必须使用某种身份验证吗
SO网友:Asuka165
看来我提这个问题已经很晚了,但我还是把我的经验发到这里,希望它能帮助任何有类似经验的人,因为很难用谷歌搜索出这种罕见情况的答案。
我有一个非常相似的问题。我通过浏览器和AJAX进行了测试,它们都可以,但当我用PHP cURL发送请求时,连接超时。
但我的情况有点不同。我有2台服务器,服务器A是API的主机,服务器B是请求服务器。
服务器B是我的生产服务器,人们一直在使用它,没有任何问题,直到有一天,我从服务器A收到连接超时错误。
然后,我发现,服务器A防火墙将服务器B列入黑名单,因为服务器B试图执行SQL注入。(这就是为什么浏览器和AJAX没有被服务器A阻止的原因,因为您是从PC而不是通过服务器发送请求)So, I solved my problem by whitelisting Server B in Server A.
但故事还没有结束。服务器A黑名单服务器B的原因是因为我的一个用户通过API输入了一大块段落,其中包含单词;select
“编辑”;(是的selected, 不select
单独)和“;from"E;,出于某种原因,服务器A将其标记为SQL注入。听起来很奇怪,但我想服务器的ModSecurity太敏感了。
SO网友:Drupalizeme
您可以使用以下代码,并且应该可以工作,如果不能,我们应该查看服务器配置以了解原因。此外,我们还可以检查curl\\u错误以获取提示。
$curl = curl_init();
$page_id = 4322;
$wp_api_url = "https://sitename.org/wp-json/wp/v2/pages/".$page_id;
curl_setopt_array($curl, array(
CURLOPT_URL => $wp_api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);