URL-адрес RESTful: PUT или POST для одной записи

Я понимаю разницу между PUT (обновление) и POST (создание). Я использую Ларавель. Я хотел бы знать, что бы вы использовали для примера ниже:

domain.com/users/1/reports

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

GET domain.com/users/1/reports

Теперь я должен использовать PUT или POST для обновления этого отчета. PUT требует идентификатор, который я не считаю необходимым, поскольку у них будет только 1 отчет, например:

PUT domain.com/users/1/report/12

Поэтому я думаю использовать только POST, чтобы доменное имя было чище.

POST domain.com/users/1/report 

person user742736    schedule 16.05.2014    source источник


Ответы (2)


Как правило, запрос PUT используется для обновления существующих записей, а запрос POST используется для создания новых записей. POST также можно использовать для обновления, но это зависит от того, насколько вы хотите придерживаться соглашений.

Используемый метод http на самом деле не имеет никакого значения в отношении точной природы запрашиваемого ресурса, просто GET предназначен для чтения, а PUT, POST, PATCH и DELETE — для записи.

Если есть только один отчет, нет необходимости указывать идентификатор в uri, поэтому /users/{id}/report будет достаточно. Затем вы можете просто получить доступ к отчету следующим образом:

$user = User::with('report')->find($id);
$report = $user->report;

Это будет означать, что вам придется переопределить методы маршрута по умолчанию, которые использует laravel, но в качестве лучшей практики вы должны привыкнуть определять все свои маршруты, а не полагаться на значения по умолчанию laravel.

person ollieread    schedule 16.05.2014

Если может быть только один отчет, его следует получить как GET domain.com/users/1/report и обновить, что будет тот же маршрут PUT domain.com/users/1/report.

PUT метод не требует идентификатора объекта, если может быть только один. Я бы придерживался этого, поскольку он поддерживает PUT идемпотентность.

Метод POST не является идемпотентным, т. е. POST несколько раз на одном и том же маршруте с одними и теми же аргументами каждый раз дает разные результаты, например создает несколько отчетов для этого пользователя.

Идемпотентность — хороший способ добиться понимания PUT и POST.

person Sergey Telshevsky    schedule 16.05.2014
comment
В Laravel PUT требуется идентификатор laravel.com/docs/controllers#resource-controllers. Как мне обойти это? - person user742736; 16.05.2014
comment
Это не означает, что вы не можете переопределить его в файле routes.php. Контроллеры ресурсов в Laravel — это помощник для меньшего написания, а не постоянная, неповрежденная эмпирическая система. - person Sergey Telshevsky; 16.05.2014
comment
@user742736 user742736, если я правильно понимаю, вам не обязательно иметь параметр {resource} по умолчанию - person Sergey Telshevsky; 16.05.2014