当前位置:首页>WordPress建站>WordPress开发>WordPress 5.6新增REST API批处理框架

WordPress 5.6新增REST API批处理框架

WordPress 5.6引入了一个框架,该框架可在对服务器的一个请求中进行一系列REST API调用。简单地说,当需要进行大量的写操作时,这对性能优化很有帮助。它还可以选择提供基本的并发控制。

注册

为了在批处理请求中使用,路由必须在注册过程中首先声明对功能的支持。例如下方代码的第5行

  1. register_rest_route( 'my-ns/v1', 'my-route', array(
  2. 'methods' => WP_REST_Server::CREATABLE,
  3. 'callback' => 'my_callback',
  4. 'permission_callback' => 'my_permission_callback',
  5. 'allow_batch' => array( 'v1' => true ),
  6. ) );

如果REST API路由是使用最佳实践实现的,则声明支持应足以使该路由可通过批处理端点写入。具体来说,这些是要注意的事情:

  1. 路由必须使用该WP_REST_Request对象来获取所有请求数据。换句话说,它不应该访问$_GET$_POST$_SERVER变量得到参数或头。
  2. 路线必须返回数据。这可以是一个WP_REST_Response对象,一个WP_Error对象或任何类型的JSON可序列化数据。这意味着路由一定不能直接回显响应和die()。例如,使用wp_send_json()wp_die()
  3. 路线必须是可重入的。准备好同一批路由被多次调用。

发出请求

要发送批处理,发送一个POST请求到 https://yoursite.test/wp-json/batch/v1使用所需的请求数组。例如,最简单的批处理请求如下所示。

  1. {
  2. "requests": [
  3. {
  4. "path": "/my-ns/v1/route"
  5. }
  6. ]
  7. }

请求格式

每个请求都是一个可以接受以下属性的对象。

  1. {
  2. "method": "PUT",
  3. "path": "/my-ns/v1/route/1?query=param",
  4. "headers": {
  5. "My-Header": "my-value",
  6. "Multi": [ "v1", "v2" ]
  7. },
  8. "body": {
  9. "project": "Gutenberg"
  10. }
  11. }
  • method是用于请求的HTTP方法。如果省略,则使用POST方法。
  • path是要调用的REST API路由。可以包含查询参数。此属性是必需的。
  • headers是标头名称到标头值的对象。如果标头具有多个值,则可以将其作为数组传递。
  • body是传递给路线的参数。填写POST参数类型。

发现最大请求

默认情况下,REST API在一个批次中最多接受25个请求。但是,此值是可过滤的,因此可以根据服务器资源按比例放大或缩小。

  1. function my_prefix_rest_get_max_batch_size() {
  2. return 50;
  3. }
  4. add_filter( 'rest_get_max_batch_size', 'my_prefix_rest_get_max_batch_size' );

因此,强烈建议客户提出请求前要求以发现限制。例如,发出OPTIONS请求到batch/v1将返回以下响应。

  1. {
  2. "namespace": "",
  3. "methods": [ "POST" ],
  4. "endpoints": [
  5. {
  6. "methods": [ "POST" ],
  7. "args": {
  8. "validation": {
  9. "type": "string",
  10. "enum": [ "require-all-validate", "normal" ],
  11. "default": "normal",
  12. "required": false
  13. },
  14. "requests": {
  15. "type": "array",
  16. "maxItems": 25,
  17. "items": {
  18. "type": "object",
  19. "properties": {
  20. "method": {
  21. "type": "string",
  22. "enum": [ "POST", "PUT", "PATCH", "DELETE" ],
  23. "default": "POST"
  24. },
  25. "path": {
  26. "type": "string",
  27. "required": true
  28. },
  29. "body": {
  30. "type": "object",
  31. "properties": [],
  32. "additionalProperties": true
  33. },
  34. "headers": {
  35. "type": "object",
  36. "properties": [],
  37. "additionalProperties": {
  38. "type": [ "string", "array" ],
  39. "items": {
  40. "type": "string"
  41. }
  42. }
  43. }
  44. }
  45. },
  46. "required": true
  47. }
  48. }
  49. }
  50. ],
  51. "_links": {
  52. "self": [
  53. {
  54. "href": "http://trunk.test/wp-json/batch/v1"
  55. }
  56. ]
  57. }
  58. }

该限制在endpoints[0].args.requests.maxItems属性中指定。

回应格式

