在本系列的前一部分中,我们介绍了如何使用WP REST API从服务器检索内容。 我们学习了如何检索不同资源的内容,包括帖子,帖子元,标签,类别等。这是一项强大的功能,因为可以在WordPress内外的任何地方使用此内容。
我们还了解了OPTIONS
请求,该请求通过列出所有路由,其端点和各自的参数来自我记录API。 这样就减少了对API依赖外部文档的需求,并且在API被更新或更改的情况下,可以很快发现更改。
看了这些功能之后,在本教程中,我们现在将注意力集中在CRUD的其他三个操作上,即使用WP REST API创建,更新和删除数据。
在本教程中,我们将:
- 分析哪些资源支持创建,更新和删除方法
- 学习创建,更新和删除资源
- 研究如何根据请求发送数据以创建资源
- 分析服务器响应和不同的响应代码
因此,让我们开始分析哪些资源支持使用WP REST API的创建,更新和删除方法。
检查路由中的创建,更新和删除方法
在我们直接研究使用WP REST API创建和更新数据之前,我们需要分析哪些路由支持创建和更新方法。 我们通过检查路由和端点中的methods
属性来做到这一点。 这可以通过向单独的路由发送单独的OPTIONS
请求来完成,但是更方便的方法是将GET
请求发送到/wp-json
索引路由,就像在本系列前一部分中所做的那样。
向/wp-json
路由发送GET
请求将返回一个对象,该对象在routes
属性中包含所有路由及其端点。
![路线](https://cms-assets.tutsplus.com/uploads/users/167/posts/24883/image/4.1-.jpg)
在这些单独的路由中,我们可以检查特定资源是否支持POST
, PUT
和DELETE
方法。 让我们从分析Posts资源开始。
Posts资源通过以下两种途径公开数据:
/wp/v2/posts
/wp/v2/posts/(?P<id>[\d]+)
第一条路线指向post对象的集合,其method
属性如下:
"methods": [
"GET",
"POST"
],
此methods
属性显示/posts
路由支持分别用于检索和创建数据的GET
和POST
方法。
对于/posts/(?P<id>[\d]+)
路由,它指向单个Posts资源, methods
属性如下:
"methods": [
"GET",
"POST",
"PUT",
"PATCH",
"DELETE"
],
从上面的代码中可以看出, /posts/(?P<id>[\d]+)
路由支持GET
, POST
, PUT
, PATCH
和DELETE
方法。
通过检查以上两种路由,我们可以得出结论/posts
路由支持资源检索和创建。 /posts/(?P<id>[\d]+)
路由支持资源检索以及更新和删除。 尽管它确实支持POST
方法,但是此路由不支持资源创建,如下面的示例所示。
因此,指向单个资源的路由虽然支持POST
方法,但不能用于创建内容。 这是因为,对于这些路由,使用POST
, PUT
和PATCH
方法来更新WP REST API中的内容。
总结本节,让我们总结一下我们在这里学到的概念:
- 我们可以通过发送
OPTIONS
请求来检查哪些路由支持GET
,POST
和DELETE
方法。 - 指向单个实体的路由不能用于创建内容。 尽管它们确实支持
POST
方法,但它们用于更新内容。
在分析了不同的路线之后,我们现在准备使用WP REST API创建内容,并且我们将从探索Posts资源开始。
创建和更新帖子
让我们通过发送来自Postman或任何其他HTTP客户端的测试请求来创建帖子。 为此,请启动您的HTTP客户端,并将POST
请求发送到/posts
路由。 但是在此之前,请记住,资源的创建,删除和更新需要具有edit_posts
权限的用户身份验证。 因此,我们将使用在本系列第二部分中学到的基本身份验证方法。
最初,我们将沿着请求发送一个空的请求正文以进行测试:
$ POST /wp/v2/posts
由于请求正文中缺少必需的参数,因此服务器将返回400-错误的请求错误。 服务器将返回以下响应:
![错误的请求](https://i-blog.csdnimg.cn/blog_migrate/74bc70d90b4b5b8a16d2adf6914498d1.png)
响应指出,创建post对象需要content
, title
或excerpt
中的任何一个。 可以通过以下三种方式之一在请求正文中沿着请求发送这些参数:
- 作为JSON对象
- 通过使用表格
- 作为URL参数
使用这些方法只是一个选择问题,我们将在本教程的后面部分对它们进行更详细的研究。 现在让我们使用第一种方法来创建帖子。
要在Postman中将参数作为JSON对象发送,请切换至“ 正文”选项卡,然后选择原始单选按钮。 然后从右侧的下拉菜单中选择JSON(应用程序/ json)选项。 然后,在下面的文本区域中,您可以添加JSON正文。
![json主体](https://cms-assets.tutsplus.com/uploads/users/167/posts/24883/image/5.3-.jpg)
当前,此JSON正文仅保留帖子title
的一个属性。
单击发送按钮发送请求。 如果一切顺利,服务器将以新创建的post对象作为响应返回201-Created状态。
![帖子已创建](https://cms-assets.tutsplus.com/uploads/users/167/posts/24883/image/5.4-.jpg)
此新创建的帖子的默认状态为draft
。 我们可以通过发送另一个POST
, PUT
或PATCH
请求来更新status
以及其他一些属性。 在我的情况下返回的帖子的ID为232
,因此我将向以下端点发送请求:
$ POST /wp/v2/posts/232
更新status
和content
属性的请求主体如下所示:
{
"status": "publish",
"content": "This is the content of the post"
}
发送请求后,服务器将返回200-OK状态,表示帖子已成功更新。
在上面的示例中,我们遇到了以下三个参数来创建帖子:
-
title
-
status
-
content
可以通过以下简单的OPTIONS
请求检索用于创建帖子的受支持参数的完整列表:
$ OPTIONS /wp/v2/posts
然后,我们可以检查POST
方法数组中的args
属性。
既然我们已经了解了如何创建和更新帖子,那么让我们看一下可以使用的更多资源。
创建和更新帖子元
更新:现在,要在WP REST API中使用帖子和页面元,就需要WP REST API团队在GitHub上提供一个配套插件。
可以通过将POST
请求发送到以下路由来创建Post meta:
/wp/v2/posts/(?P<parent_id>[\d]+)/meta
其中(?P<parent_id>[\d]+)
是父帖子的ID。 我将使用上一节中创建的帖子的ID 232
。
与发送请求主体以创建帖子对象的方式类似,可以发送包含两个属性的JSON对象来创建帖子元。 这两个属性是key
和value
。
{
"key": "name",
"value": "Bilal"
}
key
和value
属性的value
分别是name
和Bilal
。
发送请求,服务器将返回201-已创建状态代码,表明已成功创建发布元。 新创建的post元对象也将在响应中返回:
![发布元对象](https://i-blog.csdnimg.cn/blog_migrate/5d6c39dcab628874ab563025c4d699e1.png)
请注意,在编写本教程时,WP REST API不支持用于创建post meta的整数值。 如果我们尝试在JSON对象中发送一个整数值来创建post meta,则服务器将返回400-错误的请求状态代码。
{
"key": "value",
"value": 12345
}
注意值12345
周围缺少的引号。 返回的响应将如下所示:
![错误的请求](https://i-blog.csdnimg.cn/blog_migrate/fe30f0e8fe57b582b1ab97b34799586b.png)
因此,您随请求发送的用于创建帖子元的任何内容均应为字符串格式。
数据创建和更新方法
到目前为止,在本教程中,我们一直在请求正文中使用JSON格式来创建和更新资源。 让我们看一下WP REST API提供的用于创建和更新数据的所有选项。
将数据作为URL参数发送
沿着请求发送数据的最简单方法是将其作为URL参数发送。 考虑以下用于创建帖子的POST
请求:
$ POST /wp/v2/posts?title=the+title&content=this+is+the+content
上面的请求将两个参数发送到服务器以获取帖子的title
和content
。
同样,为了为ID为232
的帖子创建帖子元,我们使用以下POST
请求:
$ POST /wp/v2/posts/232/meta?key=name&value=Bilal
上面的请求将创建以下元对象:
![元对象](https://cms-assets.tutsplus.com/uploads/users/167/posts/24883/image/5.9-.jpg)
如上例所示,当参数为短字符串时,此方法最合适。 但是,随着参数数量和它们值的长度增加,将它们作为URL参数进行管理变得困难。
将数据作为JSON对象发送
使用此方法,我们将参数作为JSON对象中的键/值对在请求中传递。 到目前为止,我们一直在使用Postman将请求发送到服务器。 现在我们来看看如何使用HTML和jQuery实现此方法。
考虑以下简单形式,它由三个字段组成,分别是title
, status
和content
:
<form name="post-form" id="post-form">
<label for="title">Title</label>
<input type="text" name="title" id="title">
<label for="status">Status</label>
<select name="status" id="status">
<option value="publish">Publish</option>
<option value="draft">Draft</option>
</select>
<label for="content">Content</label>
<textarea name="content" id="content"></textarea>
<input type="submit" name="submit" value="Submit">
</form>
提交以上表单后,将执行以下JavaScript(jQuery)代码:
var postForm = $( '#post-form' );
var jsonData = function( form ) {
var arrData = form.serializeArray(),
objData = {};
$.each( arrData, function( index, elem ) {
objData[elem.name] = elem.value;
});
return JSON.stringify( objData );
};
postForm.on( 'submit', function( e ) {
e.preventDefault();
$.ajax({
url: 'https://your-dev-server/wp-json/wp/v2/posts',
method: 'POST',
data: jsonData( postForm ),
crossDomain: true,
contentType: 'application/json',
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'Authorization', 'Basic username:password' );
},
success: function( data ) {
console.log( data );
},
error: function( error ) {
console.log( error );
}
});
});
提交上述表格后,我们会将AJAX请求发送到/wp/v2/posts
路由。 jsonData()
方法接受HTML表单的jQuery实例,并将其数据转换为JSON格式。 然后,该JSON数据将在$.ajax()
方法的data
属性中使用。 此外,我们使用contentType
属性将内容类型设置为application/json
。
在发送请求之前,我们将标头设置为包括用于使用基本身份验证方法的Authorization
标头。 在本系列的第二部分中 ,我们已经学习了设置和使用基本认证方法。
最后,将请求发送到/wp/v2/posts
路由,并创建一个新帖子。 服务器将这个新创建的post对象作为响应返回,我们只需将它登录到console内的success()
方法即可。
上面的示例演示了使用JSON格式沿请求发送数据。 JSON对象的来源可以是HTML表单以外的任何内容,具体取决于应用程序的体系结构。
请注意,为使上面的代码正常工作,您可能需要设置Access-Control-Allow-Headers
标头字段以包括Authorization
和Content-Type
值。 这可以通过在WordPress的.htaccess文件中添加以下代码来完成:
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
现在让我们看一下通过HTML表单发送数据。
使用表格发送数据
沿着请求发送数据的最后一种方法是使用HTML表单。 这些表单应包含具有name
属性的字段。 name
属性用作参数名称,例如title
, status
, content
等。这些字段的值用作这些参数的值。
我们可以使用在上一个示例中创建的相同HTML表单,然后利用以下代码创建新帖子:
var postForm = $( '#post-form' );
postForm.on( 'submit', function( e ) {
e.preventDefault();
$.ajax({
url: 'http://your-dev-server/wp-json/wp/v2/posts',
method: 'POST',
data: postForm.serialize(),
crossDomain: true,
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'Authorization', 'Basic username:password' );
},
success: function( data ) {
console.log( data );
}
});
});
上面的代码与前面的示例相同,除了我们删除了jsonData()
方法,并且现在使用jQuery的serialize()
方法以字符串格式发送表单数据。 上面的jQuery代码使用默认的application/x-www-form-urlencoded
内容类型,该内容类型以巨型字符串的形式发送数据,其参数由&
符号分隔,并使用=
符号分配其值。 这有点像作为URL参数发送数据,只是它不公开数据。 如果数据仅包含字母数字字符,这是一种发送数据的有效方法。
要发送二进制(非字母数字)数据,我们使用multipart/form-data
内容类型。 如果我们需要使用WP REST API上传图像或其他文件,则可以使用此方法。
要在Postman中发送表单数据,可以切换到“ 正文”选项卡,然后使用form-data或x-www-form-urlencoded选项。
![邮差](https://i-blog.csdnimg.cn/blog_migrate/fc91f3566f4707e2253f2e98d00c4dae.png)
然后可以在键/值对中定义参数以随请求一起发送。
有关不同表单类型的详细信息可以在W3C规范中找到。
使用multipart/form-data
内容类型上载媒体
现在,我们已经研究了以字符串形式发送数据的x-www-form-urlencoded
表单类型,让我们开始探索更高级的表单编码类型,即multipart/form-data
。
multipart/form-data
内容类型在处理二进制数据时使用,因此可以用于将图像或其他文件类型上载到服务器。
在下面的示例中,我们使用由input[type=”file”]
和一些jQuery组成的简单HTML表单,使用/wp/v2/media
路由将图像上传到服务器。
考虑以下HTML形式:
<form name="image-form" id="image-form">
<label for="image-input">File</label>
<input name="image-input" id="image-input" type="file">
<input type="submit" value="Upload">
</form>
提交上述表单后,将执行以下JavaScript:
var imageForm = $( '#image-form' ),
fileInput = $('#file'),
formData = new FormData();
imageForm.on( 'submit', function( e ) {
e.preventDefault();
formData.append( 'file', fileInput[0].files[0] );
$.ajax({
url: 'http://your-dev-server/wp-json/wp/v2/media',
method: 'POST',
data: formData,
crossDomain: true,
contentType: false,
processData: false,
beforeSend: function ( xhr ) {
xhr.setRequestHeader( 'Authorization', 'Basic username:password' );
},
success: function( data ) {
console.log( data );
},
error: function( error ) {
console.log( error );
}
});
});
在这里,我们首先获得表单及其输入字段的jQuery实例。 然后,我们初始化一个新的FormData
对象。 FormData
接口提供了一种使用键/值对构造一组表单字段的方法,并使用与multipart/form-data
表单编码类型相同的格式。
提交表单后,我们通过在事件对象上调用.preventDefault()
方法来阻止表单提交。 然后,我们使用.append()
方法将新字段追加到formData
实例。 .append()
方法接受两个参数作为字段的name
和value
。 WP REST API将文件输入字段的name
属性强制为file
。 这就是为什么我们将第一个参数( name
设置为file
,对于第二个参数,我们通过引用input元素来传递文件blob对象 。
默认情况下,传递到jQuery.ajax()
方法的data
属性中的data
将处理为查询字符串。 由于我们在此处上传图像文件,因此我们不希望这种情况发生,因此我们将processData
属性设置为false
。 我们还将contentType
属性设置为false
以防止将application/x-www-form-urlencoded
作为默认内容类型发送到服务器。
最后,我们设置Authorization
标头以使用具有edit_posts
特权的用户身份对自己进行身份验证。
确保从服务器内部运行上述脚本。 如果一切顺利,并且文件已上传,则服务器将返回新创建的媒体对象。
![媒体对象](https://i-blog.csdnimg.cn/blog_migrate/0a7ef545959340cef9f22966fbe09c9e.png)
然后可以将此图像设置为帖子的特色图像。
在仔细研究了使用WP REST API创建和更新资源的方法之后,让我们看看如何删除它们。
使用WP REST API删除数据
使用WP REST API删除数据就像将DELETE
请求发送到特定资源一样简单。
如果我们需要删除ID为10
的帖子,我们将发送以下DELETE
请求:
$ DELETE /wp/v2/posts/10
这会将帖子移至回收站,但不会永久删除。 为了永久删除帖子,我们使用force
参数:
$ DELETE /wp/v2/posts/10?force=true
请注意,在删除不支持垃圾回收的资源时,需要使用force
参数。 这样的资源的例子是后元和媒体。
话虽如此,我们现在结束本系列的当前部分。
接下来是什么?
在这个冗长的教程中,我们研究了使用WP REST API创建,更新和删除各种资源。 我们了解了沿请求发送数据的不同方法,包括以JSON格式和使用表单的形式作为URL参数发送数据。 在本教程的最后,我们学习了如何通过发送DELETE
请求来删除资源。
在该系列的下一个也是最后一部分中,我们将学习WP REST API的内部结构及其类。 我们还将学习扩展API来修改服务器响应。 在本系列的下一部分见,敬请期待...
翻译自: https://code.tutsplus.com/tutorials/wp-rest-api-creating-updating-and-deleting-data--cms-24883