Mediante Java™ API for
RESTful Web Services (JAX-RS), puede utilizar el objeto Request para acceder a las cabeceras de solicitud. El objeto Request proporciona métodos para evaluar condiciones previas y para seleccionar la variante de respuesta óptima en función de las cabeceras de solicitud.
Acerca de esta tarea
Mediante un objeto Request inyectado con el entorno de ejecución de JAX-RS, puede evaluar de forma fácil las condiciones previas de las cabeceras. La anotación @javax.ws.rs.core.Context indica que se ha inyectado un objeto de contexto. javax.ws.rs.core.Request es la interfaz del objeto que desea inyectar. El objeto Request inyectado resulta útil para evaluar las condiciones previas de cabeceras
HTTP con fechas como, por ejemplo, el valor If-Modified-Since y los códigos de entidad como, por ejemplo, If-Match.
También puede utilizar el objeto Request al implementar la negociación de contenido avanzada. Para obtener más información sobre la negociación del contenido, consulte el uso de contenido XML en solicitudes y respuestas de la aplicación de JAX-RS.
Avoid trouble: La granularidad de fechas utilizado en las cabeceras HTTP no es tan precisa como algunas fechas utilizadas en orígenes de datos. Por ejemplo, la precisión de una fecha en una fila de base de datos puede definirse hasta el milisegundo. Sin embargo, la fecha en un campo de cabecera HTTP sólo es precisa en segundos. Cuando se evalúan condiciones previas HTTP, si compara un objeto java.util.Date con la fecha de una cabecera HTTP, la diferencia en la precisión puede generar resultados inesperados. Para evitar este problema, normalice el objeto java.util.Date antes de comparar con el valor de fecha en la cabecera
HTTP.
gotcha
Procedimiento
- Si se puede modificar la firma de un método de recursos, añada el parámetro
@javax.ws.rs.core.Context javax.ws.rs.core.Request al método. Cuando se invoca al recurso, el entorno de ejecución de JAX-RS pasa un objeto que implementa el objeto
Request; por ejemplo:
@Path("/contextexample")
public class RootResource {
@GET
@Produces("text/plain")
public Response getResource(@Context Request requestObj) {
Date lastModified = /* Gets the last modified date of this resource from a data source. */;
ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified);
/* If the preconditions are not met, then ResponseBuilder is not null. Return the automatically generated response. */
if (possibleResponse != null) {
return possibleResponse.build();
}
return Response.ok("a resource representation").lastModified(lastModified).build();
}
}
- Si no se puede modificar la firma de un método de recursos y la clase no es un recurso root, añada
el campo @javax.ws.rs.core.Context javax.ws.rs.core.Request. Cuando se crea una instancia del recurso para una solicitud, se inyecta un objeto que implementa
Request; por ejemplo:
@Path("/contextexample")
public class RootResource {
@Context
Request requestObj;
@GET
@Produces("text/plain")
public Response getResource() {
Date lastModified = /* Gets the last modified date of this resource from a data source */;
ResponseBuilder possibleResponse = requestObj.evaluatePreconditions(lastModified);
/* If the preconditions are not met, then ResponseBuilder is not null. Return the automatically generated response */
if (possibleResponse != null) {
return possibleResponse.build();
}
return Response.ok("a resource representation").lastModified(lastModified).build();
}
}
Resultados
Ha utilizado el objeto javax.ws.rs.core.Request para evaluar las cabeceras HTTP de una solicitud entrante y para determinar la respuesta correcta para la solicitud.