【问题标题】:rest/javax/jersey/grizzly: is it mandatory to return OK (200) response code for POST requests?rest/javax/jersey/grizzly:是否必须为 POST 请求返回 OK(200)响应代码?
【发布时间】:2016-01-17 02:32:00
【问题描述】:
想象一个 post REST 端点,例如:
@POST
@Path("/cbo/{param1}/{param2}")
public Response updateCbo() {
//do something
return Response.status(Response.Status.OK).build();
}
我的问题是:如果一切顺利,返回 OK 响应更好还是默认响应?我看到 GET 查询通常不会打扰返回响应,只是返回请求的内容,并且 Web 客户端确实会获取 200 OK 标头。
谢谢。
【问题讨论】:
标签:
java
rest
jersey
grizzly
【解决方案1】:
您根本不必返回响应,假设您有一个POST(或任何其他函数)类型调用,在响应请求中您想要返回一个字符串(或任何对象)如果您使用的是像 Jackson 这样的序列化程序)
你可以这样做:
@POST
@Path("/cbo/{param1}/{param2}")
public String updateCbo() {
//do something
return "My Response"
}
Jersey 将为此自动返回 200。如果将函数设置为 void,Jersey 将自动返回 204(成功 - 无内容)。
如果您希望调用失败,您可以引发异常。
【解决方案2】:
当发布到创建新资源时,一般接受的方法是发回201 Created 状态,Location 标头设置新资源的 URI。您可以在this post 中查看实现此目的的示例。
如果您只是更新一个资源,而不是 POST,通常使用 PUT 完成,而不是 201,一般的方法是在成功时发送 204 No Content。示例
@PUT
@Path("/cbo/{param1}/{param2}")
public Response updateCbo(Model updated,
@PathParam("param1") String param1,
@PathParam("param2") String param2) {
Model model = modelServive.lookup(param1, param2);
if (model == null)
return Response.notFound().build();
model = PropTranferUtils.transfer(model, updated);
modelService.update(model);
return Response.noContent().build();
}