Usando a API Java™ para
Serviços da Web RESTful (JAX-RS), é possível usar o objeto Request
para acessar cabeçalhos de pedido. O objeto Request fornece métodos para avaliar as pré-condições
e para selecionar a variante de resposta ideal com base nos cabeçalhos de pedido.
Sobre Esta Tarefa
Usando o objeto Request introduzido com o ambiente de tempo de execução JAX-RS,
é possível avaliar facilmente as pré-condições de cabeçalhos HTTP. A anotação
@javax.ws.rs.core.Context indica que um objeto de contexto é introduzido. O javax.ws.rs.core.Request é a interface do objeto que deseja
introduzir. O objeto Request introduzido é útil na avaliação das pré-condições
do cabeçalho HTTP com datas, como o valor If-Modified-Since e as tags
da entidade, como If-Match.
Também é possível usar o objeto
Request ao implementar a negociação de conteúdo avançada. Para aprender mais sobre a negociação de conteúdo, consulte o uso do conteúdo XML
nos pedidos e respostas do aplicativo JAX-RS.
Evitar Problemas: A granularidade das datas usadas nos cabeçalhos HTTP não é tão precisa quanto algumas datas usadas nas origens de dados. Por exemplo,
a precisão para uma data em uma linha de banco de dados pode ser definida para milissegundo. Entretanto, a data em um campo de cabeçalho HTTP é precisa apenas para segundos. Ao avaliar as pré-condições HTTP, se você comparar um objeto java.util.Date
com a data em um cabeçalho HTTP, a diferença na precisão poderá produzir
resultados inesperados. Para evitar esse problema, normalize o objeto
java.util.Date antes de comparar com o valor de data no cabeçalho HTTP.
gotcha
Procedimento
- Se uma assinatura de método de recurso puder ser modificada, inclua
o parâmetro @javax.ws.rs.core.Context javax.ws.rs.core.Request
no método. Quando o método de recurso for chamado, o ambiente de tempo de execução
JAX-RS transmitirá um objeto que implementa o objeto Request, como por exemplo:
@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();
}
}
- Se uma assinatura de método de recurso não puder ser modificada e a classe for um recurso raiz, inclua
o campo @javax.ws.rs.core.Context javax.ws.rs.core.Request. Quando o recurso for instanciado para um pedido, um objeto que implementa
Request será introduzido, como por exemplo:
@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
Você usou o objeto javax.ws.rs.core.Request para avaliar os cabeçalhos
HTTP de um pedido recebido e determinou a resposta apropriada para o pedido.