147

我正在使用 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);
}   

我设置了一些东西,以便每个控制器返回@ResponseBodyJSON,这是客户端所期望的。

但是当一个请求不应该向客户端返回任何内容时会发生什么?我能有......吗:

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

如果不是,这里使用的适当语法是什么?

4

6 回答 6

273

你可以返回 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实例
于 2012-10-11T12:43:16.973 回答
44

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

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
于 2012-10-11T12:42:26.063 回答
10

您可以返回“ResponseEntity”对象。在构造响应对象(包含响应正文和 HTTP 状态代码)和从响应对象中获取信息时,使用“ResponseEntity”对象都非常方便。

getHeaders()、getBody()、getContentType()、getStatusCode() 等方法使读取 ResponseEntity 对象的工作变得非常容易。

您应该使用带有 http 状态代码 204(无内容)的 ResponseEntity 对象,该对象专门用于指定请求已被正确处理并且响应正文故意为空白。使用适当的状态码来传达正确的信息非常重要,尤其是当您正在制作一个将被多个客户端应用程序使用的 API 时。

于 2015-08-13T18:41:01.813 回答
4

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

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
于 2015-05-19T05:53:14.583 回答
2

返回 void 并没有错,@ResponseBody您应该提出POST请求。

当其他人提到成功状态时,使用 HTTP 状态代码来定义异常处理程序例程中的错误。您拥有的普通方法将返回200您想要的响应代码,然后任何异常处理程序都可以返回错误对象和不同的代码(即500)。

于 2013-12-19T04:35:11.420 回答
1

但是随着你的系统在规模和功能上的增长......我认为总是返回一个 json 并不是一个坏主意。更多的是建筑/“大规模设计”问题。

您可以考虑始终返回具有两个已知字段的 JSON:代码和数据。其中 code 是一个数字代码,指定要完成的操作是否成功,而 data 是与请求的操作/服务相关的任何附加数据。

来吧,当我们使用后端服务提供者时,可以检查任何服务以查看它是否运行良好。

所以我坚持,不要让弹簧管理这个,公开混合返回操作(一些返回数据其他什么都没有......)..确保你的服务器公开一个更同质的接口。在一天结束时更简单。

于 2013-09-12T15:36:19.360 回答