spring Sping Boot Rest控制器如何返回不同的HTTP状态码?

hpxqektj  于 2023-11-16  发布在  Spring
关注(0)|答案(7)|浏览(151)

我正在使用Sping Boot 作为一个简单的REST API,如果出现故障,我希望返回正确的HTTP状态码。

  1. @RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
  2. @ResponseBody
  3. @ResponseStatus( HttpStatus.OK )
  4. public RestModel create(@RequestBody String data) {
  5. // code ommitted..
  6. // how do i return a correct status code if something fails?
  7. }

字符串
作为Spring和Sping Boot 的新手,基本的问题是,当某些东西正常或失败时,我如何返回不同的状态码?

vshtjzan

vshtjzan1#

有几个选项可以使用。相当好的方法是使用异常和类来处理称为@ControllerAdvice

  1. @ControllerAdvice
  2. class GlobalControllerExceptionHandler {
  3. @ResponseStatus(HttpStatus.CONFLICT) // 409
  4. @ExceptionHandler(DataIntegrityViolationException.class)
  5. public void handleConflict() {
  6. // Nothing to do
  7. }
  8. }

字符串
你也可以将HttpServletResponse传递给控制器方法,然后设置响应代码:

  1. public RestModel create(@RequestBody String data, HttpServletResponse response) {
  2. // response committed...
  3. response.setStatus(HttpServletResponse.SC_ACCEPTED);
  4. }


详情请参阅这篇伟大的博客文章:Exception Handling in Spring MVC

注意

在Spring MVC中使用@ResponseBody annotation是多余的-它已经包含在@RestController annotation中。

展开查看全部
gjmwrych

gjmwrych2#

其中一种方法是使用ResponseEntity作为返回对象:

  1. @RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
  2. public ResponseEntity<?> create(@RequestBody String data) {
  3. if(everything_fine) {
  4. return new ResponseEntity<>(RestModel, HttpStatus.OK);
  5. } else {
  6. return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
  7. }
  8. }

字符串

nnsrf1az

nnsrf1az3#

一个很好的方法是使用Spring的ResponseStatusException
而不是返回一个ResponseEntity或类似的,你只是从控制器抛出ResponseStatusExceptionHttpStatus和原因,例如:

  1. throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Cause description here");

字符串
这将导致对客户端的响应包含HTTP状态:

  1. {
  2. "timestamp": "2020-07-09T04:43:04.695+0000",
  3. "status": 400,
  4. "error": "Bad Request",
  5. "message": "Cause description here",
  6. "path": "/test-api/v1/search"
  7. }

注意HttpStatus提供了多种不同的状态码,方便您使用。

展开查看全部
knpiaxh1

knpiaxh14#

如果你想返回一个自定义的状态码,你可以使用ResponseEntity如下:

  1. @RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
  2. public ResponseEntity<?> create(@RequestBody String data) {
  3. int customHttpStatusValue = 499;
  4. Foo foo = bar();
  5. return ResponseEntity.status(customHttpStatusValue).body(foo);
  6. }

字符串
CustomHttpStatusValue可以是标准HTTP状态代码之内或之外的任何整数。

b1zrtrql

b1zrtrql5#

试试这个代码:

  1. @RequestMapping(value = "/validate", method = RequestMethod.GET, produces = "application/json")
  2. public ResponseEntity<ErrorBean> validateUser(@QueryParam("jsonInput") final String jsonInput) {
  3. int numberHTTPDesired = 400;
  4. ErrorBean responseBean = new ErrorBean();
  5. responseBean.setError("ERROR");
  6. responseBean.setMensaje("Error in validation!");
  7. return new ResponseEntity<ErrorBean>(responseBean, HttpStatus.valueOf(numberHTTPDesired));
  8. }

字符串

uqxowvwt

uqxowvwt6#

返回状态码的方法有很多种,1:RestController类应该扩展BaseRest类,在BaseRest类中我们可以处理异常并返回预期的错误码。例如:

  1. @RestController
  2. @RequestMapping
  3. class RestController extends BaseRest{
  4. }
  5. @ControllerAdvice
  6. public class BaseRest {
  7. @ExceptionHandler({Exception.class,...})
  8. @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
  9. public ErrorModel genericError(HttpServletRequest request,
  10. HttpServletResponse response, Exception exception) {
  11. ErrorModel error = new ErrorModel();
  12. resource.addError("error code", exception.getLocalizedMessage());
  13. return error;
  14. }

字符串

展开查看全部
wn9m85ua

wn9m85ua7#

我认为最简单的方法是将方法的返回类型设置为

  1. ResponseEntity<WHATEVER YOU WANT TO RETURN>

字符串
对于发送任何状态代码,只需添加return语句作为

  1. return ResponseEntity.status(HTTP STATUS).build();


例如,如果你想返回一个图书列表,

  1. public ResponseEntity<List<books>> getBooks(){
  2. List<books> list = this.bookService.getAllBooks();
  3. if(list.size() <= 0)
  4. return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
  5. else
  6. return ResponseEntity.of(Optional.of(list));
  7. }

展开查看全部

相关问题