我有一个简单的CPT
调用App
在后端。
我添加了一个自定义usermeta
已调用字段favorite_apps
到Users
在前端,我显示一个应用程序列表,然后用户按一个星(☆) 图标将其添加到收藏夹列表中(存储为post_id
在favorite_apps
自定义用户元字段)。
我决定使用REST API进行此操作,并构建了一个自定义端点:
/wp-json/my-site/v1/users/{user_id}/favoriteapps
示例:
/wp-json/my-site/v1/users/555/favoriteapps
此路线接受POST,PUT,PATCH
使用WP::Editable
和GET
使用WP::Readable
.
A.GET
请求返回用户列表555
\'s电流favorite_apps
A.POST
请求并通过app=123
在正文中,我添加了应用程序ID123
到app_favorites
我不确定是否要从列表中删除应用程序。我没有删除favorite\\u应用程序列表,我正在删除其中一个项目。
使用起来感觉很自然POST
和DELETE
从列表中添加/删除,但:
是否有convention 修改项目列表时可以遵循的操作我应该使用PUT
或PATCH
并通过action
作为另一个参数我需要担心吗browser support 对于某些方法作为参考,我是这样添加应用程序的123
收件人/发件人用户555
在js/jQuery中:
var uid = 555;
var appId = 123;
$.ajax({
method : \'POST\',
data : { app : 123 },
url : \'/wp-json/my-site/v1/users/\' + uid + \'/favoriteapps\',
success: function( data ){
// code to tell user of success or failure;
}
});
最合适的回答,由SO网友:Armstrongest 整理而成
好的,下面是一些很好的例子:https://restfulapi.net/resource-naming/ 和http://www.restapitutorial.com/lessons/restfulresourcenaming.html 我要回答我自己的问题。
ESSENTIALLY, 对于我的用例,我不会使用PUT
但依赖于POST
和DELETE
到集合终结点和单例终结点。
注:我省略了wp-json/my-site-namespace/v1
为清晰起见,我在POST请求中使用了查询字符串,但为了清晰起见,我会在POST正文中将其作为POST变量提交,而不是在查询字符串中提交使用GET
对单个实体或集合的请求
// Gets a collection of users
GET /users
// Gets the singleton users 3
GET /users/3/favoriteapps
// Gets a collection of user 3 favorite apps
GET /users/3/favoriteapps
使用POST
仅在集合终结点上请求(有意义)
// Create a new user named Joe ( returns the ID )
POST /users?name=Joe ( pass in required params in POST vars )
// Add app 123 to user\'s favorite apps. Technically, I\'m not CREATING
// a new favorite app, which is where I was getting hung up, but
// in context of user 3, I AM creating a new reference to an existing app
POST /users/3/favoriteapps?app_id=123 ( pass in required app id in POST vars )
使用PUT
请求编辑集合或实体在我的情况下,我正在向用户添加和从用户中删除已知应用,因此我不支持PUT
在我的实现中,但如果我确实实现了它,我将只在集合上实现它,如果我传递一个集合并将该集合与现有集合进行比较,可能会这样。
// Edit ( replace ) existing apps with list of apps for user 3
PUT /users/3/favoriteapps?apps=123,321,444,111,33
// In my use case, I wouldn\'t ONLY support PUT to a new favoriteapps
// base url, outside of the user context This would but this would
// change the app title for app 123 ( obviously for all users\' collections )
PUT /favoriteapps/123?title=New+App+Title
使用DELETE
在单个实体端点上的请求(大部分)**
**在集合端点上使用DELETE应该删除整个集合(从语义上讲),这很少是您想要的。但在某些情况下,如使用清除按钮将集合重置为0项,您可以使用它。
// Remove app `123` from favoriteapps collection of user 3
DELETE /users/3/favoriteapps/123
// note: this is another area I got hung up, as I\'m not DELETING app 123
// However, in context of user 3, I AM removing it from that user\'s collection