gpt4 book ai didi

java - 如何让 Jersey Test/Client 不填写默认的 Accept header ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:37:07 24 4
gpt4 key购买 nike

我正在尝试以特定方式处理没有 Accept header 的请求,但无论我做什么,Jersey 似乎都一心想填写一个,所以它看起来总是请求有一个 Accept 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

不知何故有一个默认的 Accept header text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 在某处设置。它没有记录,我很想弄清楚如何禁用它。我查看了 Jersey 源代码,但似乎无法找到发生这种情况的位置或原因。

更新:当我使用 curl 在没有 Accept header 的情况下命中端点时,没有生成 Accept header ,因此问题出在 Jersey 客户端或 Jersey 测试环境中。

更新 2:当使用默认的 Grizzly2 测试容器或 JDK 测试容器时会出现此错误,但不会使用 In Memory 测试容器。

最佳答案

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

扩展了原始帖子中的代码,发现以下内容为真:

  • 如果 Accept header 为空,则 Jersey 添加默认值
  • 如果 Accept header 是一个空的 String 则使用一个空的 Accept header
  • 如果 Accept header 有一个值,它就会被使用

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

}

关于java - 如何让 Jersey Test/Client 不填写默认的 Accept header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com