Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено? / 25 сообщений из 58, страница 1 из 3
11.02.2019, 22:07
    #39772528
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Всем, привет!
Есть код (не мой), сейчас появилась задача запретить некое действие над объектом, который в коде получен по id.
Например, Task с неким статусом isRunning == true.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	@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), но описание у него кажется, что не подходит сюда.
...
Рейтинг: 0 / 0
11.02.2019, 22:09
    #39772529
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
упс, я тут что-то в коде намутил))
return new ErrorMessage(e.getMessage());
когда e не определена, писал прямо тут в поле сообщения.
Но это не сильно важно, простите)
...
Рейтинг: 0 / 0
11.02.2019, 22:46
    #39772536
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Nixic, верните ResponseEntity с кодом 451, допустим, или 423. И вообще, всегда возвращайте ResponseEntity )
...
Рейтинг: 0 / 0
12.02.2019, 07:39
    #39772581
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))
...
Рейтинг: 0 / 0
12.02.2019, 09:42
    #39772617
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Petro123Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))

по-моему, я впервые понял Петро и да, лучше ограничить кол-во HttpStatus`ов, которые может вернуть сервис и не использовать экстравагантные. Самое простое, изучить чей нибудь публичный api. Для примера, можно взять api github`а.
...
Рейтинг: 0 / 0
12.02.2019, 10:24
    #39772639
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Озверинпо-моему, я впервые понял)))
Прогресс у кого, у тебя или у меня?)))))
Наверно у IT индустрии)
...
Рейтинг: 0 / 0
12.02.2019, 22:15
    #39773077
maxkar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
NixicСам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.
Нет, 406 явно неприемлемо для данного случая, оно строго про заголовки запроса (и вообще в основном только про Accept). Ваш случай скорее 409 Conflict. У вас действие "запрещено в данном состоянии объекта". Может быть еще 423/424, но я бы сам взял 409. Ну и объект с описанием/статусом/чем угодно в ответе тоже будет полезно вернуть.
...
Рейтинг: 0 / 0
13.02.2019, 19:30
    #39773556
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Спасибо всем, было интересно почитать варианты и мнения :)
В итоге, не поленился и переписал контроллеры(хорошо, что их там не много) и сделал возврат объекта со статусом 200 и полем success = false.
Обработал на клиенте, кинул в интерфейс соответствующее сообщение из этого же объекта в респонсе :)
...
Рейтинг: 0 / 0
13.02.2019, 22:23
    #39773619
cossack5
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
NixicСпасибо всем, было интересно почитать варианты и мнения :)
В итоге, не поленился и переписал контроллеры(хорошо, что их там не много) и сделал возврат объекта со статусом 200 и полем success = false.
Обработал на клиенте, кинул в интерфейс соответствующее сообщение из этого же объекта в респонсе :)
Уж не знаю, хорошо ли, т.к. возврат http 200 при ошибке - довольно холиварная тема см. ответ на so .
...
Рейтинг: 0 / 0
13.02.2019, 22:49
    #39773623
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
cossack5http 200 при ошибкестакан полуналитый или полупустой? Можно спорить вечно.
...
Рейтинг: 0 / 0
14.02.2019, 09:26
    #39773687
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Nixic возврат объекта со статусом 200 и полем success = false.
Звучит как "Я жив, но умер."
...
Рейтинг: 0 / 0
14.02.2019, 09:38
    #39773696
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
SQL2008Nixic возврат объекта со статусом 200 и полем success = false.
Звучит как "Я жив, но умер."))).
Не. Оптимистично: "я сходил в магазин. Хлеба нету"))))
...
Рейтинг: 0 / 0
14.02.2019, 11:27
    #39773750
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
SQL2008Nixic возврат объекта со статусом 200 и полем success = false.
Звучит как "Я жив, но умер."
Я жив, но умер. И вот на всякий случай мои данные:
Код: javascript
1.
2.
3.
4.
{"success":"false",
"value":{"name": "Nixic", "age": "12", "weigth": "125"},
"message": "Не возможно удалить"
...}


На самом деле, если писать правильно, то надо было сразу на клиенте писать что-то, что обрабатывало бы ошибки, но так как здесь хрен пойми что и как, то хотя бы так, уже лучше чем было)
...
Рейтинг: 0 / 0
14.02.2019, 11:58
    #39773772
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Nixic
Код: javascript
1.
"value":{"name": "Nixic", "age": "12", "weigth": "125"},

почему не:
ID:134 и всё?
...
Рейтинг: 0 / 0
14.02.2019, 16:59
    #39773962
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Petro123Nixic
Код: javascript
1.
"value":{"name": "Nixic", "age": "12", "weigth": "125"},

