RESTful способ обработать обновление подробных записей - PullRequest
0 голосов
/ 08 мая 2018

Если мне нужно обновить много строк подробностей, мой метод контроллера Web API может выглядеть следующим образом, используя стиль RPC:

[Route("api/updateAccountDetailStatus")]
[HttpGet]
public IHttpActionResult UpdateAccountDetailStatus(int accountId, string status)

Это приведет к изменению всех строк сведений, связанных с этой учетной записью, на новый статус.

В попытке использовать подход RESTful, я предполагаю, что это будет что-то вроде этого:

PATCH /accounts/110
{
  "status": "hold"
}

[Route("api/accounts/id")]
[HttpGet]
public IHttpActionResult Account(Account account)

Что мне не нравится в этом, так это то, что метод контроллера API должен опросить объект, чтобы увидеть, как с ним работать. В этом случае это приведет к изменению всех строк сведений на этот новый статус. Но что если кто-то вызовет этот патч и отправит другое свойство для изменения? Теперь я должен изменить поведение на основе этого? Есть ли лучший способ?

1 Ответ

0 голосов
/ 08 мая 2018

Я вижу загадку.С одной стороны, вы хотели бы остаться верным и не указывать имена действий (изменить, обновить и т. Д.) В своем URI, а с другой стороны, это специальная процедура, а на самом деле не совсем PATCH.

Итак, для этой статьи я проделал определенную работу, чтобы позволить определению действия по типу отправленного сообщения, даже создал способ сделать это в Web API.

Пример кодаэто здесь .

По существу вы выставляете их как POST или PUT (в зависимости от того, являются ли они идемпотентными или нет), и у ресурса будет несколько POST или PUT против него.Например:

GET /api/InventoryItem [gets all items]
GET /api/InventoryItem/{id} [gets detail of a single item]
POST /api/InventoryItem [creates an item]
POST /api/InventoryItem/{id}* [checks in stock items to the inventory]
POST /api/InventoryItem/{id}* [removes stock items from the inventory]
PUT /api/InventoryItem/{id} [renames an item]
DELETE /api/InventoryItem/{id} [de-activates an item]

Это единственное решение, которое у меня было до сих пор для этих типов ресурсов.

UDPATE

Существенно, вы бы выставили это как PUT (так какЯ полагаю, что это идемпотент) при api/accounts/id отправке полезной нагрузки, обозначающей тип сообщения:

PUT api/accounts/id

{"detailBatchStateChange": "hold"}
...