在上构建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)
})
控制台:
最合适的回答,由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..\' );
}
}