gpt4 book ai didi

rest - JAX-RS/Jersey 中的 HTTP 内容协商冲突?

转载 作者:行者123 更新时间:2023-12-04 13:54:56 25 4
gpt4 key购买 nike

我喜欢 JAX-RS(特别是 Jersey)的自动 HTTP 内容协商,即它能够通过“Accept”和/或“Content-Type” header 路由我的资源。但是我发现有时在发生冲突时它并没有给我足够的控制权。

例如,考虑以下端点:

@Path("/order")
public class OrderController {

@GET
@Path("{orderID: \\d+}")
@Produces("text/html")
public View getOrderView(@PathParam("orderID") long id) {
Order order = this.getOrderData(id);
return new OrderView(order);
}

@GET
@Path("{orderID: \\d+}")
@Produces({"application/json", "application/xml"})
public Order getOrderData(@PathParam("orderID") long id) {
return new OrderService.findOrder(id);
}
}

我会在 Firefox 和 Chrome 之间得到不同的结果。 Firefox 将映射到 HTML 端点,而 Chrome 将在我导航到每个端点 URL 时触发 XML 端点。它们之间的区别在于其 Accept header 中列出的 MIME 类型的顺序。 Chrome 发送以下内容:
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.107 Safari/534.13
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

与 Firefox 相比,它首先列出 HTML:
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

当所有的权重相同时,它会匹配第一个条目,这似乎是合乎逻辑的。但就我而言,我得到的结果与我想要的不同,因此最好确定一种更好的打破平局的方法。

我的问题:如果没有将 header 信息注入(inject)这些方法并自己执行媒体类型处理,有没有办法在出现平局时“调整权重”?例如,我可以告诉它总是用 HTML 胜过 XML 吗?我的 RESTful 客户端对他们想要返回的类型非常明确,但浏览器对 Accept header 的草率是出了名的。 (我个人认为他们应该将 HTML 的权重略高于 XML,因为这是用户所期望的,但为时已晚。)

或者,我可以在某个集中位置只执行一次我自己的自定义内容协商吗?我不反对手动编写此逻辑,但如果这意味着将其应用于我的资源的每个实例,则不反对。 JAX-RS 是否有一些在管道中添加过滤器以在路由请求之前调整请求的概念?

最佳答案

Jersey 中有一种机制可以覆盖来自 HTTP Accept header 的相对偏好程度。只需将参数“qs”添加到您想要优先的@Produces 注释。在你的情况下:@Produces("text/html;qs=2")请注意,http“q”值的范围为 0-1,而 Jersey“qs”值应 >= 1(默认值为 1)。

(我是从 this source 那里了解到的,并为自己写了一个小笔记 here )

关于rest - JAX-RS/Jersey 中的 HTTP 内容协商冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250923/

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