我正在使用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?
答案 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提供程序