批处理端点将以与请求相同的顺序返回207状态码和每个请求的响应。例如:

  1. {
  2. "responses": [
  3. {
  4. "body": {
  5. "id": 1,
  6. "_links": {
  7. "self": [
  8. {
  9. "href": "http://trunk.test/wp-json/my-ns/v1/route/1"
  10. }
  11. ]
  12. }
  13. },
  14. "status": 201,
  15. "headers": {
  16. "Location": "http://trunk.test/wp-json/my-n1/v1/route/1",
  17. "Allow": "GET, POST"
  18. }
  19. }
  20. ]
  21. }

在内部,REST API信封包括它中之前每个响应responses阵列。

验证方式

默认情况下,每个请求都是独立处理的。这意味着批处理响应可以包含一些成功的请求和一些失败的请求。有时希望仅在所有请求均有效的情况下处理批处理。例如,在古腾堡(Gutenberg),我们不想保存某些菜单项,理想情况下将保存所有菜单项,或者不保存任何菜单项。

为此,REST API允许传递的validation模式require-all-validate。设置此选项后,REST API将根据WP_REST_Request::has_valid_params()WP_REST_Request::sanitize_params()首先检查每个请求是否有效。如果有任何请求未通过验证,则整个批次都将被拒绝。

在此示例中,发出了两个请求的批处理,第二个请求验证失败。由于responses的顺序仍与requests的顺序相同,因此用null表示请求未通过验证。

  1. {
  2. "failed": "validation",
  3. "responses": [
  4. null,
  5. {
  6. "body": {
  7. "code": "error_code",
  8. "message": "Invalid request data",
  9. "data": { "status": 400 }
  10. },
  11. "status": 400,
  12. "headers": {}
  13. }
  14. ]
  15. }

注意:使用require-all-validate不能保证所有请求都会成功。路由回调仍可能返回错误。

验证回调

在注册路由时,这些WP_REST_Request方法使用validate_callbacksanitize_callback为每个参数指定。在大多数情况下,这将意味着基于架构的验证。

路线内部完成的任何验证(例如在prepare_item_for_database方法中)都不会导致批次被拒绝。如果这是一个令人担忧的问题,建议将尽可能多的验证移到validate_callback每个单独的参数中。例如,这可以建立在基于现有架构的验证之上。

  1. 'post' => array(
  2. 'type' => 'integer',
  3. 'minimum' => 1,
  4. 'required' => true,
  5. 'arg_options' => array(
  6. 'validate_callback' => function ( $value, $request, $param ) {
  7. $valid = rest_validate_request_arg( $value, $request, $param );
  8. if ( is_wp_error( $valid ) ) {
  9. return $valid;
  10. }
  11. if ( ! get_post( $value ) || ! current_user_can( 'read_post', $value ) ) {
  12. return new WP_Error( 'invalid_post', __( 'That post does not exist.' ) );
  13. }
  14. return true;
  15. }
  16. )
  17. )

有时在执行验证时,需要请求的完整上下文。通常,此验证将在prepare_item_for_database中完成,但WordPress 5.6引入了替代方法。注册路线时,现在可以指定validate_callback顶层。它将接收完整的WP_REST_Request对象,并可以返回WP_Error实例或false。如果参数级验证未成功,则不会执行该回调。

  1. register_rest_route( 'my-ns/v1', 'route', array(
  2. 'callback' => '__return_empty_array',
  3. 'permission_callback' => '__return_true',
  4. 'validate_callback' => function( $request ) {
  5. if ( $request['pass1'] !== $request['pass2'] ) {
  6. return new WP_Error(
  7. 'passwords_must_match',
  8. __( 'Passwords must match.' ),
  9. array( 'status' => 400 )
  10. );
  11. }
  12. return true;
  13. }
  14. ) );

注意:请求验证权限检查之前进行。在考虑是否将逻辑移至validate_callback时要牢记这一点。

局限性

当前没有内置路由允许批处理。这将在将来的版本中添加,最有可能立即从WordPress 5.7开始。

不支持GET 请求。相反,鼓励开发人员暂时使用链接和嵌入或利用并行请求。

进一步阅读

参见#50244[49252][48947][48945]

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
欢迎关注WordPress大学公众号 WPDAXUE
WordPress资讯

Gutenberg 9.4.0 可设置按钮和社交图标大小、列表文字大小等

2020-11-20 8:32:05

WordPress开发WordPress资讯

WordPress 5.6 新增动作钩子 wp_after_insert_post

2020-11-22 10:41:10

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
私信列表
搜索