「非常に無駄に見えます...」というあなたの言葉は、時期尚早の最適化の試みを示しています。オブジェクトの表現全体を送信するとパフォーマンスが大幅に低下することが示されている場合を除き(150 msを超えるとユーザーには受け入れられないことです)、新しい非標準のAPI動作を作成しようとしても意味がありません。覚えておいてください、APIが単純であるほど、それは使いやすくなります。
削除が発生する前に、サーバーはオブジェクトの状態について何も知る必要がないため、削除の場合は以下を送信します。
DELETE /emails
POSTDATA: [{id:1},{id:2}]
次の考えは、アプリケーションがオブジェクトの一括更新に関するパフォーマンスの問題に直面している場合、各オブジェクトを複数のオブジェクトに分割することを検討する必要があるということです。そうすることで、JSONペイロードはサイズの一部になります。
例として、2つの個別の電子メールの「既読」および「アーカイブ済み」ステータスを更新するための応答を送信する場合、以下を送信する必要があります。
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"]
}
]
他の(to、from、subject、text)は更新されないので、メールの変更可能なコンポーネント(読み取り、アーカイブ、重要度、ラベル)を個別のオブジェクトに分割します。
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 /emails
POSTDATA: [
{
id:1,
read:true,
archived:true
},
{
id:2,
read:true,
archived:false
}
]
人々は、アクション(CRUD)、パス(URL)、および値の変更を含む一連の変更を提供することにより、PATCHを実装する必要があると述べています。これは標準の実装と考えることができますが、REST API全体を見ると、直感的ではない1回限りのものです。また、上記の実装は、GitHubがPATCHを実装した方法です。
要約すると、バッチアクションでRESTfulの原則を順守し、許容できるパフォーマンスを維持できます。