WP_REST_RESPONSE()似乎未返回预期对象

时间:2021-02-06 作者:drake035

在上构建this answer, 这个WP_REST_Response() 自定义路由的回调函数返回的对象不是我要求它返回的对象。我的对象有一个;“状态”;304和a“;“消息”;字段中,返回的对象有一个;“状态”;“200和否”;“消息”;领域为什么?

下面我简化了sendContactMail()\'s代码并创建了错误响应。所有这些最终都不会显示在控制台中(请参见我问题的底部):

function sendContactMail(WP_REST_Request $request) {
  $response = array(
    \'status\'  => 304,
    \'message\' => \'There was an error sending the form.\'
  );

  return new WP_REST_Response($response);
}

add_action(\'rest_api_init\', function() {
  register_rest_route(\'contact/v1\', \'send\', array(
    \'methods\'             => \'POST\',
    \'callback\'            => \'sendContactMail\',
    \'permission_callback\' => \'__return_true\',
    \'args\'                => array(
      \'contact_name\'    => array(
        \'required\'          => true,
        \'validate_callback\' => function ($value) {
            return preg_match(\'/[a-z0-9]{2,}/i\', $value) ? true :
              new WP_Error(\'invalid_contact_name\', \'Your custom error.\');
        },
        \'sanitize_callback\' => \'sanitize_text_field\',
      ),
      \'contact_email\'   => array(
        \'required\'          => true,
        \'validate_callback\' => \'is_email\',
        \'sanitize_callback\' => \'sanitize_email\',
      ),
      \'contact_message\' => array(
        \'required\'          => true,
        \'sanitize_callback\' => \'sanitize_textarea_field\',
      ),
    ),
  ));
});
前端:

fetch(`${this.baseUrl}/wp-json/contact/v1/send`, {
  method: \'POST\',
  body: formData
})
  .then((res) => {
    if (res.status === 304) {
      // do something
    } else {
      // do something different
    }
  })
  .catch(error => {
    console.log(error)
  })
控制台:

enter image description here

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

我相信WP_Rest_Response 确实根据端点回调返回的内容返回了正确的响应,但我认为您不理解fetch() 返回,请检查documentation on MDN 有关更多详细信息,请参阅以下摘录:

这个fetch() 方法接受一个强制参数,即要获取的资源的路径。它返回一个Promise 这就决定了Response无论成功与否。

所以指的是your screenshot, 您实际上正在查看上述内容Response 对象,其中包括正文、标头、URL等,响应正文是body 属性(单击body: (...)), 但是要在响应中获得实际的JSON数据,可以使用res.json():

fetch ( `${this.baseUrl}/wp-json/contact/v1/send`, {
    method: \'POST\',
    body: formData,
} )
    .then(
        ( res ) => {
            res.json().then(
                ( data ) => console.log( data, res.status ),
                ( jsonError ) => console.log( jsonError )
            );
        },
        ( error ) => console.log( error )
    );
事实上status 在您的$response 数组是响应的一部分body, 因此$response 实际上是响应体。

如果要发送自定义HTTP状态代码,可以使用第二个参数WP_HTTP_Response::__construct()WP_REST_Response 扩展的类WP_HTTP_Response.

但是,是否确实要使用304(“未修改”)地位因为这不会返回任何响应。。因此,您应该改为使用400(“错误请求”)指示请求中的错误。

function sendContactMail( WP_REST_Request $request ) {
    // dummy param, used for emitting an error, if requested
    $ok = empty( $request[\'is_error\'] );

    // Send the response with custom HTTP status code.
    if ( $ok ) {
        return new WP_REST_Response( array( \'message\' => \'Form sent!\' ), 200 );
    } else {
        return new WP_REST_Response( array( \'message\' => \'Something wrong..\' ), 400 );
    }
}
或者您也可以返回WP_Error 实例和状态代码将默认为400:

function sendContactMail( WP_REST_Request $request ) {
    // dummy param, used for emitting an error, if requested
    $ok = empty( $request[\'is_error\'] );

    // Use the default HTTP status codes.
    if ( $ok ) {
        return new WP_REST_Response( array( \'message\' => \'Form sent!\' ) );
    } else {
        return new WP_Error( \'foo_code\', \'Something wrong..\' );
    }
}