从我迄今为止的尝试和测试来看,getter和setter在函数内部不起作用permission_callback
.
另一种方法是从回调本身抛出自定义401。
是否可以使用permission_callback
, 检查参数,并return false
而不是在callback
对于相同的功能return 401
?
Update 1:
permission_callback => function($request) { $request->get_params(); }
不返回任何内容。我需要检查主体参数以允许或拒绝请求。
鉴于callback => function($request) { $request->get_params(); }
正确地返回参数。
Update 2:
在构造函数中,
$this->init_api(); add_action(\'wp_enqueue_scripts\', array($this, \'api_wholesale_params\'));
在init\\u api中,
$this->set_namespace();
$this->set_route();
$this->api_params = array(
\'methods\' => WP_REST_Server::EDITABLE,
// \'permission_callback\' => array($this, "verify_api_call"),
\'callback\' => array($this, "callback")
);
// Set up the API
add_action(\'rest_api_init\', function() {
register_rest_route($this->namespace, $this->route, $this->api_params);
});
/**
* Set property: namespace
*
* Source: https://developer.wordpress.org/reference/functions/get_rest_url/
*/
function set_namespace() {
return $this->namespace = "wholesale/v1/";
}
/**
* Set property: route
*/
function set_route() {
return $this->route = "authorise/";
}
/**
* Localising the API parameters for use in JS
*/
function api_wholesale_params() {
wp_register_script(\'api_wholesale\', null);
wp_enqueue_script(\'api_wholesale\');
wp_localize_script(\'api_wholesale\', \'apiWholesale\', array(
\'namespace\' => $this->namespace,
\'route\' => $this->route,
"url" => get_rest_url(null, $this->namespace.$this->route),
"app_id" => $this->manifest_data[\'app_id\'],
"ver" => $this->manifest_data[\'ver\'],
));
}
/**
* Verification of the API call origin
*/
function verify_api_call(WP_REST_Request $req) {
// $req->get_params(); // returns nothing
if (array_key_exists(\'body\', $this->params) && array_key_exists(\'xsrf\', $this->params[\'body\'])) {
// Validate the XSRF token, returns true or false
$valid_xsrf = $this->verify_xsrf();
// Returning false would trigger a 401
return $valid_xsrf ? true : false;
}
}
// API callback
function callback(WP_REST_Request $req) {
// Unable to do this in permission_callback
$this->params = $req->get_params();
// Want to do it part using permission_callback
if ($this->verify_api_call()) {
return rest_ensure_response($this->res);
}
}
如你所见,我已经发表了评论
permission_callback
因为
$request->get_params()
不返回中的任何内容
verify_api_call
. 不过,我也可以这么说
$request-get_params()
从…起
callback
.
最合适的回答,由SO网友:Jacob Peattie 整理而成
我创建了一个简化的测试用例,它表明您想要做的事情是可以实现的:
add_action(
\'rest_api_init\',
function() {
register_rest_route(
\'wpse/343039\',
\'route\',
[
\'methods\' => [ \'POST\' ],
\'permission_callback\' => function( WP_REST_Request $request ) {
if ( \'1\' == $request->get_param( \'param\' ) ) {
return true;
} else {
return false;
}
},
\'callback\' => function( WP_REST_Request $request ) {
return rest_ensure_response( \'1\' );
},
]
);
}
);
使用此rest路由,如果我将POST请求发送到:
https://example.com/wp-json/wpse/343039/route
我将收到
401
除非我通过,否则回复
param
价值为
1
在请求正文中:
{
"param": 1
}
它也可以作为表单数据传递。如果我传递了那个参数,那么我看到
1
在回应中,正如所料。
返回401
从REST端点返回false
从permission_callback
函数,并且正如我所演示的,只要您接受它作为参数,就可以完全访问回调中的请求。