WP REST API:创建,更新和删除数据

在本系列的前一部分中,我们介绍了如何使用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属性中包含所有路由及其端点。

路线

在这些单独的路由中,我们可以检查特定资源是否支持POSTPUTDELETE方法。 让我们从分析Posts资源开始。

Posts资源通过以下两种途径公开数据:

/wp/v2/posts
/wp/v2/posts/(?P<id>[\d]+)

第一条路线指向post对象的集合,其method属性如下:

"methods": [
    "GET",
    "POST"
],

methods属性显示/posts路由支持分别用于检索和创建数据的GETPOST方法。

对于/posts/(?P<id>[\d]+)路由,它指向单个Posts资源, methods属性如下:

"methods": [
    "GET",
    "POST",
    "PUT",
    "PATCH",
    "DELETE"
],

从上面的代码中可以看出, /posts/(?P<id>[\d]+)路由支持GETPOSTPUTPATCHDELETE方法。

通过检查以上两种路由,我们可以得出结论/posts路由支持资源检索和创建。 /posts/(?P<id>[\d]+)路由支持资源检索以及更新和删除。 尽管它确实支持POST方法,但是此路由不支持资源创建,如下面的示例所示。

因此,指向单个资源的路由虽然支持POST方法,但不能用于创建内容。 这是因为,对于这些路由,使用POSTPUTPATCH方法来更新WP REST API中的内容。

总结本节,让我们总结一下我们在这里学到的概念:

  • 我们可以通过发送OPTIONS请求来检查哪些路由支持GETPOSTDELETE方法。
  • 指向单个实体的路由不能用于创建内容。 尽管它们确实支持POST方法,但它们用于更新内容。

在分析了不同的路线之后,我们现在准备使用WP REST API创建内容,并且我们将从探索Posts资源开始。

创建和更新帖子

让我们通过发送来自Postman或任何其他HTTP客户端的测试请求来创建帖子。 为此,请启动您的HTTP客户端,并将POST请求发送到/posts路由。 但是在此之前,请记住,资源的创建,删除和更新需要具有edit_posts权限的用户身份验证。 因此,我们将使用在本系列第二部分中学到的基本身份验证方法。

最初,我们将沿着请求发送一个空的请求正文以进行测试:

$ POST /wp/v2/posts

由于请求正文中缺少必需的参数,因此服务器将返回400-错误的请求错误。 服务器将返回以下响应:

错误的请求

响应指出,创建post对象需要contenttitleexcerpt中的任何一个。 可以通过以下三种方式之一在请求正文中沿着请求发送这些参数:

  1. 作为JSON对象
  2. 通过使用表格
  3. 作为URL参数

使用这些方法只是一个选择问题,我们将在本教程的后面部分对它们进行更详细的研究。 现在让我们使用第一种方法来创建帖子。

要在Postman中将参数作为JSON对象发送,请切换至“ 正文”选项卡,然后选择原始单选按钮。 然后从右侧的下拉菜单中选择JSON(应用程序/ json)选项。 然后,在下面的文本区域中,您可以添加JSON正文。

json主体

当前,此JSON正文仅保留帖子title的一个属性。

单击发送按钮发送请求。 如果一切顺利,服务器将以新创建的post对象作为响应返回201-Created状态。

帖子已创建

此新创建的帖子的默认状态为draft 。 我们可以通过发送另一个POSTPUTPATCH请求来更新status以及其他一些属性。 在我的情况下返回的帖子的ID为232 ,因此我将向以下端点发送请求:

$ POST /wp/v2/posts/232

更新statuscontent属性的请求主体如下所示:

{
    "status": "publish",
    "content": "This is the content of the post"
}

发送请求后,服务器将返回200-OK状态,表示帖子已成功更新。

在上面的示例中,我们遇到了以下三个参数来创建帖子:

  1. title
  2. status
  3. 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对象来创建帖子元。 这两个属性是keyvalue

{
    "key": "name",
    "value": "Bilal"
}

keyvalue属性的value分别是nameBilal

发送请求,服务器将返回201-已创建状态代码,表明已成功创建发布元。 新创建的post元对象也将在响应中返回:

发布元对象

请注意,在编写本教程时,WP REST API不支持用于创建post meta的整数值。 如果我们尝试在JSON对象中发送一个整数值来创建post meta,则服务器将返回400-错误的请求状态代码。

{
    "key": "value",
    "value": 12345
}

注意值12345周围缺少的引号。 返回的响应将如下所示:

错误的请求

因此,您随请求发送的用于创建帖子元的任何内容均应为字符串格式。

数据创建和更新方法

到目前为止,在本教程中,我们一直在请求正文中使用JSON格式来创建和更新资源。 让我们看一下WP REST API提供的用于创建和更新数据的所有选项。

将数据作为URL参数发送

沿着请求发送数据的最简单方法是将其作为URL参数发送。 考虑以下用于创建帖子的POST请求:

$ POST /wp/v2/posts?title=the+title&content=this+is+the+content

上面的请求将两个参数发送到服务器以获取帖子的titlecontent

同样,为了为ID为232的帖子创建帖子元,我们使用以下POST请求:

$ POST /wp/v2/posts/232/meta?key=name&value=Bilal

上面的请求将创建以下元对象:

元对象

如上例所示,当参数为短字符串时,此方法最合适。 但是,随着参数数量和它们值的长度增加,将它们作为URL参数进行管理变得困难。

将数据作为JSON对象发送

使用此方法,我们将参数作为JSON对象中的键/值对在请求中传递。 到目前为止,我们一直在使用Postman将请求发送到服务器。 现在我们来看看如何使用HTML和jQuery实现此方法。

考虑以下简单形式,它由三个字段组成,分别是titlestatuscontent

<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标头字段以包括AuthorizationContent-Type值。 这可以通过在WordPress的.htaccess文件中添加以下代码来完成:

Header set Access-Control-Allow-Headers "Content-Type, Authorization"

现在让我们看一下通过HTML表单发送数据。

使用表格发送数据

沿着请求发送数据的最后一种方法是使用HTML表单。 这些表单应包含具有name属性的字段。 name属性用作参数名称,例如titlestatuscontent等。这些字段的值用作这些参数的值。

我们可以使用在上一个示例中创建的相同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-datax-www-form-urlencoded选项。

邮差

然后可以在键/值对中定义参数以随请求一起发送。

有关不同表单类型的详细信息可以在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()方法接受两个参数作为字段的namevalue 。 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特权的用户身份对自己进行身份验证。

确保从服务器内部运行上述脚本。 如果一切顺利,并且文件已上传,则服务器将返回新创建的媒体对象。

媒体对象

然后可以将此图像设置为帖子的特色图像。

在仔细研究了使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值