HTTP-Header mit HttpHeaders-Objekten abrufen

Mit JAX-RS (Java™ API for RESTful Web Services) können Sie das HttpHeaders-Objekt verwenden, um auf Anforderungsheader zuzugreifen.

Informationen zu diesem Vorgang

Wenn Sie ein von der JAX-RS-Laufzeitumgebung eingefügtes HttpHeaders-Objekt verwenden, hat das den Vorteil, dass der HTTP-Anforderungsheader bekannt ist und geändert werden kann. Die Annotation "@javax.ws.rs.core.Context" zeigt an, dass ein Kontextobjekt eingefügt ist. Die Schnittstelle "javax.ws.rs.core.HttpHeaders" ist die Schnittstelle des Objekts, das Sie einfügen möchten.

Vorgehensweise

  1. Stellen Sie fest, ob die Methodensignatur geändert werden kann. Wenn Sie eine JAX-RS-spezifische Ressourcenmethode erstellt haben, können Sie die Ressourcenmethodensignatur gewöhnlich ändern und ohne großen Aufwand Parameter hinzufügen, weil die Methode keine Vorgaben für die Methodensignatur hat. Wurde Ihre JAX-RS-Ressourenmethode jedoch durch Wiederverwendung von Code und Anpassung vorhandener Klassen und Methoden entwickelt,um JAX-RS-Funktionen hinzuzufügen, können Vorgaben für die Methodensignatur in dem bereits vorhandenen Code existieren, der die Methode aufruft. In diesem Fall kann die Methodensignatur nicht geändert werden.
  2. Wenn eine Ressourcenmethodensignatur geändert werden kann, fügen Sie der Methode einen Parameter "javax.ws.rs.core.HttpHeaders" hinzu, der mit der Annotation "@javax.ws.rs.core.Context" annotiert ist. Beim Aufrufen der Ressourcenmethode übergibt die JAX-RS-Laufzeitumgebung ein Objekt, das das HttpHeaders-Objekt implementiert, z. B.:
    @Path("/contextexample")
    public class RootResource {
        @GET
            public String getResource(@Context HttpHeaders httpHeaders) {
                    /* Ruft eine Methode für httpHeaders auf. */
                    return "The client sent a header value of " + headers.getRequestHeaders().getFirst("CustomHeader") + " for CustomHeader";
        }
    }
  3. Wenn eine Ressourcenmethodensignatur nicht geändert werden kann und die Klasse eine Stammressource ist, fügen Sie der Klasse ein Feld "javax.ws.rs.core.HttpHeaders" hinzu, das mit der Annotation "@javax.ws.rs.core.Context" annotiert ist. Wird die Ressource für eine Anforderung instanziiert, wird ein Objekt, das "HttpHeaders" implementiert, eingefügt. Beispiel:
    @Path("/contextexample")
    public class RootResource {
    
        @Context
        HttpHeaders httpHeaders;
    
        @GET
        public String getResource() {
                    /* Ruft eine Methode für httpHeaders auf. */
                    return "The client sent a header value of " + headers.getRequestHeaders().getFirst("CustomHeader") + " for CustomHeader";
        }
    }

Ergebnisse

Die Ressourcenmethode verwendet Informationen von den HTTP-Headern, die in der Anforderung gesendet werden, um eine entsprechende Antwort festzulegen.

Beispiel

Das folgende Beispiel veranschaulicht eine Ressource, die je nach Einstellung des Accept-Language-Headers unterschiedliche Begrüßungen zurückgibt.

Im folgenden Codeausschnitt wird der @Context-HttpHeaders-Parameter zur Methodensignatur hinzugefügt. Beachten Sie, dass die Annotation "@Context" und die Typendeklaration in der Parameterliste der Methode "getGreeting" aufgeführt sind.
import java.util.List;
import java.util.Locale;
 import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 
 @Path("/contexttest") 
public class HelloWorldInMyLanguage { 

    /**
     *   @return - Gibt die Zeichenfolge in der bevorzugten Sprache zurück.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getGreeting(@Context HttpHeaders httpHeaders) {
        List<Locale> locales = httpHeaders.getAcceptableLanguages();

        if (locales.size() == 0) {
            return "Hello!";
        }

        Locale locale = locales.get(0);
        if (locale.equals(Locale.FRENCH)) {
            return "Bonjour!";
        } else if (locale.equals(Locale.GERMAN)) {
            return "Guten Tag!";
        } else {
            return "Hello!";
        }
    }
} 
Alternativ dazu können Sie die @Context-Eigenschaft "HttpHeaders" als Feld in der Klasse deklarieren. Beispiel:
import java.util.List;
import java.util.Locale;
 import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.MediaType; 
 @Path("/contexttest") 
public class HelloWorldInMyLanguage { 

    @Context
    HttpHeaders httpHeaders;

    /**
     *   @return - Gibt die Zeichenfolge in der bevorzugten Sprache zurück.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getGreeting() {
        List<Locale> locales = httpHeaders.getAcceptableLanguages();

        if (locales.size() == 0) {
            return "Hello!";
        }

        Locale locale = locales.get(0);
        if (locale.equals(Locale.FRENCH)) {
            return "Bonjour!";
        } else if (locale.equals(Locale.GERMAN)) {
            return "Guten Tag!";
        } else {
            return "Hello!";
        }
    }
}

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_contextobjects_httpheaders
Dateiname:twbs_jaxrs_contextobjects_httpheaders.html