2015-08-28 67 views
0

我正在使用Apache CXF Jax-RS来实现RESTfull服务。我实现了一个GET调用如下图所示:为什么Apache CXF-Jax RS允许'GET'请求占用'HEAD'请求?

@GET 
@Path("getSomething") 
@Produces("application/xml") 
public String getSomething() { 
    return null; 
} 

这是工作为我好,但一个错误上引发这个测试仪能够使用该服务的操作与HEAD请求(POST和其他调用失败后)。我做了一些研究,发现HEAD请求与GET类似,唯一的区别是它不返回正文。所以我有几个关于这个问题。

1)为什么JAX RS允许使用@GET注释的操作接收HEAD请求,而它有一个单独的@HEAD注释可用?

2)难道这会导致什么样的问题在我的应用

3)如果我不允许@ GET操作采取@HEAD操作,我能我做到这一点?

回答

1

1)它是在定义JAX-RS 1.0

HEADOPTIONS请求接收额外的自动支持。在接收到HEAD请求的实现必须:

  1. 来电HEAD或与请求方法指示符注释的方法,如果没有本,
  2. 呼叫与请求方法指示符注释为GET和丢弃的方法任何返回的实体。

请注意,选项2可能导致实体创建显着时的性能下降。

2)不,因为你的方法是安全的,请参阅Wikipedia

GET方法是一种安全的方法(或nullipotent),这意味着调用它不会产生任何副作用。换句话说,检索或访问记录不会改变它。

3)你可以注释的另一种方法与HEAD,看到Jersey 2.22 User Guide

默认情况下,JAX-RS运行时会自动支持方法HEADOPTIONS,如果没有明确落实。