pos*_*ist 7 java jersey jersey-client jersey-test-framework
我正试图以Accept一种特定的方式处理一个没有标题的请求,但是不管我做什么,泽西岛似乎都在努力填写一个请求,所以它总是看起来像请求有一个Accept标题,即使它没有.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
此测试结果如下:
org.junit.ComparisonFailure:
Expected :No Accept Header
Actual :text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Run Code Online (Sandbox Code Playgroud)
不知何故,有一个默认Accept标头在text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2某处设置.它没有记录,我想知道如何禁用它.我查看了泽西岛的消息来源,但似乎找不到发生这种情况的原因或原因.
更新:当我使用curl命中没有Accept标头的端点时,没有生成的Accept标头,所以问题出在Jersey Client或Jersey Test环境中,不知何故.
更新2:当使用默认的Grizzly2测试容器或JDK测试容器时,会出现此错误,但不会使用内存测试容器.
不确定这是否对其他人有帮助,但我们看到类似的行为使用我们的客户端代码在生产中调用服务。我们使用的是 Jersey 2.21.1。
扩展了原始帖子的代码,发现以下内容是正确的:
Acceptheader 为 null,则 Jersey 添加默认值Accept标头为空,则使用String空标头AcceptAccept标头有值,则使用该值我不确定是否有办法告诉 Jersey 在使用 null 时不要添加默认值。
public class JerseyAcceptHeaderTest extends JerseyTest {
@Path("hello")
public static class HelloResource {
@GET
public String getHello(@Context HttpHeaders httpHeaders) {
String acceptHeader = httpHeaders.getHeaderString(HttpHeaders.ACCEPT);
System.out.println("SERVER RECEIVED:" + acceptHeader);
if (acceptHeader == null) {
return "Null Accept Header";
} else if (acceptHeader.equals("")) {
return "No Accept Header";
} else {
return acceptHeader;
}
}
}
@Override
protected Application configure() {
return new ResourceConfig(HelloResource.class);
}
/**
* this seems to be a bug in Jersey
* it overrides a null Accept header
*/
@Test
public void test_accept_header_with_null() {
final String acceptHeader = target("hello").request()
.header(HttpHeaders.ACCEPT, null)
.get(String.class);
assertEquals("Null Accept Header", acceptHeader);
}
@Test
public void test_accept_header_with_empty_string() {
final String acceptHeader = target("hello").request()
.header(HttpHeaders.ACCEPT, "")
.get(String.class);
assertEquals("No Accept Header", acceptHeader);
}
@Test
public void test_accept_header_with_spaced_string() {
final String acceptHeader = target("hello").request()
.header(HttpHeaders.ACCEPT, " ")
.get(String.class);
assertEquals("No Accept Header", acceptHeader);
}
@Test
public void test_accept_header_with_value() {
final String acceptHeader = target("hello").request()
.header(HttpHeaders.ACCEPT, "application/json")
.get(String.class);
assertEquals("application/json", acceptHeader);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |