如何让Jersey Test/Client不填写默认的Accept标头?

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测试容器时,会出现此错误,但不会使用内存测试容器.

Mik*_*tta 0

不确定这是否对其他人有帮助,但我们看到类似的行为使用我们的客户端代码在生产中调用服务。我们使用的是 Jersey 2.21.1。

扩展了原始帖子的代码,发现以下内容是正确的:

  • 如果Acceptheader 为 null,则 Jersey 添加默认值
  • 如果Accept标头为空,则使用String空标头Accept
  • 如果Accept标头有值,则使用该值

我不确定是否有办法告诉 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)