他の人が言ったように、普遍的な慣習はありません。REST の「コミュニティ」は、このような問題について何らかの合意を得る過程にあり、合意が得られない可能性があります。いくつかの例を挙げると:
ステータス コード
デフォルトでは、広く使用されている C# REST ライブラリWeb サービス フレームワークである ServiceStack.NET は、オブジェクト (または空の応答) を状態コードと共に返します。
201 Created
または:
200 OK
検証エラー (例: ArgumentException
)の場合、次のようになります。
400 Bad Request
そして、ここですでに物事が変化し始める最初のポイントです。400
検証エラーなどのステータス コードを好む人もいれば、好まない人もいます。実際には、リクエスト形式自体の400
不正な構文を示しているからです。
HTTP プロトコルの WebDAV 拡張である検証エラーを好む人も422 Unprocessable Entity
いますが、それでも技術的には完全に許容できます。
他の人は、HTTP プロトコルで使用されていないエラー ステータス コードの 1 つを取るべきだと考えています461
。Twitter は、(とりわけ)420 Enhance Your Calm
レート制限されていることをクライアントに通知するために、(表面的には)受け入れられる (そして推奨される) ステータス コード429 Too Many Requests
が既に存在していても、それを行っています。
などなど、すべて哲学の問題です。
について500 Internal Server Error
も同じことが当てはまります - すべての種類のエラー応答に対して完全に問題ないと考える人もいれば、エラーは例外でのみ5xx
返されるべきだと考える人もいます (本当の意味で - つまり、例外的なエラー)。エラーが本当に例外的なものである場合、ほとんどの場合、実際の例外情報を渡す機会がなく、サーバーについて多くのことが明らかになる可能性があります。
JSON の結果で何を (もしあれば) 返すべきか? 同じこと...
応答
200 OK
エラーが発生しなければ、たとえばリソースを削除する要求に応答するのに十分な場合があります。同様に、404 Not Found
削除するエンティティが見つからなかったため、要求された削除を実行できなかったことをクライアントに伝えるだけで十分です。それ以外の場合は、それ以上が必要になる場合があります。
応答ヘッダーに必要な情報をできるだけ多く含める必要があると考える人もいますが、多くの場合、ヘッダーのみの空の応答になります。たとえば、作成時に201 Created
、作成されたエンティティの ID を返して (リソース URI として) に配置しContent-Location
ます。応答コンテンツは必要ありません。
個人的には、パブリック API を作成する場合は、コンテンツが多少冗長であっても、適切なヘッダーとコンテンツの両方を返すことをお勧めします。すなわち:
HTTP/1.1 404 Not found
Content-Type: application/json; charset=utf-8
...
{
'Success': false,
'Message': 'The user Mr. Gone wasn't found.'
}
(実際にはSuccess
プロパティを含めませんが、API を設計するときの私の考え方によっては、含めたいと思うかもしれません)。
DEBUG モードで実行する場合、内部サービス呼び出しの文字列表現 ('Request': 'GetUser { id: 5 }'
タイムスタンプやスタック トレースなど) も含めます。とはいえ、それはすべて都合の問題です。に基づいて、適切なユーザー フレンドリーなエラー メッセージを使用してクライアントをコーディングするのは簡単です404 Not found
。ただし、その他のエラー (検証など) には、より多くのコンテキストが必要な場合があります。例えば:
HTTP/1.1 422 Validation Error
Content-Type: application/json; charset=utf-8
...
{
'Success': false,
'Message': 'The request had validation errors.',
'Errors':
{
'UserName': 'The user name must be provided.',
'Email': 'The email address is already in use.'
}
}
ServiceStack.NET はデフォルトでこのようなことを行いますが、プロパティとコンテンツが若干異なります。Microsoft 独自の Web API フレームワークも同様のことを行います。関連する質問にリンクされている JSend 仕様は、別のバリエーションです。
等々。
要するに、いいえ、普遍的な慣習はありません - 少なくともまだです。多くの人 (私よりも多くのことを考えている) がそれに取り組んでいます。しかし、それでも、決してないかもしれません。そして、あなたの方法は完全に受け入れられます。
(はい、これは非常に長くなりました - ほとんどの場合、私はしばらくの間、同じ種類の「普遍的な慣習」を探し回っていたからです)。
ステータス コードの詳細については、これが優れた記事です (ここで引用するには長すぎます)。