REST API - ресурсы, объединяющие другие ресурсы / ресурсы картирования - PullRequest
0 голосов
/ 29 июня 2018

Если я хочу придерживаться принципов REST, если у меня есть ресурс с именем students и ресурс с именем courses, я мог бы забронировать кого-то на курс, подобный этому:

PUT: api/courses/{courseId}/students/{studentId}

Инстинктивно, я хотел бы перечислить студенческие бронирования следующим образом:

GET: api/courses/{courseId}/students

Но я хотел бы включить некоторую информацию, относящуюся к бронированию (например, номер бронирования), что означает третий сопоставленный ресурс.

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

GET: api/courses/{courseId}/student-bookings

Мой вопрос: Кто-нибудь видит проблему с вышеуказанным подходом, поскольку конечная точка, которую я использую для создания бронирования, отличается от конечной точки, которую я использую для получения созданного бронирования?


edit: Еще одна альтернатива, которая мне кажется более удобной, была бы ниже, хотя это не меняет вопроса, который касается доступа к созданному ресурсу с использованием другой конечной точки, отличной от той, которая его создала:

GET: api/courses/student-bookings?courseId={courseId}

1 Ответ

0 голосов
/ 29 июня 2018

Предполагая, что я хочу быть ближе к принципам REST [...]

REST не заботится о дизайне URI. Но использование URI, который правильно идентифицирует ваши ресурсы и позволяет вашему API развиваться, считается хорошей практикой .


Я понимаю бронирование (или регистрация ) как новый ресурс со своими собственными атрибутами.

Итак, кроме /api/courses и /api/students, у меня будет /api/enrollments, который отображает отношения между курсом и студентом.

Регистрация может быть создана с помощью запроса POST, как показано ниже:

POST /api/enrollments HTTP/1.1
Host: example.org
Content-Type: application/json

{
  "course": "designing-wep-apis",
  "student": "john.doe"
}

Успешный запрос вернет 201 и Location созданной регистрации:

HTTP/1.1 201 Created
Location: /api/enrollments/20180012

Следующий запрос может использоваться для получения всех зачислений на определенный курс:

GET /api/enrollments?course=designing-wep-apis HTTP/1.1
Host: example.org
Accept: application/json

И следующее для повторного зачисления всех учащихся определенного студента:

GET /api/enrollments?student=john.doe HTTP/1.1
Host: example.org
Accept: application/json
...