验证和清理REST API中的JSON响应的正确方法是什么?

时间:2020-12-06 作者:b3hr4d

我已经阅读了WordPress page了解此问题,但未找到解决方案。

以下是我的详细信息:

注册rest路由:

register_rest_route(
    \'/jwt-auth/v1\',
    \'/user\',
    array(
        \'methods\'             => array( \'GET\', \'POST\', \'PUT\' ),
        \'callback\'            => array( $this, \'user_get_information\' ),
        \'permission_callback\' => function() {
            return is_user_logged_in();
        },
    ),
);
用户功能:

public function user_get_information( $request ) {
    $user_id = get_current_user_id();
    $data    = array();
    if ( filter_input( INPUT_SERVER, \'REQUEST_METHOD\' ) === \'POST\' ) {
        $params = array(
            \'nickname\',
            \'first_name\',
            \'last_name\',
            \'mobile\',
            \'favorites\',
            \'playtime\',
        );

        $allreq = $request->get_params();

        foreach ( $allreq as $req => $val ) {
            if ( ! empty( $val ) && in_array( $req, $params, true ) ) {
                if ( \'favorites\' === $req ) {
                    // do somthing
                } elseif ( \'playtime\' === $req ) { 

// i want this json data validate and sanitize then add to database

                    $meta      = get_user_meta( $user_id, \'playtime\', true );
                    $schema    = $this->user_playtime_meta_schema();
                    if ( rest_validate_value_from_schema( $val, $schema ) ) {
                        $sanitized = rest_sanitize_value_from_schema( $val, $schema );
                    }
                    if ( ! is_array( $meta ) ) {
                        $meta = array();
                    }
                    $meta[] = $sanitized;
                    // $meta = array();
                } else {
                    $meta = $val;
                }
                $user_meta = update_user_meta( $user_id, \'playtime\', $meta );
            }
        }
    }
    if ( is_wp_error( $user_meta ) ) {
        $error_string = $user_meta->get_error_message();
        return $error_string;
    } else {
        $info   = get_user_by( \'ID\', $user_id );
        $meta   = get_user_meta( $user_id );
        $img_id = $meta[\'image_select\'][0];
        if ( $img_id ) {
            $img_url = wp_get_attachment_url( $img_id );
        }
        $data[\'id\']           = $info->ID;
        $data[\'login\']        = $info->user_login;
        $data[\'email\']        = $info->user_email;
        $data[\'display_name\'] = $info->display_name;
        $data[\'image\']        = $img_url;
        $data[\'nickname\']     = $meta[\'nickname\'][0];
        $data[\'first_name\']   = $meta[\'first_name\'][0];
        $data[\'last_name\']    = $meta[\'last_name\'][0];
        $data[\'mobile\']       = $meta[\'mobile\'][0];
        $data[\'favorites\']    = get_user_meta( $user_id, \'favorites\', true );
        $data[\'playtime\']     = get_user_meta( $user_id, \'playtime\', true );
        return $data;
    }
}
架构:

public function user_playtime_meta_schema() {
    if ( $this->playtime_schema ) {
        return $this->playtime_schema;
    }
    $this->playtime_schema = array(
        \'type\' => array(
            \'type\'       => \'object\',
            \'properties\' => array(
                \'song\'     => array(
                    \'type\'       => \'object\',
                    \'properties\' => array(
                        \'name\'  => array(
                            \'type\' => \'string\',
                        ),
                        \'id\'    => array(
                            \'type\' => \'number\',
                        ),
                        \'notes\' => array(
                            \'type\' => \'number\',
                        ),
                    ),
                ),
                \'time\'     => array(
                    \'type\' => \'string\',
                ),
                \'date\'     => array(
                    \'type\' => \'string\',
                ),
                \'score\'    => array(
                    \'type\' => \'string\',
                ),
                \'progress\' => array(
                    \'type\' => \'string\',
                ),
            ),
        ),
    );
    return $this->playtime_schema;
}
尝试发送如下数据:

{"playtime":{"song": {
        "name": "Training New",
        "id": 758,
        "notes": 65
    },
    "time": "10:27:19 PM",
    "score": "[[76,\\"perfect\\"],[74,\\"perfect\\"],[77,\\"perfect\\"],[76,\\"perfect\\"],[74,\\"late\\"],[72,\\"late\\"],[74,\\"perfect\\"],[76,\\"perfect\\"],[76,\\"perfect\\"],[76,\\"perfect\\"],[74,\\"perfect\\"],[77,\\"perfect\\"],[76,\\"late\\"],[74,\\"late\\"],[72,\\"perfect\\"],[74,\\"perfect\\"],[76,\\"perfect\\"],[76,\\"perfect\\"],[74,\\"perfect\\"],[72,\\"perfect\\"],[71,\\"perfect\\"],[67,\\"perfect\\"],[74,\\"perfect\\"],[72,\\"perfect\\"],[74,\\"perfect\\"],[71,\\"perfect\\"],[72,\\"perfect\\"],[74,\\"late\\"],[71,\\"perfect\\"],[72,\\"perfect\\"],[71,\\"late\\"],[67,\\"perfect\\"]]",
    "date": "8/17/2020",
    "progress": "4%"}
}
一切都正常,但如果我发送一些像这样的错误信息:

    {"playtime":{"wrong": {
        "number": "1",
        "notes": 525
    },
    "time": "10:27:19 PM",
    "progress": "4%"}
}
也可以,错误的数据会保存在数据库中!

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

感谢Stackoverflow的@GTsvetanov。com。

我的代码缺少的部分是$request->get_json_params(); 要获取json请求,请使用rest_validate_value_from_schema() 然后使用rest_sanitize_value_from_schema() 用于将正确的数据保存到数据库。

    $schema = $this->user_playtime_meta_schema();
    $val    = $request->get_json_params();//<-- my mistake
    $result = rest_validate_value_from_schema( $values, $schema );
    if ( ! is_wp_error( rest_validate_value_from_schema( $val, $schema ) ) ) {
        $sanitized = rest_sanitize_value_from_schema( $val, $schema );
    } else {
        return $result;
    }
    $user_meta = update_user_meta( $user_id, \'playtime\', $sanitized );

相关推荐

通过REST-API保存自定义POST类型POST_META失败

我尝试用wp json保存我的自定义帖子类型元数据,但在我的情况下不起作用我使用创建自定义帖子类型jjgrainger\'s 分类如下$arguments = array( \'public\' => true, \'show_in_rest\' => true, ); $survey = new PostType(\'survey\', $arguments); $surve