JAX RS POST API不支持HEAD请求

问题描述:

作为每泽西文档,JAX RS POST API不支持HEAD请求

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

所以,如果我有一个新泽西POST API,将它不支持HEAD电话吗?在我的情况下,它只支持OPTIONS呼叫,它返回允许的方法为POSTOPTIONS。你如何去支持HEAD calll?

你给了一半的答案你的问题的名言:

对于HEAD运行时将调用实现GET方法(如果存在的话),并忽略响应实体(如果设置)。

所以以启用enpoint HEAD方法,你有两个选择:

  • 实现GET和泽西会自动提供HEAD
  • 的默认实现执行HEAD明确

POST方法不能用于提供默认HEAD实现的原因是POST方法既不安全也不幂级(如HTTP标准中定义的)。这意味着如果有人调用POST方法,他们必须假定它会对应用程序/资源状态产生影响。另一方面,GET和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(); 
    } 
}