当前位置: 首页 > 知识库问答 >
问题:

WP Rest API自定义endpoint在GET和POST上返回false

姜良哲
2023-03-14

我有一个用户元的自定义endpoint,我已成功注册到WP REST API并为其创建了自定义endpoint。然而,每当我从我的单页应用程序(使用的JS框架是Vue)发出GET和POST请求时,返回值为“false”

我怀疑这是由于使用JWT Authoration for WP REST API插件存在一些授权问题而发生的。

以下是我在functions.php应用程序中采取的步骤:

首先,我为REST API注册用户元字段:


//register user meta to rest api 
add_action( 'rest_api_init', 'adding_user_meta_rest' );

function adding_user_meta_rest (){
    register_meta(
     'user',
     'user_likes',
     array(
         'single'       => false,
         'type'         => 'object',
         'show_in_rest' => true,
     )
 );
};

此步骤似乎工作正常,因为当我使用路径“/wp-json/wp/v2/users/”时,该字段显示出来。

下一步,我注册自定义endpoint:

add_action('rest_api_init','add_user_likes');

function add_user_likes(){
    register_rest_route(
    'v1/user_likes','/(?P<id>\d+)',[[
        'methods'=> 'GET',
        'callback'=>'get_user_likes'
    ],
    [
        'methods'=> 'POST',
        'callback'=>'post_user_likes'
    ]]);
};

以下是我的试镜:

function get_user_likes(){
    $current_user_id = get_current_user_id();
    $status = $response->get_status;
    return get_user_meta($current_user_id,'user_likes');
}
function post_user_likes(WP_REST_Request $req){
    $body = $req->get_json_params();
    $current_user_id = get_current_user_id();
    return update_user_meta($current_user_id, 'user_likes',$body);
};

然后在前端,这是我的POST请求:

handleLike(){
      fetch(`https://site-url.com/wp-json/v1/user_likes/${this.$store.state.userInfo.id}`,{
        method:"POST",
        body:JSON.stringify({
          post_id:this.currentPost.id,
          post_title:this.currentPost.title.rendered
        }),
         headers: {
          "Content-Type": "application/json",
          "Authorization": `Bearer ${this.$store.state.accessToken}`
        },
      }).then(resp=>resp.json())
      .then(data=>console.log(data)) 

我的GET请求也返回false。

我认为问题是,我没有检索当前用户ID,因为根据get_user_meta和update_USERMETA的文档,如果未确定用户ID,函数将返回false。为什么没有确定用户id,我不知道。正如我提到的,我正在使用JWT授权WP REST API。因此,根据我的阅读,我不需要生成随机数,因为WP将使用令牌来确定当前用户。如果我错了,请告诉我。任何指导都将不胜感激。

共有2个答案

姬坚成
2023-03-14

弄清楚了我的问题。对于使用 JWT Authorization For WP REST API 并在 AWS Lightsail 上托管其 Wordpress 数据库的未来用户,以下是 .htaccess 文件必须存储在 Bitnami 的 SSH 上的方式:

<Directory "/opt/bitnami/apps/wordpress/htdocs”>
<IfModule mod_rewrite.c>RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>
</Directory>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

我遇到的第二个问题:令牌已经是一个字符串。因此,将其放在模板文字中会导致解析问题。使用简单的连接即可。

以下是我在标题中对授权所做的更改(注意:这是使用Vue的Vuex):

"Authorization": "Bearer" + this.$store.state.accessToken
姚臻
2023-03-14

试试这个,设置< code >凭证

method: 'POST',
      credentials: 'same-origin',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cache-Control': 'no-cache',
      },
      body: params
    })

可以通过将其添加到函数中来管理 corse.php

function my_customize_rest_cors() {
    remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
    add_filter( 'rest_pre_serve_request', function( $value ) {
        header( 'Access-Control-Allow-Origin: *' );
        header( 'Access-Control-Allow-Methods: POST, GET' );
        header( 'Access-Control-Allow-Credentials: true' );
        header( 'Access-Control-Expose-Headers: Link', false );
        header( 'Access-Control-Allow-Headers: X-Requested-With' );
        return $value;
    } );
}

add_action( 'rest_api_init', 'my_customize_rest_cors', 15 );
 类似资料:
  • TL;DR:如何选择一个WP REST API自定义endpoint的响应的每一点信息? 长版 如果我想使用WP REST API构建自定义endpoint - 从不同的帖子类型发送特定帖子数据 - 按照手册中的示例,我得到了这个: 但是get_post()函数没有返回一些数据,如果您希望在页面中显示帖子,这些数据是非常有用的(例如类别id、特色图片)。那么,我如何构建一个自定义endpoint来

  • 我正在使用Jersey restful API with Atmosphere。 这是我的网站。xml 现在,我有一个带有的资源类,并且我已经定义了和方法。在我的整个项目中,没有其他类处理路径。 我使用的url是,我在调用中使用POST方法。 尽管我定义了GET和POST方法 HTTP状态405-不允许的方法 但是,当我删除AdminPanel的serlvet映射并更改

  • 我正在尝试减少使用Rest API时返回的JSON。我可以在查询中使用“_embed”参数让它工作,但是它返回了大量我不需要的数据。因此,根据WP最佳实践,我想设置一个自定义endpoint,并在它的回调中调用一个函数来输出我需要的三个项目。看起来很简单,但是当我尝试的时候,它对所有的节点都返回NULL。在我的functions.php档案中,我有: 然后路由并回调自定义endpoint 当我使用

  • 我没有得到实际的超文本传输协议标头时,使超文本传输协议后调用使用角5公共http pClient.我在请求中传递观察:'响应'以获得完整的响应(默认情况下,http客户端仅返回响应中的正文)。 我想从http头响应中读取csrftoken值。我可以看到csrftoken在使用chrome浏览器网络视图的响应头中可用。 但是当我在Angular中阅读httpClient响应时,这一点是不可用的。 在

  • 我正在为Post类型Post创建自定义endpoint。Javascript的请求工作正常,但无法理解如何更新,例如,帖子的内容。 我已经创建并注册了一个路由,我为路由创建了一个回调函数,我还创建了一种小表单,在其中插入了post ID和内容。 这是路由的代码 这是回调函数 来自 javascript 的 XMLHTTPRrequest 是 变量“内容”和“id”是我写在表单字段内的值。 resp

  • 我目前正在从事一个需要WordPress网站和简单的REST api的项目。我发现WordPress有自己的REST api,并决定扩展其功能以满足我的需求。我需要做的就是拥有GET和POST请求的endpoint,这些endpoint可以从与WordPress没有直接关系的表(但在同一个数据库中)中检索/插入数据。我成功地实现了所有GET请求,但是,我正在努力让POST的工作。 我定义了这个路由