jquery 如果SpringMVC控制器方法不返回值,返回什么?

aoyhnmkz  于 2023-03-07  发布在  jQuery
关注(0)|答案(7)|浏览(353)

我正在使用jQuery的$.getJSON()异步调用我的简单Spring MVC后端。

@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(...) {
    ...
}

如果没有,这里应该使用什么语法?

oiopk7p5

oiopk7p51#

你可以返回void,然后你必须用@ResponseStatus(value = HttpStatus.OK)标记这个方法,你不需要@ResponseBody

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

只有get方法隐式返回200状态码,所有其他方法都执行以下三项操作之一:

  • 返回void并将方法标记为@ResponseStatus(value = HttpStatus.OK)
  • 返回一个对象并用@ResponseBody标记它
  • 返回HttpEntity示例
s8vozzvw

s8vozzvw2#

您可以简单地返回带有适当标头的ResponseEntity:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
to94eoyn

to94eoyn3#

您可以返回“ResponseEntity”对象。使用“ResponseEntity”对象在构造响应对象(包含响应主体和HTTP状态代码)时以及从响应对象获取信息时都非常方便。
getHeaders()、getBody()、getContentType()、getStatusCode()等方法使阅读ResponseEntity对象的工作变得非常容易。
应使用HTTP状态代码为204(无内容)的ResponseEntity对象,该代码专门用于指定请求已得到正确处理,并且响应正文故意为空。使用适当的状态代码来传达正确的信息非常重要,尤其是在您要创建一个将由多个客户端应用程序使用的API时。

w9apscun

w9apscun4#

是的,您可以将@ResponseBody与void返回类型一起使用:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
e5nszbig

e5nszbig5#

但是随着你的系统在大小和功能上的增长...我认为总是返回一个json并不是一个坏主意,更多的是一个架构/“大规模设计”的问题。
您可以考虑总是返回一个具有两个已知字段的JSON:其中code是指定要完成的操作的成功的数字代码,并且data是与所请求的操作/服务相关的任何附加数据。
拜托,当我们使用后端服务提供商时,任何服务都可以被检查,看看它是否运行良好。
所以我坚持,不要让spring管理这个,公开混合返回操作(一些返回数据,其他什么都没有...).. instaed确保你的服务器公开一个更同质的接口。

tjrkku2a

tjrkku2a6#

返回一个void @ResponseBody并没有什么错,对于POST请求应该这样做。
使用HTTP状态码来定义异常处理例程中的错误,而不是像其他人提到的成功状态。一个普通的方法将返回一个响应代码200,这是你想要的,任何异常处理程序都可以返回一个错误对象和一个不同的代码(即500)。

zbq4xfa0

zbq4xfa07#

HttpStatus是必需的。

@ResponseStatus(value = HttpStatus.OK)
public void update(...) {
    ...
}

或具有空主体和空标头的ResponseEntity。

public ResponseEntity<Void> delete(@PathVariable Long id) {
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

相关问题