您的语言“这似乎很浪费……”,对我来说表明是过早优化的尝试。除非可以证明发送对象的完整表示形式会严重影响性能(对于大于150ms的用户来说,这是不可接受的),否则尝试创建新的非标准API行为毫无意义。请记住,API越简单,使用起来就越容易。
对于删除,请发送以下内容,因为服务器在删除发生之前不需要了解有关对象状态的任何信息。
DELETE /emails
POSTDATA: [{id:1},{id:2}]
下一个想法是,如果应用程序遇到有关对象的大量更新的性能问题,则应考虑将每个对象分解为多个对象。这样,JSON有效负载只是大小的一小部分。
例如,当发送响应以更新两个单独的电子邮件的“已读”和“已存档”状态时,您将必须发送以下内容:
PUT /emails
POSTDATA: [
{
id:1,
to:"someone@bratwurst.com",
from:"someguy@frommyville.com",
subject:"Try this recipe!",
text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1t Mustard Powder",
read:true,
archived:true,
importance:2,
labels:["Someone","Mustard"]
},
{
id:2,
to:"someone@bratwurst.com",
from:"someguy@frommyville.com",
subject:"Try this recipe (With Fix)",
text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1T Mustard Powder, 1t Garlic Powder",
read:true,
archived:false,
importance:1,
labels:["Someone","Mustard"]
}
]
我会将电子邮件的可变组件(阅读,存档,重要性,标签)拆分为一个单独的对象,而其他对象(至,从,主题,文本)将永远不会更新。
PUT /email-statuses
POSTDATA: [
{id:15,read:true,archived:true,importance:2,labels:["Someone","Mustard"]},
{id:27,read:true,archived:false,importance:1,labels:["Someone","Mustard"]}
]
采取的另一种方法是利用PATCH的使用。为了明确指出您打算更新哪些属性,而应忽略所有其他属性。
PATCH /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
人们指出,应该通过提供一系列更改来实现PATCH,其中包含:操作(CRUD),路径(URL)和值更改。这可能被视为标准实现,但是如果您查看REST API的全部内容,那将是一种非直觉的一次性。同样,上述实现是GitHub如何实现PATCH的方式。
综上所述,可以通过批处理操作遵守RESTful原则,并且仍具有可接受的性能。