Inhaltsvereinbarung auf der Basis von HTTP-Headern implementieren

REST-Anwendungen (Representational State Transfer) können verschiedene Ressourcendarstellungen zurückgeben. Sie können die Inhaltsvereinbarung auf der Basis von HTTP-Accept-Headern verwenden, um das Inhaltsformat für den Datenaustausch zwischen Servern und Clients zu bestimmen.

Informationen zu diesem Vorgang

Ressourcen können Daten in verschiedenen Formaten darstellen. Sie können die Inhaltsvereinbarung auf der Basis von URLs, Anforderungsparametern oder HTTP-Headern implementieren. Diese Task beschreibt die Inhaltsvereinbarung auf der Basis von HTTP-Accept-Headern für das Senden und Empfangen verschiedener Datenformate.

Wenn ein Web-Browser eine Anforderung absetzt, sendet er Informationen zu den gesuchten Daten in Form von Headern an den Server. Einer dieser Header ist der Accept-Header. Der Accept-Header informiert den Server, nach welchen Formaten oder MIME-Typen der Client sucht. Sie können die HTTP-Accept-Header verwenden, um das Inhaltsformat für den Datenaustausch zu bestimmen.

Accept-Header sind zwar nicht sichtbar in Form von URLs oder Parametern, bieten jedoch eine flexiblere Methode zur Handhabung der Inhaltsvereinbarung. Sie können die Header HTTP Accept, Accept-Charset, Accept-Language und Accept-Encoding auch verwenden, um den Inhaltstyp, der vom Server zurückgegeben wird, zu bestimmen.

Mit HTTP-Accept-Headern können Sie gültigen Antworten Qualitätsgrade zuordnen. Ein Client kann beispielsweise XML als bevorzugten Inhaltstyp für Antworten angeben. Wenn XML nicht verfügbar ist, kann der Client JSON oder Klartext als Format akzeptieren.

Wenn der Accept-Header beispielsweise einen Wert wie application/json; q=1.0, text/xml;q=0.5, application/xml;q=0.5 enthält, zeigt dieser Wert an, dass JSON zwar bevorzugt wird, XML jedoch ebenfalls akzeptiert wird.

In anderen Methoden der Inhaltsvereinbarung ist normalerweise nur ein bevorzugter Antworttyp vorhanden. Sie können die HTTP-Accept-Header jedoch verwenden, um den Service über alle gültigen Typen zu informieren, die vom Client in einer Anforderung akzeptiert werden. Darüber hinaus sind der HTTP-Accept-Header und seine zugehörigen Header Teil des HTTP-Standards.

Es ist wichtig, die folgenden Aspekte zu berücksichtigen, wenn Sie die Inhaltsvereinbarung mit HTTP-Headern implementieren. Einige Clients senden möglicherweise falsche Werte, und einige Services respektieren die Accept-HTTP-Headern vielleicht nicht. Außerdem ist die Verarbeitung aller HTTP-Header und die Berechnung der optimalen Antwort nicht so einfach wie die Anforderung von Inhalt auf der Basis eines URL oder eines Anforderungsparameters.

Vorgehensweise

  1. Fügen Sie einen Parameter @javax.ws.rs.core.Context javax.ws.rs.core.Request zur Ressourcenmethode hinzu.
  2. Verwenden Sie das Objekt javax.ws.rs.core.Variant.VariantListBuilder, um eine Liste möglicher Antwortvarianten, die der Service unterstützt, zu erstellen.
  3. Testen Sie eine zulässige Antwort.

    Verwenden Sie die Methode javax.ws.rs.core.Request.selectVariant(java.util.List<Variant>variant), um zu bestimmen, ob die empfangene Antwort zulässig ist und an den Client gesendet werden kann. Es wird eine Liste möglicher Antwortvarianten an die Methode übergeben. Eine Variante stellt einen Medientyp, eine Sprache und eine Codierungskombination dar. Weitere Informationen zum Erstellen einer Variantenliste finden Sie in der API-Dokumentation zu "javax.ws.rs.core.Variant" und "javax.ws.rs.core.Variant.VariantListBuilder".

    Auf der Basis der möglichen Antwortvarianten und der eingehenden HTTP-Header gibt die Methode selectVariant(java.util.List<Variant> variant) die bestmögliche Antwortvariante zurück, die mit den HTTP-Headern übereinstimmt.

    Das folgende Beispiel veranschaulicht die Verwendung der Annotation "@javax.ws.rs.core.Context" für die Injektion des Typs "javax.ws.rs.core.Request". Der Typ "javax.ws.rs.core.Request" kann bei der Bestimmung der optimalen Antwortvariante helfen. In diesem Beispiel wird ein Anforderungsobjekt (Request) von der Laufzeitumgebung übergeben, wenn die Ressourcenmethode aufgerufen wird.
    @Path("/resources")
    public class Resource
    {
        @Path("{resourceID}")
        @GET
        public Response getResource(@PathParam("resourceID") String resourceID, @Context Request req)
        {
            /* Diese Methode erstellt eine Liste möglicher Varianten. */
            /* Sie müssen das Objekt "Variant.VariantListBuilder.add()" aufrufen, bevor Sie das Objekt "Variant.VariantListBuilder.build()". */
            List<Variant> responseVariants =
                     Variant
                         .mediaTypes(
                                     MediaType.valueOf(MediaType.APPLICATION_XML + ";charset=UTF-8"),
                                     MediaType.valueOf(MediaType.APPLICATION_XML + ";charset=shift_jis"),
                                     MediaType
                                         .valueOf(MediaType.APPLICATION_JSON))
                         .encodings("gzip", "identity", "deflate").languages(Locale.ENGLISH,
                                                                             Locale.FRENCH,
                                                                             Locale.US).add().build();
    
              /* Basierend auf den Accept*-Headern wird eine zulässige Antwortvariante ausgewählt. Ist keine zulässige Variante vorhanden,
              gibt selectVariant einen Nullwert zurück. */
    
             Variant bestResponseVariant = req.selectVariant(responseVariants);
             if(bestResponseVariant == null) {
    
                 /* Auf Basis der Ergebnisse kann die optimale Antwortvariante anhand der vorliegenden Liste nicht ermittelt werden. */ 
    
                return Response.notAcceptable().build();
             }
             MediaType responseMediaType = bestResponseVariant.getMediaType();
    
             /* Diese Anweisung ruft die zulässige Sprache ab und ändert die Antwortentität. */
    
             Locale responseLocale = bestResponseVariant.getLanguage();
             if(responseMediaType.isCompatible(MediaType.APPLICATION_XML_TYPE)) {
                 return Response.ok(/* entity in XML format */).type(MediaType.APPLICATION_XML).build();
             } else if (responseMediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE)) {
                 		return Response.ok(/* The entity is  in JSON format */)
    
    								.type(MediaType.APPLICATION_JSON).build();
             }
             return Response.notAcceptable(Variant.mediaTypes(MediaType.APPLICATION_XML_TYPE,
    				 				 MediaType.APPLICATION_JSON_TYPE).add().build()).build();
         }
     }

Ergebnisse

Sie haben die Inhaltsvereinbarung auf der Basis von Accept-Headern implementiert, um die Formate der Ressourcen für die Datendarstellung festzulegen.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxrs_contentnegotiation_httphead
Dateiname:twbs_jaxrs_contentnegotiation_httphead.html