WordPress自定义REST API浏览器可访问curl请求报404找不到路由
问题原因
你注册REST路由时指定的允许请求方法为WP_REST_Server::READABLE,该常量对应仅允许GET类型的请求,浏览器直接访问路由默认发送的是GET请求所以运行正常;而你发起curl请求时指定了CURLOPT_CUSTOMREQUEST => "POST"用POST方式请求,请求方法与路由允许的方法不匹配,因此WordPress返回404找不到对应路由的错误。
修复方案
你可以根据自己的业务需求选择以下任意一种方案修改:
方案1:修改路由支持POST请求
如果你确实需要通过POST方式传递参数,将路由注册代码中的methods参数修改为支持POST的取值即可:
- 仅支持POST:改为
WP_REST_Server::CREATABLE(该常量对应POST请求) - 同时支持GET和POST:改为
[ WP_REST_Server::READABLE, WP_REST_Server::CREATABLE ]或者直接写[ 'GET', 'POST' ] - 支持所有请求类型:改为
WP_REST_Server::ALLMETHODS
修改后的路由注册参考代码:
function init_my_func(){ $namespace = 'test/v1'; $route = 'fire'; register_rest_route($namespace, $route, array( 'methods' => WP_REST_Server::CREATABLE, // 这里修改为对应POST的常量,也可按需求写多个方法 'callback' => 'my_func', 'args' => array(), 'permission_callback' => function () { return true; } )); }
方案2:修改curl请求为GET方式
如果你不需要用POST传递参数,将curl的请求方法改为GET即可,参数可直接拼接在URL后:
$params = array( 'arg1' => 'value1' ); $url = "http://example.com/wp-json/test/v1/fire?" . http_build_query($params); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET", // 修改为GET请求 CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => array( "cache-control: no-cache" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl);
内容的提问来源于stack exchange,提问作者aidinMC
相关产品推荐
相关产品推荐

