虽然 WP REST API 通常用于从 WordPress 获取数据,但它也可以用来执行其他操作。
REST API 还允许你创建、更新和删除各种 WordPress 数据类型。
在本课中,你将了解 WP REST API 模式、验证 WP REST API 请求的方法、测试 WP REST API 请求的工具,以及通过 WP REST API 添加、编辑或删除数据的几种方式。
如果你跳过了本模块前面的课程,请从仓库自述文件中的链接下载 Bookstore 插件 1.0.1 版本,并在本地 WordPress 安装中安装并激活该插件。
WP REST API 模式
在使用 REST API 时,最好将 WP REST API 文档中的端点参考部分放在手边。端点参考列出了 WordPress 核心附带的所有端点。
点击某个端点,例如文章,将显示该端点的模式。模式定义了在获取或创建特定类型数据时,该资源存在的所有字段。
如果你创建了自定义文章类型,比如 bookstore 插件中的书籍自定义文章类型,那么自定义文章类型端点的模式将与文章端点类似。
你会注意到,许多端点字段与 WordPress 数据库中与该数据类型相关的表中的字段相匹配。然而,有些字段略有不同。例如,文章端点的标题字段将与文章表中的 post_title 字段对应。记住这些差异很重要,并且在通过 API 交互时使用正确的字段名称。
身份验证
默认情况下,WordPress REST API 使用与登录 WordPress 仪表盘时相同的基于 Cookie 的身份验证方法。
对于任何非公开的 REST API 端点,或者需要验证用户才能查看或修改的端点,必须存在身份验证 Cookie。
例如,块编辑器就是这样工作的。
有多种验证请求的方法,包括 JSON Web 令牌和 OAuth。
WordPress 内置的另一种方法是应用程序密码。
应用程序密码可以按用户设置,用于验证对 WP REST API 的请求。这允许你让用户访问 API,而无需共享他们用于登录 WordPress 仪表盘的密码。
要为你的用户创建应用程序密码,请导航到用户列表中的该用户,点击该用户进行编辑。滚动到屏幕底部,在应用程序密码部分下。
为新的应用程序密码命名,然后点击添加新应用程序密码。
密码将为你生成。请务必复制并安全地存储它,因为你将无法再次看到它。
在此屏幕上,如果密码泄露,你也可以撤销它。
使用应用程序密码为你的用户测试 REST API 请求,是使用 REST API 测试工具的好方法。
如果你打算构建更复杂的东西,比如连接到 WordPress REST API 的移动应用,你应该考虑使用 JSON Web 令牌或 OAuth 1.0a。
Postman
有许多工具可用于测试 REST API 请求。
例如,如果你使用 PhpStorm,它内置了 HTTP 客户端;如果你使用 VS Code,则有像 Postcode 这样的扩展。还有像 Hoppscotch 和 Postman 这样的独立工具。你甚至可以在终端中使用 curl 命令测试 REST API 端点。
为了本课的目的,你将学习如何使用 Postman 测试一些 REST API 请求。
你可以从 Postman 网站下载 Postman。默认情况下,Postman 会创建一个初始工作区,用于存储你的请求集合。
安装后,打开 Postman,点击创建集合按钮。这将创建一个新集合,你可以在其中添加多个请求进行测试。
你可以为集合命名,以区别于其他集合。在集合内部,点击添加请求按钮。
这将打开一个新请求,你可以为请求指定一个唯一名称。然后,输入本地 books 端点的 URL,并点击发送按钮。
http://yourlocal.wordpress.site/wp-json/wp/v2/books
请求将被发送,JSON 响应将被解析并显示在响应区域中。
现在,创建一个新请求,输入相同的 books 端点 URL,但这次将请求方法更改为 POST,然后点击发送。通过将请求方法更改为 POST,你告诉服务器你想要创建或可能更新一本书。
这次你将看到一个错误消息,因为你没有经过身份验证。
要验证请求,请点击“授权”选项卡,然后从下拉菜单中选择“基本认证”。
接着,输入你的用户名以及之前创建的应用程序密码,然后点击保存按钮。
这次你不会遇到同样的错误,因为你已经通过了身份验证。现在你可以创建书籍了。
继续操作,点击请求中的“正文”选项卡,并选择“原始”单选按钮。然后,从下拉菜单中选择 JSON,并输入以下 JSON 内容:
{
"title": "My Postman Book",
"content": "This is my Postman book",
"status": "publish"
}
再次点击发送,书籍将被创建,并返回新书籍的 JSON 响应。
为了确认,请前往 WordPress 后台检查书籍列表,你应该能看到这本书。
要更新一本书,你可以使用与添加书籍相同的请求配置,但需要修改端点 URL,使其包含书籍 ID。
要删除一本书,你可以使用与更新书籍相同的端点 URL,但需要将请求方法改为 DELETE,并且不在请求正文中发送任何数据。
你还会注意到,删除一篇文章实际上会将其移至回收站,而不是永久删除。这与 WordPress 后台的行为一致。
使用 Postman 这样的工具来测试 REST API 端点,是学习如何使用 WP REST API 的好方法。它对于测试 WP REST API 请求也非常有用,可以确保你打算发送的数据格式正确,并且请求被发送到了正确的端点。
创建一本书
让我们使用 WP REST API 和 api-fetch 来创建一本新书。
为此,我们需要将标题和内容字段作为 POST 请求发送到 books 端点。
你已经有一个可以列出书籍的插件,所以可以以此为基础开始。
首先,你需要更新页面,添加一个表单,用于输入要创建的书籍的标题和内容。你可以使用以下 HTML 来创建表单,并将其添加到 bookstore_render_booklist() 管理页面回调函数中,放在现有 HTML 代码下方:
<div style="width:50%;">
<h2>Add Book</h2>
<form>
<div>
<label for="bookstore-book-title">Book Title</label>
<input type="text" id="bookstore-book-title" placeholder="Title">
</div>
<div>
<label for="bookstore-book-content">Book Content</label>
<textarea id="bookstore-book-content" cols="100" rows="10"></textarea>
</div>
<div>
<input type="button" id="bookstore-submit-book" value="Add">
</div>
</form>
</div>
这段 HTML 代码在自定义管理页面中添加了一个新表单,允许你输入新书的标题和内容。表单还包含一个提交按钮。
添加表单后,下一步是添加 JavaScript 代码,用于处理按钮点击事件:
const submitBookButton = document.getElementById( 'bookstore-submit-book' );
if ( submitBookButton ) {
submitBookButton.addEventListener( 'click', function () {
// create post code
} );
}
现在你已经添加了按钮点击事件监听器,可以添加处理书籍创建的代码了。
为此,建议创建一个单独的函数来创建书籍,并在点击事件中调用该函数。
首先,你需要创建一个 submitBook 函数:
function submitBook() {
// create book code
}
然后更新点击事件监听器,使其调用该函数:
submitBookButton.addEventListener( 'click', submitBook );
在 submitBook 函数内部,你需要从表单字段中获取标题和内容的值:
const title = document.getElementById( 'bookstore-book-title' ).value;
const content = document.getElementById( 'bookstore-book-content' ).value;
现在,你可以使用 api-fetch 向 books 端点发送请求,将路径设置为 books 端点,请求方法设置为 POST,并将 title 和 content 作为数据对象传递:
wp.apiFetch( {
path: '/wp/v2/books/',
method: 'POST',
data: {
title: title,
content: content
},
} ).then( ( result ) => {
alert( 'Book saved!' );
} );
打开自定义管理页面,输入标题和内容,然后点击“添加”按钮。你应该会看到一个提示,显示“书籍已保存!”。
然后,如果你浏览到书籍列表,就会看到新书被列出来了。
更新和删除书籍
你也可以使用 WP REST API 来更新和删除书籍。
你可以使用与添加项目相同的 api-fetch 实现来更新项目。你需要更新路径,使其包含要更新的数据实体(本例中为书籍)的 ID,以便更新该项目,同时更新数据对象,为要更新的字段提供新值。
wp.apiFetch( {
path: '/wp/v2/books/' + id,
method: 'POST',
data: {
title: newTitle,
content: newContent
},
} ).then( ( result ) => {
alert( 'Book Updated!' );
} );
删除一篇文章只需要将路径设置为该项目的 URL,并将方法设置为 DELETE。
wp.apiFetch( {
path: '/wp/v2/books/' + id,
method: 'DELETE',
} ).then( ( result ) => {
alert( 'Book deleted!' );
} );
进一步阅读
有关使用 WP REST API 创建、更新和删除数据的更多信息,请查看 WP REST API 手册中的“使用 REST API”部分,以及区块编辑器手册中的 api-fetch 包参考。