JAX RS POST API不支持HEAD请求

时间:2016-11-07 11:38:01

标签: java rest jersey http-headers jax-rs

根据Jersey文档,

  
    

默认情况下,如果没有明确实现,JAX-RS运行时将自动支持HEAD和OPTIONS方法。对于HEAD,运行时将调用实现的GET方法(如果存在)并忽略响应实体(如果设置)。对于OPTIONS,Allow响应标头将设置为资源支持的HTTP方法集。此外,Jersey将返回描述资源的WADL文档。

  

因此,如果我有泽西POST API,它是否会支持HEAD来电?在我的情况下,它仅支持OPTIONS调用,该调用将允许的方法返回为POSTOPTIONS。你如何支持HEAD calll?

1 个答案:

答案 0 :(得分:2)

你给出的引用回答了你问题的一半:

  

对于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();
    }
}