REST API: параметры в адресе и в теле запроса
От: Shmj Ниоткуда  
Дата: 19.09.22 05:38
Оценка:
Как вы решаете когда параметр поместить в адрес а когда в тело запроса?

Вот такая цитата:

Например, если мы создаем REST API для обновления сведений об ученике с помощью PUT (метод HTTP), тогда URI запроса будет {server_host}/students/{student_id}а тело запроса будет таким:

{
  "id": student_id,
  "name": "student name",
  "school_name": "school name"
}


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

Ниже объясняется, почему мы не можем удалить student_id из параметров пути и тела запроса.

Тело запроса используется для отправки и получения данных через REST API. Если мы используем POST/PUT API, то на основе контракта REST API мы должны отправлять всю информацию о ресурсе, потому что эти методы работают со всем ресурсом. В приведенном выше примере student_id также является частью этого ресурса, поэтому он должен присутствовать в теле запроса, иначе тело запроса сможет представлять всю информацию о ресурсе.

После удаления student_id из тела запроса у нас будет следующее тело запроса.

{
  "name": "student name",
  "school_name": "school name"
}


Представляет ли это тело запроса всю информацию о ресурсах? Нет. Так что это нарушение контракта REST.

Итак, чтобы представить состояние ресурса, нам нужно отправить student_id в теле запроса, а чтобы однозначно идентифицировать ресурс, нам нужно отправить student_id в параметре пути.


Т.е. предлагается передавать и в адресе и в теле в данном случае. И вопрос такой — а если в адресе один ID а в теле другой — какую ошибку вернуть? И как это вообще трактовать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.