Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
Всем, привет!
Есть код (не мой), сейчас появилась задача запретить некое действие над объектом, который в коде получен по id.
Например, Task с неким статусом isRunning == true.
	@RequestMapping(path = "/task", method = RequestMethod.DELETE, produces = MediaType.APPLICATION_JSON_VALUE)
	public ResponseOrError deleteTask(@RequestParam String taskId,
									  HttpServletResponse response) {
		try {
                        // вот здесь, допустим проверяем, что мол наша Task не может быть удалена и делаем return
                        Task currentTask = new Task(taskId);
                        if(currentTask.isRunning) {
                            response.setStatus(HttpServletResponse.КАКОЙ_ТО_КОД_ОШИБКИ);
                            return new ErrorMessage(e.getMessage());
                        }
			scheduleExecService.deleteTask(taskId);
			scheduleService.deleteTask(host, sid, taskId, projectName);
		} catch (AppException e) { 
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return new ErrorMessage(e.getMessage());
		}  
               // ну и тут всякие другие кетчи :)
		return new SuccessMessage();
	}

Меня самого смущает такая конструкция метода, но если её оставлять, то есть не переписывать, чтобы возвращался какой-нибудь объект в виде json со статусом(success=true/false), с кодом(например 200), со значение(value) в виде объекта, ну и с чем-нибудь.
То какой тогда здесь подставить код будет правильнее? (КАКОЙ_ТО_КОД_ОШИБКИ в коде выше)
Список здесь https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpServletResponse.html

Или вообще это всё дичь, мрак и прошлый век и так больше не делают и всё нафиг переписать? ))))
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.
11 фев 19, 22:07    [21806880]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
упс, я тут что-то в коде намутил))
return new ErrorMessage(e.getMessage());
когда e не определена, писал прямо тут в поле сообщения.
Но это не сильно важно, простите)
11 фев 19, 22:09    [21806882]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Nixic, верните ResponseEntity с кодом 451, допустим, или 423. И вообще, всегда возвращайте ResponseEntity )
11 фев 19, 22:46    [21806897]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))
12 фев 19, 07:39    [21806999]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Petro123
Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))


по-моему, я впервые понял Петро и да, лучше ограничить кол-во HttpStatus`ов, которые может вернуть сервис и не использовать экстравагантные. Самое простое, изучить чей нибудь публичный api. Для примера, можно взять api github`а.
12 фев 19, 09:42    [21807065]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
Озверин
по-моему, я впервые понял
)))
Прогресс у кого, у тебя или у меня?)))))
Наверно у IT индустрии)
12 фев 19, 10:24    [21807101]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
maxkar
Member

Откуда:
Сообщений: 150
Nixic
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.

Нет, 406 явно неприемлемо для данного случая, оно строго про заголовки запроса (и вообще в основном только про Accept). Ваш случай скорее 409 Conflict. У вас действие "запрещено в данном состоянии объекта". Может быть еще 423/424, но я бы сам взял 409. Ну и объект с описанием/статусом/чем угодно в ответе тоже будет полезно вернуть.
12 фев 19, 22:15    [21807883]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
Спасибо всем, было интересно почитать варианты и мнения :)
В итоге, не поленился и переписал контроллеры(хорошо, что их там не много) и сделал возврат объекта со статусом 200 и полем success = false.
Обработал на клиенте, кинул в интерфейс соответствующее сообщение из этого же объекта в респонсе :)
13 фев 19, 19:30    [21808887]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
cossack5
Member

Откуда:
Сообщений: 413
Nixic
Спасибо всем, было интересно почитать варианты и мнения :)
В итоге, не поленился и переписал контроллеры(хорошо, что их там не много) и сделал возврат объекта со статусом 200 и полем success = false.
Обработал на клиенте, кинул в интерфейс соответствующее сообщение из этого же объекта в респонсе :)

Уж не знаю, хорошо ли, т.к. возврат http 200 при ошибке - довольно холиварная тема см. ответ на so.
13 фев 19, 22:23    [21808974]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
cossack5
http 200 при ошибке
стакан полуналитый или полупустой? Можно спорить вечно.
13 фев 19, 22:49    [21808982]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
SQL2008
Member

Откуда:
Сообщений: 3693
Nixic
возврат объекта со статусом 200 и полем success = false.

Звучит как "Я жив, но умер."
14 фев 19, 09:26    [21809092]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
SQL2008
Nixic
возврат объекта со статусом 200 и полем success = false.

Звучит как "Я жив, но умер."
))).
Не. Оптимистично: "я сходил в магазин. Хлеба нету"))))
14 фев 19, 09:38    [21809102]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
SQL2008
Nixic
возврат объекта со статусом 200 и полем success = false.

Звучит как "Я жив, но умер."

Я жив, но умер. И вот на всякий случай мои данные:
{"success":"false",
"value":{"name": "Nixic", "age": "12", "weigth": "125"},
"message": "Не возможно удалить"
...}

На самом деле, если писать правильно, то надо было сразу на клиенте писать что-то, что обрабатывало бы ошибки, но так как здесь хрен пойми что и как, то хотя бы так, уже лучше чем было)
14 фев 19, 11:27    [21809232]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
Nixic
"value":{"name": "Nixic", "age": "12", "weigth": "125"},
почему не:
ID:134 и всё?
14 фев 19, 11:58    [21809271]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
Petro123
Nixic
"value":{"name": "Nixic", "age": "12", "weigth": "125"},
почему не:
ID:134 и всё?

