【发布时间】:2017-04-15 12:20:45
【问题描述】:
我正在尝试以特定方式处理没有 Accept 标头的请求,但无论我做什么,泽西岛似乎都一心想要填写一个,所以看起来请求总是有一个 @987654323 @header,即使没有。
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import static org.junit.Assert.assertEquals;
public class JerseyTestTest extends JerseyTest {
@Path("hello")
public static class HelloResource {
@GET
public String getHello(@Context HttpHeaders httpHeaders) {
String acceptHeader = httpHeaders.getHeaderString(HttpHeaders.ACCEPT);
return acceptHeader != null ? acceptHeader : "No Accept Header";
}
}
@Override
protected Application configure() {
return new ResourceConfig(HelloResource.class);
}
@Test
public void test() {
final String hello = target("hello").request()
.header(HttpHeaders.ACCEPT, null) // null means remove header
.get(String.class);
assertEquals("No Accept Header", hello);
}
}
此测试结果:
org.junit.ComparisonFailure:
Expected :No Accept Header
Actual :text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
不知何故,text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 的默认 Accept 标头在某处设置。它没有记录,我很想弄清楚如何禁用它。我查看了 Jersey 的源代码,但似乎无法找到发生这种情况的位置或原因。
更新:当我使用 curl 访问没有 Accept 标头的端点时,没有生成 Accept 标头,因此问题出在 Jersey 客户端或 Jersey 测试环境中。
更新 2:使用默认的 Grizzly2 测试容器或 JDK 测试容器时会出现此错误,但不会出现在内存测试容器中。
【问题讨论】:
-
它可能在为请求创建 UserAgent 时设置。对此有很好的见解tools.ietf.org/html/rfc7231#section-5.3.2。为了解决上述问题,您可以尝试在 Resource 类中使用 null/空值覆盖 Accept 标头吗?
-
@nullpointer 我在 Jersey 中找到了为请求添加 User-Agent 的代码,但我没有看到附近有任何添加 Accept 标头的代码,所以不,那不是它被添加的时候。我确切地知道 Accept 标头的用途,并且我已经阅读了 RFC 并经常参考它们。我不知道覆盖 Resource 类中的 Accept 标头是什么意思。 Resource 类是服务器上的内容,Jersey 文档中没有关于覆盖标头的内容,我也不想替换我收到的 Accept 标头。我想看看 Accept 标头是什么,或者是否没有。
-
您是否尝试过使用 wget 或 curl 作为客户端? @Test 方法究竟做了什么?
-
@gsl 我用 curl 单独测试了端点,没有生成 Accept 标头。我在票证中添加了一条注释,因此生成的 Accept 标头必须发生在 Jersey 测试/客户端代码中的某处。
-
我想你从来没有想过这个问题?我有同样的问题。
标签: java jersey jersey-client jersey-test-framework