Дизайн URL RESTful для системы дружбы

Я разработчик API в своей компании. Мы развиваем социальную сеть. Мы используем систему дружбы. Мы используем API-ориентированную систему. API, который я буду писать, будет использоваться каждой платформой, которую мы разрабатываем.

Обычно у меня есть пользовательский ресурс, и я использую таблицу дружбы для отслеживания дружбы:

+-----------+------------------+------+-----+---------------------+----------------+
| Field     | Type             | Null | Key | Default             | Extra          |
+-----------+------------------+------+-----+---------------------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL                | auto_increment |
| sourceId  | int(11)          | NO   | MUL | NULL                |                |
| targetId  | int(11)          | NO   |     | NULL                |                |
| status    | tinyint(1)       | NO   |     | 0                   |                |
| seen      | tinyint(1)       | NO   |     | 0                   |                |
| createdAt | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| updatedAt | timestamp        | NO   |     | 0000-00-00 00:00:00 |                |
| deletedAt | timestamp        | YES  |     | NULL                |                |
+-----------+------------------+------+-----+---------------------+----------------+

И теперь я пытаюсь подумать о том, как мне реализовать необходимые URI. Но я не мог понять, как я должен реализовать это точно. И я мог только придумать эту идею, и не мог ее продвигать:

Допустим, у меня есть 2 пользователя: один с username из john, а другой с username из jane.

jane хочет добавить john в друзья, и когда это делается, она отправляет POST запрос:

POST /users/john/friendships

john увидел это и хочу опровергнуть или подтвердить, для этого я придумал 2 разные идеи; 1-й это:

PUT /users/jane/friendships?action=(deny|confirm)

или 2-й:

PUT /users/jane/friendships/<friendshipId>?action=(deny|confirm)

Условно 2-й мне кажется более подходящим, но тогда я думаю, что я могу просто сделать

PUT /friendships/<friendshipId>?action=(deny|confirm)

Итак, я застрял здесь. Все, что я думаю об этом, это эти примеры. Я не думаю, что это правильные.


person Umut Sirin    schedule 04.07.2013    source источник


Ответы (1)


Джон может добавить Джейн в друзья (включая текст запроса с соответствующей информацией):

POST /users/john/friends

...или Джон может обновить некоторую информацию о своей дружбе с Джейн (опять же, с телом запроса)

PUT /users/john/friends/jane

...или Джон может удалить Джейн из друзей.

DELETE /users/john/friends/jane

person tuespetre    schedule 04.07.2013
comment
Спасибо за ответ :) Но так ли вы поступили бы, или это полностью RESTful-подход? - person Umut Sirin; 04.07.2013
comment
Что ж, ни один REST API не является полностью RESTful, потому что все они требуют предварительного знания API, где REST описывает приложение, в котором можно полностью перемещаться и использовать, начиная с корневого URI. Но варианты, на которые я ответил, касались HTTP-глаголов и лежащих в их основе концепций, а это то, к чему обычно стремятся эти API. - person tuespetre; 05.07.2013
comment
Да, после некоторого размышления, мне тоже пришло в голову использовать /friends вместо /friendships. Конечно, мне нужно провести больше исследований, прежде чем я скажу я знаю REST. В любом случае большое спасибо за ваш вклад. - person Umut Sirin; 05.07.2013
comment
Кроме того, дружбу можно считать подтвержденной, когда оба пользователя отправили сообщения друг другу своим друзьям. - person tuespetre; 05.07.2013