Чтобы потом по ID не отправлять запрос еще раз на сервер если понадобятся данные :)
14 фев 19, 16:59    [21809703]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1848
К слову, респонс в value может возвращать значение в json формате сформированного из java объекта любого типа.
+ SuccessResponseImpl
public class SuccessResponseImpl<R> implements SuccessResponse {

	private R value;
	private boolean success;
	private String message;

	public SuccessResponseImpl(R value) {
		this.success = true;
		this.value = value;
	}

	public SuccessResponseImpl(boolean success, String message) {
		this.success = success;
		this.message = message;
	}
...
Getters and Setters
}
14 фев 19, 17:03    [21809707]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
andreykaT
Member

Откуда:
Сообщений: 1576
Petro123
Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))

да отлично ты запросил ентити а тебе прилетает 200 и нот фаунд в бади.
14 фев 19, 17:55    [21809777]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
andreykaT,
Ты в моем ответе способен прочитать 4 варианта проектов?
А против того что ты восстал (Одного из 4-х) использует яндекс и гугл api.
14 фев 19, 18:42    [21809844]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
andreykaT
Member

Откуда:
Сообщений: 1576
Боженька миловал от юза яндекса и гугла. зато наюзался амазона. может у яндекса и гугла пишут профи но амазон пишут проклятые кривые индусы. гугл думаю тоже. яндекс наверное нет. у них такие зарплаты что индусы туда работать не пойдут.

так что так себе пример )

зы. я не восстал но в холиваре на тему 200 саксесс фалс я, пожалуй, займу сторону против хотя браузерщики например, рыдают если им присылаешь 404 и что-то в бади. они говорят что распарсить или обработать "правильно" не могут потому что 404 у них "по особому" обрабатывается.
14 фев 19, 19:37    [21809907]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3016
Nixic
Или вообще это всё дичь, мрак и прошлый век и так больше не делают и всё нафиг переписать? ))))
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.
406 - это когда клиент в заголовке Accept что-то написал, а сервер ему так ответить не может, больше 409 подходит, однако как выше написали лучше 200 с правильным пейлоадом: коды ошибок в HTTP - это прошлый век и они реально никакие кейсы не покрывают
14 фев 19, 20:14    [21809940]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9005
... но статусные коды HTTP-протокола позволяют работать (произвольному) балансировщику нагрузки, а выпендрёж с "ошибка в теле успешного отклика" - нет.
15 фев 19, 06:08    [21810133]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3016
Basil A. Sidorov,

а по каким статусам балансировщик что-то балансировать собирается? Я здесь сходу могу назвать разве что 503, толку от которого не особо-то и много: чтобы взять и перебросить клиента с одной ноды на другую, он либо stateless должен быть, либо состояние между нодами должно синхронизироваться, а больше никаких полезных кодов нет (ну разве что 404 может означать что ничего не задеплоено и нужно валить отсюда, а значит в приложении 404 уже нельзя использовать).

С другой стороны, если думать о том, что если сервер сервер что-то не смог обработать, то нужно возвращать 4xx, то возникают некие проблемы с определением того, какой именно статус нужно возвратить, ну вот примеры:
- клиент прислал невалидные данные (условно не соответствуют схеме) - это какой код?
- мы запрос можем обработать, но от клиента требуется подтверждение (заголовок или еще что) - а это какой код?

Заход с другой стороны: мы делаем нагрузочное тестирование и все наши "выдуманные" 4xx в отчетах будут фигурировать как ошибки, тоже так себе тема.
15 фев 19, 07:44    [21810145]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Андрей Панфилов
Basil A. Sidorov,


С другой стороны, если думать о том, что если сервер сервер что-то не смог обработать, то нужно возвращать 4xx, то возникают некие проблемы с определением того, какой именно статус нужно возвратить, ну вот примеры:
- клиент прислал невалидные данные (условно не соответствуют схеме) - это какой код?

.


сто раз обсуждали и еще 1 раз обсудить или вы в самом деле не знаете, что принято возвращать? (на всякий пожарный, поясню, надо возвращать то, что у вас описано в api). Если же брать общую практику, то :
- валидный json, но что-то не так со схемой - 422 анпроцессибл энтити
- просто ожидаем json, а пришел какой-то xml - 400 бэд реквест
- дальше уже вариации на тему


Андрей Панфилов
- мы запрос можем обработать, но от клиента требуется подтверждение (заголовок или еще что) - а это какой код?


- 403 как бе для таких случаев
15 фев 19, 08:59    [21810178]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Андрей Панфилов
Заход с другой стороны: мы делаем нагрузочное тестирование и все наши "выдуманные" 4xx в отчетах будут фигурировать как ошибки, тоже так себе тема.


Это какой-то надуманный кейс - если у вас проходит нагрузачное тестирование то и логи у вас не продакшн будут. Или в чем проблема?
15 фев 19, 09:00    [21810180]     Ответить | Цитировать Сообщить модератору
 Re: Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Андрей Панфилов
Nixic
Или вообще это всё дичь, мрак и прошлый век и так больше не делают и всё нафиг переписать? ))))
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.
406 - это когда клиент в заголовке Accept что-то написал, а сервер ему так ответить не может, больше 409 подходит, однако как выше написали лучше 200 с правильным пейлоадом: коды ошибок в HTTP - это прошлый век и они реально никакие кейсы не покрывают


если отказываться от "одного" рест подхода, то и методы типа post, put, delete - тоже нет смысла использовать. Переходите на json rpc - не парьтесь: все запросы post с нагрузкой.
15 фев 19, 10:01    [21810228]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Java Ответить