Предположим, у вас есть сложный ресурс в REST API. У вас есть несколько флагов и атрибутов «один ко многим» на этом ресурсе (т. Е. Пользователь может присвоить ресурсу рейтинг от 1 до 5, или пользователь может «понравиться» ресурсу или помечен как спам или проигнорировать его или вызвал некоторое другое состояние, которое нужно установить).Каковы параметры обработки флагов и атрибутов в REST API?
Некоторые предложения были сделаны для наилучшего представления этого в ресурсо-ориентированной архитектуре, но пока никто из них не сделал меня счастливым. Так что давайте толпу-источник это; какие варианты вам легче понять? Какие варианты мы не думали? Предположим, что API, основанный на OAuth, и все здесь сделано в контексте авторизованного пользователя.
булевы Флаги
Вариант 1:
GET /resource/{id}/muted POST /resource/{id}/muted BODY:true POST /resource/{id}/muted BODY:false
Вариант 2:
GET /resource/{id}/muted PUT /resource/{id}/muted BODY:true DELETE /resource/{id}/muted
Вариант 3:
GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:muted=true POST /resource/{id}/attributes BODY:muted=false
Вариант 4:
GET /resource/{id}/muted POST /resource/{id}/mute POST /resource/{id}/unmute
Атрибуты
Вариант 1
GET /resource/{id}/rating POST /resource/{id}/rating BODY:4
Вариант 2:
GET /resource/{id}/rating PUT /resource/{id}/rating BODY:4 DELETE /resource/{id}/rating
Вариант 3:
GET /resource/{id}/attributes POST /resource/{id}/attributes BODY:rating=4 POST /resource/{id}/attributes BODY:rating=
Мысли? Предложения? Как другие API обрабатывали это? Как вы справились с этим? Вы обнаружили, что такие проблемы дизайна повлияли на счастье разработчиков или простоту использования ваших API?
Ну, это на самом деле вариант 3, но с полезной нагрузкой 'application/json' вместо полезной нагрузки' application/x-www-form-urlencoded'. Та же основная идея, но «application/x-www-form-urlencoded» лучше подходит для частичного обновления ресурса. –
Кроме того, поскольку все позади OAuth, аргумент кэширования немного слабее обычного. Клиент на получающей стороне может кэшировать, и, конечно, этот кеш будет более эффективным с большим ресурсом. Однако, с точки зрения разработчика, 95%% будет только мутировать один атрибут за раз, и не может быть сделано предположение, что тело данных, которые вы отправляете на сервер, будет соответствовать тому, что вы получаете, если сразу сделаете 'GET'. Вероятно, это исключает «PUT» в качестве опции прямо там, а также расширение «DELETE». Я доволен этим, потому что это было мое наименее любимое решение. –
Что касается недействительности кеша, можно с уверенностью сказать, что рассматриваемое приложение может только минимизировать эту проблему, а не устранять ее. Такова жизнь в масштабе. –