为什么我的自定义API终结点不工作?

时间:2019-04-10 作者:TTT

我试图在插件php文件中以及functions.php.(最后,我希望它位于插件的php文件中,但我还不确定是否可能,这可能是另一个问题的主题。)

现在这是一个非常基本的方法,我只是想得到一些内容的回应。

在这两种情况下,我都得到了404响应。

add_action( \'rest_api_init\', function () {
  register_rest_route( plugin_dir_url(__DIR__).\'my-project/api/v1/form\', \'/action\', array(
    \'methods\' => \'GET, POST\',
    \'callback\' => \'api_method\',
  ) );
});

function api_method($data) {
    var_dump($data);
    return \'API method end.\';
}
我尝试访问URL(在brower或AJAX中)

2 个回复
最合适的回答,由SO网友:leymannx 整理而成

也许从GET. 你的路线看起来也很奇怪。请尝试:

register_rest_route(\'my-project/v1\', \'/action/\', [
  \'methods\'  => WP_REST_Server::READABLE,
  \'callback\' => \'api_method\',
]);
而您的回调没有返回有效响应。让您的回调看起来更像这样:

$data = [ \'foo\' => \'bar\' ];

$response = new WP_REST_Response($data, 200);

// Set headers.
$response->set_headers([ \'Cache-Control\' => \'must-revalidate, no-cache, no-store, private\' ]);

return $response;
最后,您必须合并wp-json, 命名空间my-project/v1 还有你的路线action 到URL,您现在可以检查得到的内容:

 https://my-domain.local/wp-json/my-project/v1/action

SO网友:Tom J Nowell

你的问题是:

register_rest_route( plugin_dir_url(__DIR__).\'my-project/api/v1/form\', \'/action\', array(
具体来说,这是可能的:

http://my-domain.local/wp-content/plugins/my-project/api/v1/form
这是极不寻常的,与文档、手册和教程中的内容背道而驰。

REST API端点位于REST API上,REST API位于rest_url(). 他们住在yoursite.com/wp-json. 端点不是完整的URL路径,也不是与主API断开连接的独立API。

相反,您需要根据名称空间和端点定义端点名称,并访问RESTAPI发现机制中描述的正确URL。

如果我们使用此选项:

register_rest_route( plugin_dir_url(__DIR__).\'my-project/api/v1/form\', \'/action\', array(
那么我们可以预期:

example.com/wp-json/wp-content/plugins/my-project/api/v1/form/action

该URL相当长,存在许多问题:

  • The first parameter is a namespace, not a URL/form 组件已放入第一个参数,而不是第二个参数。第一个参数是名称空间,第二个参数是路由/action/action, 它不能换成GETPOST
回调函数也存在问题:

function api_method($data) {
    var_dump($data);
端点需要返回其数据,它不能将其直接输出为var_dump 否则返回的数据是无效的JSON。

最后,methods参数不正确:

\'methods\' => \'GET, POST\',
methods 不采用逗号分隔的列表,也没有文档建议这样做。相反,请使用REST API提供的预定义值,例如WP_REST_Server::READABLEWP_REST_Server::ALLMETHODS, 这些都在手册和官方文件中提到register_rest_route.

更好的注册途径是:

    register_rest_route( \'my-project/form/v1\', \'/action\', array(
给我们:

example.com/wp-json/my-project/form/v1/action

注意我是如何删除插件URL和多余的/api 片段(很明显,它已经是一个API了)