почему не:
ID:134 и всё?
Чтобы потом по ID не отправлять запрос еще раз на сервер если понадобятся данные :)
...
Рейтинг: 0 / 0
14.02.2019, 17:03
    #39773965
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
К слову, респонс в value может возвращать значение в json формате сформированного из java объекта любого типа.
SuccessResponseImpl
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
}

...
Рейтинг: 0 / 0
14.02.2019, 17:55
    #39773994
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Petro123Nixic,
Если это какой нибудь rest api, то вполне можно отдать json с кодом 200 и уже в json есть стандарт описания ошибки. Кратко и длинно.
Это если запрет входит в бизнес логику работы клиента. Т.е. обычное дело.
Иначе по безопасности можно вернуть код ошибки не из HTTP.Error для исключения взлома и подбора, брутфорса.
Ну и http.error тоже можно.
...
Можно ведь сказать что запрет ни при чем и это вовсе не запрет а статус Занято))
да отлично ты запросил ентити а тебе прилетает 200 и нот фаунд в бади.
...
Рейтинг: 0 / 0
14.02.2019, 18:42
    #39774030
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
andreykaT,
Ты в моем ответе способен прочитать 4 варианта проектов?
А против того что ты восстал (Одного из 4-х) использует яндекс и гугл api.
...
Рейтинг: 0 / 0
14.02.2019, 19:37
    #39774075
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Боженька миловал от юза яндекса и гугла. зато наюзался амазона. может у яндекса и гугла пишут профи но амазон пишут проклятые кривые индусы. гугл думаю тоже. яндекс наверное нет. у них такие зарплаты что индусы туда работать не пойдут.

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

зы. я не восстал но в холиваре на тему 200 саксесс фалс я, пожалуй, займу сторону против хотя браузерщики например, рыдают если им присылаешь 404 и что-то в бади. они говорят что распарсить или обработать "правильно" не могут потому что 404 у них "по особому" обрабатывается.
...
Рейтинг: 0 / 0
14.02.2019, 20:14
    #39774095
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
NixicИли вообще это всё дичь, мрак и прошлый век и так больше не делают и всё нафиг переписать? ))))
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.406 - это когда клиент в заголовке Accept что-то написал, а сервер ему так ответить не может, больше 409 подходит, однако как выше написали лучше 200 с правильным пейлоадом: коды ошибок в HTTP - это прошлый век и они реально никакие кейсы не покрывают
...
Рейтинг: 0 / 0
15.02.2019, 06:08
    #39774190
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
... но статусные коды HTTP-протокола позволяют работать (произвольному) балансировщику нагрузки, а выпендрёж с "ошибка в теле успешного отклика" - нет.
...
Рейтинг: 0 / 0
15.02.2019, 07:44
    #39774197
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Basil A. Sidorov,

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

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

Заход с другой стороны: мы делаем нагрузочное тестирование и все наши "выдуманные" 4xx в отчетах будут фигурировать как ошибки, тоже так себе тема.
...
Рейтинг: 0 / 0
15.02.2019, 08:59
    #39774217
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Андрей ПанфиловBasil A. Sidorov,


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

.

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


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

- 403 как бе для таких случаев
...
Рейтинг: 0 / 0
15.02.2019, 09:00
    #39774219
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Андрей ПанфиловЗаход с другой стороны: мы делаем нагрузочное тестирование и все наши "выдуманные" 4xx в отчетах будут фигурировать как ошибки, тоже так себе тема.


Это какой-то надуманный кейс - если у вас проходит нагрузачное тестирование то и логи у вас не продакшн будут. Или в чем проблема?
...
Рейтинг: 0 / 0
15.02.2019, 10:01
    #39774242
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено?
Андрей ПанфиловNixicИли вообще это всё дичь, мрак и прошлый век и так больше не делают и всё нафиг переписать? ))))
Сам предполагаю, что ближе всего SC_NOT_ACCEPTABLE (406), но описание у него кажется, что не подходит сюда.406 - это когда клиент в заголовке Accept что-то написал, а сервер ему так ответить не может, больше 409 подходит, однако как выше написали лучше 200 с правильным пейлоадом: коды ошибок в HTTP - это прошлый век и они реально никакие кейсы не покрывают

если отказываться от "одного" рест подхода, то и методы типа post, put, delete - тоже нет смысла использовать. Переходите на json rpc - не парьтесь: все запросы post с нагрузкой.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Какой код ответа вернуть в HttpServletResponse, если действие над объектом запрещено? / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]