Mit JAX-RS (Java™ API for RESTful Web Services) können Sie das Request-Objekt verwenden, um
auf Anforderungsheader zuzugreifen. Das Request-Objekt stellt Methoden für die Bewertung von Vorbedingungen und die Auswahl der optimalen Antwortvariante
auf der Basis der Anforderungsheader bereit.
Informationen zu diesem Vorgang
Wenn Sie ein von der JAX-RS-Laufzeitumgebung eingefügtes Request-Objekt verwenden,
hat das den Vorteil, dass die Vorbedingungen der HTTP-Header einfach bewerten können. Die Annotation
"@javax.ws.rs.core.Context" zeigt an, dass ein Kontextobjekt eingefügt ist. "javax.ws.rs.core.Request"
ist die Schnittstelle des einzufügenden Objekts. Das eingefügte Request-Objekt ist nützlich bei der
Bewertung von Vorbedingungen von HTTP-Headern mit Datumsangaben (z. B. If-Modified-Since) und Entitäts-Tags
(z. B. If-Match).
Sie können auch das Request-Objekt verwenden, wenn Sie erweiterte Inhaltsvereinbarung implementieren.
Näheres zur Inhaltsvereinbarung finden Sie in den Informationen zur Verwendung von XML-Inhalt in JAX-RS-Anwendungsanforderungen und -antworten.
Fehler vermeiden: Die Granulariät von Datumsangaben, die in HTTP-Headern verwendet werden, ist nicht so präzise wie einige Daten in
Datenquellen. Beispielsweise kann eine Datumsangabe in einer Datenbankzeile bis auf die Millisekunde genau definiert werden. Das Datum
in einem HTTP-Headerfeld kann lediglich auf die Sekunde genau angegeben werden. Wenn Sie bei der Bewertung von Vorbedingungen für HTTP ein
java.util.Date-Objekt mit dem Datum in einem HTTP-Header vergleichen, kann der Unterschied in der Genauigkeit zu unerwarteten Ergebnissen führen. Wenn Sie
dieses Problem vermeiden möchten, müssen Sie das Objekt "java.util.Date" normalisieren, bevor Sie den Vergleich mit dem Datumswert im HTTP-Header durchführen.
gotcha
Vorgehensweise
- Wenn eine Ressourcenmethodensignatur geändert werden kann, fügen Sie den
@javax.ws.rs.core.Context-Parameter "javax.ws.rs.core.Request" zur Methode hinzu. Beim Aufrufen der Ressourcenmethode übergibt die JAX-RS-Laufzeitumgebung ein Objekt, das das Request-Objekt implementiert, z. B.:
@Path("/contextexample")
public class RootResource {
@GET
@Produces("text/plain")
public Response getResource(@Context Request requestObj) {
Date lastModified = /* Ruft das Datum der letzten Änderung dieser Ressource aus einer Datenquelle ab. */;
ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified);
/* Wenn die Vorbedingungen nicht erfüllt sind, ist ResponseBuilder ungleich Null. Gibt die automatisch generierte Antwort zurück. */
if (possibleResponse != null) {
return possibleResponse.build();
}
return Response.ok("a resource representation").lastModified(lastModified).build();
}
}
- Wenn eine Ressourcenmethodensignatur nicht geändert werden kann und die Klasse eine Stammressource ist, fügen Sie das Feld für den
@javax.ws.rs.core.Context-Parameter "javax.ws.rs.core.Request" hinzu. Wird die Ressource für eine Anforderung instanziiert, wird ein Objekt, das "Request" implementiert, eingefügt. Beispiel:
@Path("/contextexample")
public class RootResource {
@Context
Request requestObj;
@GET
@Produces("text/plain")
public Response getResource() {
Date lastModified = /* Ruft das Datum der letzten Änderung dieser Ressource aus einer Datenquelle ab */;
ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified);
/* Wenn die Vorbedingungen nicht erfüllt sind, ist ResponseBuilder ungleich Null. Gibt die automatisch generierte Antwort zurück */ if (possibleResponse != null) {
return possibleResponse.build();
}
return Response.ok("a resource representation").lastModified(lastModified).build();
}
}
Ergebnisse
Sie haben das javax.ws.rs.core.Request-Objekt verwendet, um die HTTP-Header einer eingehenden Anforderung zu bewerten und die entsprechende Antwort
zu bestimmen.