Я использую jQuery $.getJSON()
для выполнения асинхронных вызовов моего простого бэкэнда Spring MVC. Большинство методов контроллера Spring выглядят так:
@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
@RequestParam("type") String type) {
return someDAO.getSomeData(widget, type);
}
У меня все настроено так, что каждый контроллер возвращает @ResponseBody
как JSON, что и ожидает клиентская сторона.
Но что происходит, если запрос не должен возвращать какой-либо контент на стороне клиента? Можно мне:
@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
...
}
Если нет, то какой синтаксис здесь использовать?
java
jquery
spring-mvc
IAmYourFaja
источник
источник
POST
данных.Ответы:
вы можете вернуть void, тогда вам нужно пометить метод с помощью @ResponseStatus (value = HttpStatus.OK), вам не нужен @ResponseBody
Только методы get возвращают значение кода состояния 200, все остальные, которые у вас есть, делают одно из трех:
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
HttpEntity
экземпляристочник
@ResponseStatus
и не надо. Просто имея@ResponseBody
наvoid
обработчик отлично достаточно.Вы можете просто вернуть ResponseEntity с соответствующим заголовком:
источник
ResponseEntity is a raw type. References to generic type ResponseEntity<T> should be parameterized
Вы можете вернуть объект ResponseEntity. Использование объекта ResponseEntity очень удобно как во время создания объекта ответа (который содержит тело ответа и код состояния HTTP), так и во время получения информации из объекта ответа.
Такие методы, как getHeaders (), getBody (), getContentType (), getStatusCode () и т. Д., Делают работу по чтению объекта ResponseEntity очень простой.
Вы должны использовать объект ResponseEntity с кодом состояния http 204 (без содержимого), который специально указывает, что запрос был обработан правильно, а тело ответа намеренно пустое. Использование соответствующих кодов состояния для передачи правильной информации очень важно, особенно если вы создаете API, который будет использоваться несколькими клиентскими приложениями.
источник
@ResponseStatus(HttpStatus.NO_CONTENT)
решенаXML Parsing Error: no root element found
для меня в браузереДа, вы можете использовать @ResponseBody с
void
типом возврата:источник
Нет ничего плохого в том, чтобы вернуть пустоту,
@ResponseBody
и вы должныPOST
запросов.Вместо этого используйте коды состояния HTTP для определения ошибок в процедурах обработчика исключений, поскольку другие упоминают статус успеха. Обычный метод, который у вас есть, вернет код ответа,
200
который вы хотите, любой обработчик исключений может затем вернуть объект ошибки и другой код (т.е.500
).источник
Но по мере того, как ваша система растет в размере и функциональности ... я думаю, что всегда возвращать json - неплохая идея. Это скорее вопрос архитектуры / «крупномасштабного дизайна».
Вы можете всегда думать о сохранении JSON с двумя известными полями: кодом и данными. Где code - это числовой код, определяющий успех операции, которую нужно выполнить, а data - любые дополнительные данные, связанные с запрошенной операцией / услугой.
Да ладно, когда мы используем серверную часть поставщика услуг, любую услугу можно проверить, чтобы увидеть, хорошо ли она работает.
Поэтому я придерживаюсь того, чтобы Spring не справлялся с этим, выставляя гибридные операции возврата (некоторые возвращают данные, другие ничего ...). Убедитесь, что ваш сервер предоставляет более однородный интерфейс. В конце концов, это проще.
источник
Вот пример кода того, что я сделал для асинхронного метода
Вам не нужно ничего возвращать из вашего метода, все, что вам нужно, чтобы использовать эту аннотацию, чтобы ваш метод возвращал OK в каждом случае
источник