【问题标题】:JAX RS POST API not supporting HEAD requestJAX RS POST API 不支持 HEAD 请求
【发布时间】:2026-01-25 15:50:01
【问题描述】:
根据泽西岛的文档,
默认情况下,JAX-RS 运行时将自动支持 HEAD 和 OPTIONS 方法,如果没有显式实现的话。对于 HEAD,运行时将调用实现的 GET 方法(如果存在)并忽略响应实体(如果设置)。对于 OPTIONS,Allow 响应标头将设置为资源支持的 HTTP 方法集。此外,Jersey 将返回描述资源的 WADL 文档。
那么,如果我有一个 Jersey POST API,它会不支持 HEAD 调用吗?在我的例子中,它只支持OPTIONS 调用,它返回允许的方法为POST 和OPTIONS。您如何支持HEAD calll?
【问题讨论】:
标签:
java
rest
jersey
http-headers
jax-rs
【解决方案1】:
你给出的报价回答了你问题的一半:
对于 HEAD,运行时将调用已实现的 GET 方法(如果存在)并忽略响应实体(如果设置)。
因此,要在您的 enpoint 上启用 HEAD 方法,您有两个选择:
- 实现 GET 和 Jersey 会自动提供 HEAD 的默认实现
- 显式实现 HEAD
POST 方法不能用于提供默认 HEAD 实现的原因是 POST 方法既不安全也不幂等(如 HTTP 标准中所定义)。这意味着如果有人调用 POST 方法,他们必须假设它会对应用程序/资源状态产生影响。另一方面,GET 和 HEAD 都是安全且幂等的,因此它们不能更改状态。
回答您问题的第二部分 - 实现 HEAD 与实现其他 HTTP 方法没有区别:
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("api/ping")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String ping() {
return "pong!";
}
@HEAD
public Response getHeaders() {
return Response.status(200).
header("yourHeaderName", "yourHeaderValue").build();
}
}