这是一个特定于JAX-RS的问题。根据{{1}}文档:
https://docs.oracle.com/javaee/7/api/javax/ws/rs/HeaderParam.html
Be List,Set或SortedSet,其中T满足上面的2,3或4。生成的集合是只读的。 如果类型不是上面5中列出的集合类型之一,并且header参数由多个值表示,则使用参数的第一个值(词法)。
从文档中可以清楚地看出,如果标题有多个值,那么它可以映射到集合。 这是我的例子:
@HeaderParam
客户:
@Path("/")
public class TestResource {
@GET
@Path("test")
public String test(@HeaderParam("myHeader") List<String> list) {
System.out.println(list.size());
list.stream().forEach(System.out::println);
return "response";
}
}
服务器控制台上的输出:
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/test");
String response = target.request()
.header("myHeader", "a")
.header("myHeader", "b")
.header("myHeader", "c,d")
.get(String.class);
client.close();
只有一个元素填充'a,b,c,d'而不是4个单独的元素。 我在这里错过了什么?谷歌搜索问题,但没有找到任何答案。 我正在使用Jersey 2.25.1。并在嵌入式tomcat中运行它:
1
a,b,c,d
由于
答案 0 :(得分:1)
这不是您的应用程序的错误。它按设计工作。多个标头参数以逗号分隔。
查看Standard for adding multiple values of a single HTTP Header to a request or response它引用了http协议rfc以使用多个标头属性。
答案 1 :(得分:0)
对我来说似乎是个错误,但他们声称这是他们打算Jersey发挥作用的方式(根据https://github.com/jersey/jersey/issues/2436)。这种推理对我来说似乎值得怀疑。 RFC 2616并不像它们暗示的那么简单。 RFC 2616基本上说的是,如果标头在语义上等效于逗号分隔的列表,则标头可以多次出现。用逗号分隔的列表是否应视为列表完全取决于开发人员,而且很明显,您清楚地使用List类型和HeaderParam注释表明了这一意图。