Jersey测试 - 带有JSON请求的Http Delete方法

时间:2016-03-30 13:50:34

标签: testing junit jersey http-delete jersey-test-framework

我正在使用Jersey Test测试Rest服务DELETE方法:

@DELETE
@Path("/myPath")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public MyResponse myMethod(MyRequest myRequest) {

我尝试过以下示例和其他方法:

Entity<MyRequest> requestEntity = Entity.entity(new MyRequest(arg1, arg2), MediaType.APPLICATION_JSON);

target(MY_URI).request(MediaType.APPLICATION_JSON).method("DELETE", requestEntity)

target(MY_URI).request(MediaType.APPLICATION_JSON).build("DELETE", requestEntity).invoke();

但它不起作用。

如何在Jersey测试中进行Http Delete?

1 个答案:

答案 0 :(得分:1)

根据HTTP规范

  

如果DELETE请求包含实体主体,则忽略正文

虽然很多服务器仍然支持实体主体,但我认为因为泽西认为该主体违反了HTTP合规性。 Jersey验证是否符合客户要求。要绕过此验证,您可以设置客户端属性

  

ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION

     

如果为true,则将禁止严格验证HTTP规范合规性。

     

默认情况下,Jersey客户端运行时执行某些HTTP合规性检查(例如哪些HTTP方法可以促进非空请求实体等),以便在用户尝试建立不符合HTTP的通信时发生异常快速失败规格。需要覆盖这些合规性检查并避免Jersey客户端运行时出于某种原因抛出异常的用户可以将此属性设置为true。因此,合规性问题将仅在日志中报告,并且不会抛出任何异常。

     

请注意,该属性会抑制Jersey图层异常。可能是不合规行为将导致在底层I / O连接器层中引发不同的异常集。

     

可以在客户端运行时配置中配置此属性,也可以直接在单个请求中配置此属性。如果发生冲突,请求特定的属性值优先于运行时配置中配置的值。

     

默认值为false。

要在JerseyTest中进行配置,您可以执行

@Override
public void configureClient(ClientConfig config) {
   config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
}

假设您通过调用target(..)的{​​{1}}方法提出请求,上述配置将适用于所有请求。如果您只想删除某些请求的验证,您还可以在JerseyTest上设置该属性,而不是执行上述配置。

WebTarget

修改

我可能会提到的另一件事是Grizzly是不支持实体的服务器之一,unless configured。我不太确定如何在JerseyTest中配置它。因此,如果您正在使用Grizzly测试提供程序,它甚至可能无法在服务器端工作。

如果是这种情况,您尝试使用内存中的测试提供程序,或使用jetty提供程序