外部站点调用WordPress Posts API返回空白页,状态码200却无数据
问题:WordPress REST API 拉取文章返回空白(状态码200)
我们需要从另一个WordPress站点拉取文章,找到/wp-json/wp/v2/posts接口后,在浏览器和Postman中都能正常获取数据,但外部站点发起curl请求时,页面显示空白,请求状态码为200却无数据返回。
最初以为是本地服务器未使用HTTPS导致,部署到安全开发服务器后问题依旧;随后尝试添加认证信息,仍未解决问题。
以下是两次尝试的curl代码:
第一次请求代码
$curl = curl_init(); curl_setopt_array($curl, array ( CURLOPT_URL => 'https://www.hidden.com/wp-json/wp/v2/posts', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array('title' => 'Sample Post','status' => 'publish'), )); $response = curl_exec($curl); curl_close($curl); echo $response;
第二次带认证的请求代码
$username='hiddenusr'; $password='hiddenpass'; $URL='https://www.hidden.com/wp-json/wp/v2/posts'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$URL); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); $result=curl_exec ($ch); echo $result; $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code curl_close ($ch);
请问哪里操作出错了?为何在Postman中正常但我的站点不行?
问题排查与解决
1. HTTP请求方法错误
获取文章的接口/wp-json/wp/v2/posts默认支持GET请求,但你第一次请求用了POST方法还带了CURLOPT_POSTFIELDS,这会让API认为你是要创建文章,而非获取文章,自然返回不符合预期的空白结果。
2. SSL证书验证问题
服务器可能没有配置可信的SSL根证书,curl默认会严格验证目标站点的SSL证书,验证失败时会静默返回空内容,但状态码仍可能返回200。测试环境可以临时关闭验证(生产环境建议配置正确的CA证书),添加以下两个参数:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
3. 缺少curl错误排查
你的代码没有检查curl执行过程中的错误,添加错误检查能直接定位问题:
if(curl_errno($ch)) { echo 'CURL错误:' . curl_error($ch); }
4. 认证冗余(或方式错误)
如果是拉取公开文章,WordPress REST API不需要认证,添加基础HTTP认证反而可能触发权限问题;如果是私有文章,应该使用WordPress 5.6+支持的应用密码,或者JWT认证插件,而非基础HTTP认证(默认REST API不支持)。
修正后的示例代码
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.hidden.com/wp-json/wp/v2/posts'); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 测试环境临时关闭SSL验证,生产环境请移除并配置可信证书 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch); // 排查curl错误 if(curl_errno($ch)) { echo 'CURL错误:' . curl_error($ch); } else { $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo '状态码:' . $status_code . '<br>'; echo $result; } curl_close($ch);
内容的提问来源于stack exchange,提问作者Dylano236
相关产品推荐
相关产品推荐

