Я думаю, что одна из проблем заключается в том, что вы поддерживаете состояние приложения на сервере (сеанс пользователя, который содержит идентификатор пользователя). Это делает это намного сложнее, чем нужно, и нарушает ограничение безгражданства REST.
В случае A вы указали URI для операций, что опять-таки не RESTful. URI идентифицируют ресурсы, и переходы между состояниями должны выполняться с использованием единого интерфейса, который является общим для всех ресурсов. Я думаю, что Дело B намного лучше в этом отношении.
Итак, имея в виду эти две вещи, я бы предложил что-то вроде:
PUT /api/v1/resource/:id/likes/:userid
DELETE /api/v1/resource/:id/likes/:userid
У нас также есть дополнительное преимущество в том, что пользователь может зарегистрировать только одно «Мне нравится» (они могут повторять это «Мне нравится» столько раз, сколько ему хочется, и, поскольку PUT
является идемпотентом, он имеет один и тот же результат, независимо от того, как много раз это выполнялось). DELETE
также идемпотентен, поэтому, если операция «В отличие» повторяется много раз по какой-то причине, система остается в согласованном состоянии. Конечно, вы можете реализовать POST
таким образом, но если мы используем PUT
и DELETE
, мы увидим, что правила, связанные с этими глаголами, похоже, действительно хорошо подходят для нашего варианта использования.
Я также могу представить еще один полезный запрос:
GET /api/v1/resource/:id/likes/:userid
Это вернуло бы детали «Like», такие как дата, когда было сделано, или порядковый номер (то есть «Это был 50-й подобный!»).