Каков наилучший способ обработки свойств ресурса, которые необходимо изменить/обновить с помощью другого метода, который не подвергается воздействию пользователя API?
Примеры:
-
Запрос нового токена, используемого для X. Маркер должен быть сгенерирован после определенного набора бизнес-правил/логики.
-
Запрос/обновление обменного курса валюты после истечения срока действия старой ставки. Эта ставка предназначена для информационных целей и будет использоваться в последующих транзакциях.
Обратите внимание, что в приведенных выше двух примерах значения являются свойствами ресурса, а не отдельными ресурсами сами по себе.
Какой лучший способ справиться с этими типами сценариев и другими сценариями, когда потребитель API не контролирует значение свойства, но требует запроса нового. Один из вариантов заключается в том, чтобы разрешить PATCH
с этим конкретным свойством в теле запроса, но фактически не обновлять свойство до указанного значения, вместо этого запустить необходимую логику для обновления свойства и возврата обновленного ресурса.
Давайте посмотрим на № 1 более подробно:
Запрос
GET /User/1
ответ
{
"Id": 1,
"Email": "[email protected]",
"SpecialToken": "12345689"
}
Как потребитель API, я хочу иметь возможность запросить новый SpecialToken
, но бизнес-правила для создания токена мне не видны.
Как сообщить API, что мне нужна новая/обновленная SpecialToken
с помощью парадигмы REST?
Можно подумать:
Запрос
PATCH /User/1
{
"SpecialToken": null
}
Сервер увидит этот запрос и узнает, что ему нужно обновить токен. Бэкэнд обновит SpecialToken
специальным алгоритмом и вернет обновленный ресурс:
ответ
{
"Id": 1,
"Email": "[email protected]",
"SpecialToken": "99999999"
}
Этот пример можно расширить до примера №2, где SpecialToken
- это обменный курс на ресурсе CurrencyTrade
. ExchangeRate
- это значение только для чтения, которое потребитель API не может изменить напрямую, но может потребовать его изменения/обновления:
Запрос
GET /CurrencyTrade/1
ответ
{
"Id": 1,
"PropertyOne": "Value1",
"PropertyTwo": "Value2",
"ExchangeRate": 1.2
}
Кому-то, потребляющему API, потребуется способ запросить новый ExchangeRate, но они не имеют контроля над тем, какое значение будет иметь значение, это строго a read only property
.