在创建时验证REST-API调用

时间:2021-06-03 作者:Zeth

WordPress站点A有一个API,另一个系统/应用程序(B)正在使用该API。B正在努力处理/控制/清理发送到API的帖子,并且经常导致创建重复的帖子。B最终真的很难解决这个问题,所以我想知道是否可以为我的端点添加一个验证方法。

问题是它需要在创建端点上进行验证。

这是我想象的更新端点(未测试)上的外观:

我正在调用端点:https://example.org/wp-json/wp/v2/foobar/100007?title=Test Title&meta[custom_var]=10

add_action( \'rest_api_init\', function(){
  register_rest_route( \'wp/v2\', \'/foobar/(?P<id>\\d+)\', [
    \'methods\'  => \'POST\',
    \'args\'     => [
      \'custom_var\' => [
        \'validate_callback\' => function( $param, $request, $key ){
          if( $param > 5 ){
            return true
          }
          return false;
        },
      ],
    ],
  ] );
} );
但我在里面找不到任何东西the rest documentation 关于验证创建端点。

我想象它是这样的:

add_action( \'rest_api_init\', function(){
  register_rest_route( \'wp/v2\', \'/foobar/\', [
    \'methods\'  => \'POST\',
    \'validate_method\' => function( ... ),
    ...
    ...
    ...
  ] );
} );
。。。但这行不通。

我也考虑过回拨:

add_action( \'rest_api_init\', function(){
  register_rest_route( \'wp/v2\', \'/foobar/\', [
    \'methods\'  => \'POST\',
    \'callback\' => function( ... ),
    ...
    ...
    ...
  ] );
} );
但是,在创建帖子(我假设)之后,回调会触发。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

正如我在评论中所说,由于这是一个自定义端点,您可以通过主回调取消帖子创建,例如:

\'callback\' => function () {
    if ( some condition ) {
        // create the post
    } else {
        // return existing post or something else
    }
}
下面是一个示例,其中POST端点创建一个已发布的POST(属于post 类型),但仅当没有与名为title:

注意:注册自定义REST路由时,请使用自己的命名空间(例如。my-namespace/v1) 而不是wp/v2.

add_action( \'rest_api_init\', function() {
    register_rest_route( \'my-namespace/v1\', \'/foobar\', array(
        \'methods\'             => \'POST\',
        \'callback\'            => function ( $request ) {
            $posts = get_posts( array(
                \'post_type\' => \'post\',
                \'title\'     => $request[\'title\'],
                \'fields\'    => \'ids\',
            ) );

            if ( ! empty( $posts ) ) {
                return new WP_Error(
                    \'rest_post_exists\',
                    \'There is already a post with the same title.\',
                    array( \'status\' => 400 )
                );
            }

            return wp_insert_post( array(
                \'post_type\'   => \'post\',
                \'post_title\'  => $request[\'title\'],
                \'post_status\' => \'publish\',
            ) );
        },
        \'permission_callback\' => function ( $request ) {
            return current_user_can( \'publish_posts\' );
        },
        \'args\'                => array(
            \'title\' => array(
                \'type\'              => \'string\',
                \'required\'          => true,
                \'validate_callback\' => function ( $param, $request ) {
                    if ( ! preg_match( \'/[a-z0-9]+/\', $param ) ) {
                        return new WP_Error(
                            \'rest_invalid_title\',
                            \'Please enter a valid title for the post.\',
                            array( \'status\' => 400 )
                        );
                    }

                    return true;
                }
            ),
        ),
    ) );
} );
但是,请注意,如果foobar 实际上是一个自定义帖子类型,那么在注册帖子类型时(请参见register_post_type()), 你可以设置show_in_resttrue 然后设置rest_controller_class 自定义REST控制器类的名称,如here.

相关推荐

Settings API not saving

这段代码我已经读了一百遍了,我就是看不出有什么问题。其作用:✓ 显示选项页,设置部分,设置字段✓ 最后完成卫生功能最后一个函数只需检查我是否正确插入了值,但它会不断输出:数组([jazyk]=>;)这是我第一次使用设置API。谢谢你的帮助。add_action( \'admin_menu\', \'experimental_plugin_page\' ); // tick function experimental_plugin_page() {