退出

  • 文章收藏

  • 消息

  • 修改资料

  • 在之前的文章链接中分享了DeveWork上关于REST API的一篇文章,可以对REST接口进行改造,从一定程度上实现按需输出。然而这并不是一个足够完善的解决办法。例如:

    • 有些特殊字段, 例如_links中的内容无法从结果中排除
    • post方法对应了文章列表和文章详情页两个应用场景,无法区分,导致文章列表页不得不同时加载亢长的content(文章内容),浪费太多的资源。

    于是今天查看了WordPress REST API的官方文档,通过自定义endpoints的方式解决了这个问题,在这里分享给大家。

    这篇文章只是个方法论:它能够实现100%的按需输出,一字不多,一字不少。你甚至可以直接在wordpress后端对HTML进行预处理,将其转化为WXML的语法格式(但这很费时间,所以应该是不准备做了)。除此之外,它还有很大想象空间,具体的创意就不说了,大家可以自由发挥。

    输出文章内容的函数

    以下列函数为例:传入分页、页数、分类,返回文章的标题列表。

    首先我们用$data变量接收url传入的参数。$data接受一个WP_REST_Request对象,我们可以从这个对象中获得变量的值。这个对象由后文“注册API接口的函数”给出。

    我们在return的参数中加入了一个code键,这样就不用通过判断返回列表的长度来确定是否加载完毕,这样从逻辑上更直接。

    function hm_get_post_list( $data ) {
      $offset = $data['per']*($data['page']-1);
      $posts = get_posts( array(
    	'category' => $data['cat'],
    	'posts_per_page' => $data['per'],
    	'offset'=>$offset
      ) );
     
      if ( empty( $posts ) ) {
    	return array(
    	  'code'=>0
    	);
      }
      
      $list=array();
      foreach ($posts as $post) {
    	  $list[] = $post->post_title;
      }
      $rtn_obj = array(
      	'code'=>1,
    	'posts'=>$list
      );
      return $rtn_obj;
    }
    

    注册API接口的函数

    add_action( 'rest_api_init', function () {
      register_rest_route( 'hm/v1', '/posts', array(
        'methods' => 'GET',
        'callback' => 'hm_get_post_list',
      ) );
    } );

    'hm/v1'是命名空间,用于区分不同来源、版本的同名API。我们可以用浏览器访问example.com/wp-json,拖到json的最后面,可以看到当前所有命名空间:

    "home" : "example.com",
      "namespaces" : [
        "oembed/1.0",
        "hm/v1",
        "wp/v2"
      ],
      "authentication" : [
    
      ],
      "description" : "DESC",
      "name" : "Web Site",
      "url" : "example.com"
    }

    第二个变量是endpoint,跟在命名空间和版本号之后:

    example.com/namespace/version/endpoint?var=a&.....

    第三个变量是所绑定的方法和函数。

    我们通过example.com/endpoint?var1=a&var2=b就可以传入参数获取函数所返回的数据,并且会自动呈现为json格式:

    {
      "posts" : [
        "Python中的函数装饰器",
        "Python 3 标准异常(内建异常)",
        "Python os 模块常用命令总结",
        "PyVISA: Python package for VISA",
        "说说Python程序的执行过程"
      ],
      "code" : 1
    }

    变量的检验和处理

    默认情况下,route会接收所有通过请求传入的变量。它们通过集合的形式添加到Request对象里,然后传给你的endpoint回调函数。

    <php function my_awesome_func( WP_REST_Request $request ) { 
    
      // 可以通过array键值的方法访问变量 
      $param = $request['some_param']; 
    
      // 或通过helper方法: 
      $param = $request->get_param( 'some_param' );
     
      // 你也可以获得全部的、整理好的变量:
      $parameters = $request->get_params();
     
      // 获取独立的变量集:
      $parameters = $request->get_url_params();
      $parameters = $request->get_query_params();
      $parameters = $request->get_body_params();
      $parameters = $request->get_json_params();
      $parameters = $request->get_default_params();
     
      // 上传的文件无法整理到变量集里,但是可以单独访问到:
      $parameters = $request->get_file_params();
    }

    在注册你的route时,你可以注册变量,同时对变量进行检验和初始化。

    <?php
    add_action( 'rest_api_init', function () {
      register_rest_route( 'myplugin/v1', '/author/(?P<id>\d+)', array(
        'methods' => 'GET',
        'callback' => 'my_awesome_func',
        'args' => array(
          'id' => array(
            'validate_callback' => function($param, $request, $key) {
              return is_numeric( $param );
            }
          ),
        ),
      ) );
    } );

    每一个id对应一个以变量名作为键值的array,array可选的键值定义如下:

    • default: 为变量设定默认值。如果没有传入相应变量,则使用默认值。
    • required: 如果定义为true,那么当变量没有定义时会报错。如果指定了default,那么变量永远是被定义的,这一项会失去意义。
    • validate_callback: 检验变量合法性的函数,传入变量,如果合法则返回true,否则返回false。
    • sanitize_callback: 在传递值给主callback函数前,对变量进行处理。
    支付宝 微信 BTC
    支付宝扫一扫,向我打赏
    来源:原创

    声明:本站原创文章采用 BY-NC-SA 创作共用协议,转载时请以链接形式标明本文地址;非原创(转载)文章版权归原作者所有。 ©查看版权声明

  • 白銀の魔法師
  • 所有的信徒都别无二致,所有的信仰都一文不值
  • 发表评论

    你目前的身份是游客,请输入昵称和邮箱! 输入资料 关闭