HTTP content-negotiation Konflikte in JAX-RS/Jersey?
Genieße ich die automatische HTTP-content-negotiation für JAX-RS (speziell Jersey), D. H. seine Fähigkeit zur route "meine Ressourcen" durch "Annehmen" und/oder "Content-Type" - Header. Aber ich finde, dass es manchmal nicht gib mir genug Steuern, wenn es einen Konflikt gibt.
Betrachten Sie beispielsweise die folgenden Endpunkte:
@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);
}
}
Bekomme ich unterschiedliche Ergebnisse zwischen Firefox und Chrome. Firefox wird eine Karte, um die HTML-Endpunkt, während Chrome löst die XML-Endpunkt, wenn ich navigieren die einzelnen, um die Endpunkt-URL. Der Unterschied zwischen Ihnen ist die Reihenfolge der aufgeführten MIME-Typen in Ihre Accept-Header. Chrome sendet die folgenden:
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
Versus in Firefox listet HTML erste:
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
Scheint logisch, dass es mit dem ersten Eintrag, wenn alle werden gleich gewichtet. Aber in meinem Fall bin ich immer die unterschiedlichen Ergebnisse, als ich möchte, so wäre es schön, um zu bestimmen, eine bessere Methode für tie-breaking.
Meine Frage: kurz, die Injektion header-Informationen in diese Methoden und die Durchführung der media-Typ der Verarbeitung selbst, gibt es eine Möglichkeit zu "optimieren der GEWICHTE", so zu sprechen, im Falle eines Unentschiedens? Zum Beispiel, kann ich sagen, es immer Trumpf XML mit HTML? Meine Rest-clients sind sehr explizit, welche Art Sie wollen zurück, aber Browser sind notorisch schlampig mit Accept-Header. (Ich persönlich denke, Sie sollten Gewicht zu HTML leicht über XML-da dies ist, was die Nutzer erwarten aber es ist ein wenig spät.)
Alternativ kann ich mein eigenen content negotiation nur einmal in einem zentralen Ort? Ich bin nicht gegen das schreiben dieser Logik heraus manuell, aber nicht wenn es bedeutet, dass die Anwendung auf jeden einzelnen Fall an meine Ressourcen. Tut JAX-RS haben einige das Konzept der das hinzufügen eines filters, um die pipeline zu optimieren, Anfragen, bevor Sie weitergeleitet werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als das Trikot Bedienungsanleitung Staaten:
Aus, was ich weiß, dies lässt Sie mit zwei Möglichkeiten/hacks:
Anhängen der Datei-Erweiterung
URIs zu überschreiben, den Accept-header
Schreiben Sie ein servlet-filter, der
überschreibt den Accept-header für
Benutzerprogramme
Es ist ein Mechanismus, der im Trikot zum überschreiben der relative Grad der Präferenz aus den HTTP-Accept-header. Fügen Sie einfach einen parameter "qs" an die @Produziert Anmerkung, die Sie wollen, haben Vorrang. In deinem Fall:
@Produces("text/html;qs=2")
Beachten Sie, dass die http - "q" - Werte im Bereich von 0-1 und das Trikot "qs" - Werte sollte >= 1 (1 ist default).
(Ich erfuhr dies von diese Quelle, und ich schrieb eine kleine Notiz für mich selbst hier)