Дизайн Routing ServiceStack

Являются ли эти 3 маршрута одинаковыми? Какой из них обычно предпочитают?

[Route("/todo/{id}", "DELETE")]
[Route("/todo/delete","POST")]
[Route("/todo/delete/{id}","GET")]
public class DeleteTodo : IReturnVoid
{
    public int Id { get; set; }
}

Большое спасибо...

Ответ 1

Предпочтительный маршрут состоит в том, чтобы включить Id в pathinfo, поскольку DELETE не имеет тела запроса HTTP, вы можете отправить эту информацию, например:

[Route("/todo/{id}", "DELETE")]
public class DeleteTodo : IReturnVoid
{
    public int Id { get; set; }
}

По прагматичным причинам вы можете разрешить POST выполнять DELETE, поскольку браузеры, которые мой по умолчанию (и некоторые прокси) не позволяют отправлять запросы DELETE.

[Route("/todo/{id}/delete", "POST")]
public class DeleteTodo : IReturnVoid
{
    public int Id { get; set; }
}

Вы можете моделировать запрос DELETE в Ajax или jQuery, добавив заголовок HTTP-запроса X-Http-Method-Override в своем вызове Ajax или в качестве поля в вашем FormData или QueryString, например

POST /todo/1
X-Http-Method-Override=DELETE 

или встроен в HTML FormData, например:

<form action="/todo/1" method="POST">
   <input type="hidden" name="X-Http-Method-Override" value="DELETE"/>
</form>

Хотя важно не разрешать DELETE через GET, так как по контракту GET не должно иметь побочных эффектов, поэтому можно безопасно кэшировать и воспроизводить HTTP-посредники, такие как прокси и т.д.

Ответ 2

Если вы хотите следовать рекомендациям REST, вы не должны использовать GET или POST для удаления ресурса.

Глагол GET используется для чтения ресурса. Важное эмпирическое правило что операция GET безопасна. То есть, это можно сделать повторно без видимого изменения состояния ресурса. Это свойство очень важно по разным причинам. Во-первых, двигатели индексирования используют GET для индексации содержимого ресурса. Поэтому было бы плохо, если бы индексирование ресурс также изменил его. Во-вторых, посредники, такие как доверенные лица, может кэшировать результаты операции GET для ускорения последующих обращений на тот же ресурс.

Глаголы PUT и DELETE позволяют запрашивать изменение состояния ресурс атомарно.

Глагол POST может нести различные значения. Это швейцарская армия Нож HTTP-глаголов. Для некоторых ресурсов он может использоваться для изменения внутреннее состояние. Для других это может быть поведение вызов процедуры.

Посмотрите на страницу для полного описания.