【问题标题】: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 调用,它返回允许的方法为POSTOPTIONS。您如何支持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();
        }
    }
    

    【讨论】: