Код состояния HTTP для ресурса пока недоступен - программирование
Подтвердить что ты не робот

Код состояния HTTP для ресурса пока недоступен

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

Как мне ответить, если кто-то попытается выкупить код раньше?

Я подозреваю, что HTTP 403, Forbidden, является правильным выбором, но затем w3c заявляет, что "запрос НЕ ДОЛЖЕН повторяться, тогда как в этом случае я ожидал бы запрос повторяется, как раз на более поздний срок.

4b9b3361

Ответ 1

409 Конфликт

Запрос не может быть выполнен из-за конфликта с текущим состояние ресурса. Этот код разрешен только в ситуациях, когда ожидается, что пользователь сможет разрешить конфликт и повторно отправьте запрос. Тело ответа ДОЛЖНО включать достаточно информацию для пользователя, чтобы узнать источник конфликта. В идеальном случае объект ответа будет содержать достаточную информацию для пользователь или пользовательский агент для устранения проблемы; однако это может не быть возможно и не требуется.

403 Запрещено имеет больше смысла, если они пытаются выкупить купон, который уже был выкуплен, хотя 410 Gone. В этой ситуации тоже элегантно.

404 Not Found не идеальна, потому что ресурс действительно существует, однако вы можете использовать его, если вы не хотите указывать причина с 403 или если вы хотите скрыть существование ресурса по соображениям безопасности.

Если вы используете HATEOAS, то вы также можете возглавить клиентов на перевале (так сказать), включив только redeem контроль гипермедиа в ресурсе купона (полученный через GET), когда купон можно выкупить; хотя это не остановит чрезмерно привязанных клиентов от попыток выкупить их в любом случае.

Ответ 2

Так как URL-адреса Rest должны представлять ресурсы, на которые я ответил бы с помощью 404 - Not Found
Ресурс доступен только между определенными датами, поэтому в любой другой день он не найден.

Ответ 3

EDIT: Благодаря некоторым хорошим критикам (см. ниже), я хочу предостеречь этот ответ. Он основан на Richardson и Ruby writeup, который, возможно, не очень хорошо связан с httpbis, написанным на 403 Запрещено. (Лично я сейчас учусь по 409, как объяснил Том в отдельном ответе.)

403 Запретный - лучший выбор. Я приведу RESTful Web Services by Richardson и Ruby по строкам. Как вы увидите, 403 отлично подходит:

Запрос клиента сформирован правильно, но сервер не хочет его выполнять.

Проверьте!

Это не просто случай недостаточных учетных данных: это будет 401 ( "Несанкционированный" ). Это больше похоже на ресурс, доступный только в определенное время или с определенных IP-адресов.

Проверьте!

Ответ 403 подразумевает, что клиент запросил ресурс, который действительно существует. Как и в случае с 401 ( "Несанкционированный" ), если сервер не хочет выдавать даже эту информацию, он может лежать и отправлять 404 ( "Не найдено" ).

Вы написали выше: "Представление" Код "доступно для GETted до его выхода в эфир". Итак, вы ничего не пытаетесь скрыть. Итак, придерживайтесь отметки 403. Проверьте!

Если запрос клиента хорошо сформирован, почему этот код состояния в серии 4xx (ошибка на стороне клиента) вместо серии 5xx (ошибка на стороне сервера)? Поскольку подача делала это решение на основе какого-либо аспекта запроса, отличного от его формы; например, время суток, когда запрос был сделан.

Проверьте! Запрос клиента был скорректирован, но это было неуместно для конкретного времени.

Мы отправились четыре на четыре. Код 403 является победителем. Никакие другие коды не совпадают.

Все это говорит о том, что простой, неспецифический 400 не был бы неправильным, но не был бы таким конкретным или полезным.

Другой ответ предложил код конфликта 409. Хотя стоит подумать, это не так хорошо подходит. Вот почему. По словам Ричардсона и Руби снова:

Получение этого ответа [409] означает, что вы пытались перевести серверные ресурсы в невозможное или непоследовательное состояние. Amazon S3 дает этот код ответа, когда вы пытаетесь удалить ведро, которое не пусто.

Заявка на продвижение до того, как она будет "активной", не "помещает ресурс сервера в несогласованное состояние". Это нарушит некоторые бизнес-правила - и приведет к обману - но это не вызовет логического противоречия, которое я вижу.

Итак, осознали ли вы это в начале вопроса или нет, 403 - отличный выбор.:)

Ответ 4

Когда он говорит, что запрос "НЕ ДОЛЖЕН быть повторен", он ссылается на сообщение, которое вы должны отправить наблюдателю.

Это не имеет никакого отношения к тому, повторяется ли фактический запрос. (Пользователь будет получать одно и то же сообщение 403 снова и снова, если он того пожелает.)

Тем не менее, 404 не подходит для этого, потому что ресурс доступен - просто чтобы код не был выкуплен/запрещен для выкупа. Это на самом деле вредно, потому что он сообщает пользователю, что вы, вероятно, допустили ошибку в настройке URL-адреса или сервера.

Конечно, это предполагает, что в соответствующую дату вы вернете 200 вместо.