如何使用@Context批注
JAX-RS API提供了一种非常方便的机制,可以将各种有用的资源(例如HTTP标头)注入到端点中。 @Context注释是一个通用注释,它注入以下对象的实例:
- HttpHeaders- > HTTP标头参数和值
- UriInfo- >捕获路径变量和查询参数
- SecurityContext- >提供对请求的安全性相关信息的访问
- ResourceContext- >提供对资源类实例的访问
- 请求 ->前提条件请求处理
- 应用程序 , 配置和提供程序 ->提供有关JAX-RS应用程序环境的信息
- HttpServletRequest- >提供对HttpServletRequest实例的访问
- HttpServletResponse- >提供对HttpServletResponse实例的访问
- ServletConfig- >提供对ServletConfig的访问
- ServletContext- >提供对ServletContext的访问
让我们依次使用工作代码示例进行研究。
使用@Context注入HttpHeaders实例
有两种获取HTTP标头参数值的方法。 如果可以使用@HeadParam批注标记资源方法参数并将其传递给参数名称,则将HTTP标头参数的值分配给由@HeadParam批注注释的String变量。 以下代码片段检索user-agent参数的值并将其分配给UserAgent String。
@HeaderParam("user-agent") String userAgent
如果您只需要几个头值,那么这是一个很好的解决方案,但是如果您想要很多或不确定参数名需要遍历头,那该解决方案还不够好。 幸运的是, @ Context注释可以帮助我们。 该注释可以将所有HTTP标头参数注入一个HttpHeaders对象中。 看下面的代码示例:
@Path("/http-headers")
public class EndpointResource {@GET@Produces(MediaType.APPLICATION_JSON)public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){return Response.ok(httpHeaders.getRequestHeaders()).build();}
}
在此代码段中, @ Context批注用于指示容器将当前请求的HttpHeaders对象的实例传递给getAllHttpHeaders方法。 方法getRequestHeaders返回一个包含HTTP参数及其对应值的MultivaluedMap <String,String> 。 这是为当前请求提供对HTTP标头数据的访问的许多方法之一。
MultivaluedMap被反序列化为JSON,并在响应主体中发送回客户端。
如果您将代码克隆到我的Github存储库中,并使用Maven命令: mvn clean package执行代码,它将被部署到IBM Liberty Profile实例中。 访问URL http:// localhost:8080 / rest-server / http-headers ,该请求的HTTP标头的JSON表示将显示在屏幕上,其外观应类似于以下内容:
{"Accept": [ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" ],"accept-encoding": [ "gzip, deflate, br" ],"Accept-Language": [ "en-US,en;q=0.8,es;q=0.6" ],"connection": [ "keep-alive" ],"Content-Type": [ null ],"DNT": [ "1" ],"Host": [ "localhost:8080" ],"Upgrade-Insecure-Requests": [ "1" ],"User-Agent": ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"]
}
让我们看另一个仅检索一个HTTP标头值的示例。
@GET
@Path("/{header-param}")
@Produces(MediaType.APPLICATION_JSON)
public Response getSpecifiedHeader(final @PathParam("header-param") String header_param, final @Context HttpHeaders httpHeaders){return Response.ok(httpHeaders.getRequestHeader(header_param)).build();
}
在此编码示例中,您通过URL参数将HTTP标头参数名称传递给资源方法。 然后,该方法使用参数名称来检索关联的HTTPHeader参数的值,并将其以JSON格式传递回调用方。
因此,对端点http:// localhost:8080 / rest-server / http-headers / User-Agent的调用将返回User-Agent HTTP参数的值,并且应如下所示:
["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
]
HttpHeader类中有很多方法,可让您查询HTTP标头中的参数。 这是这些方法的列表。 如您所见,有一些便捷的方法可以返回MediaType和Local 。
List<String> getRequestHeader(String var1);
String getHeaderString(String var1);
MultivaluedMap<String, String> getRequestHeaders();
List<MediaType> getAcceptableMediaTypes();
List<Locale> getAcceptableLanguages();
MediaType getMediaType();
Locale getLanguage();
Map<String, Cookie> getCookies();
Date getDate();
int getLength();
HttpHeaders实例也可以作为实例变量注入,如下所示:
@Path("/http-headers")
public class HttpHeaderResource {@Contextprivate HttpHeaders httpHeaders;@GET@Produces(MediaType.APPLICATION_JSON)public Response getAllHttpHeaders(){return Response.ok(httpHeaders.getRequestHeaders()).build();}
}
使用@Context注入UriInfo实例
UriInfo接口提供对有关请求URI的有用信息的访问。 您可以检索与路径相关的详细信息,例如查询参数是路径变量。
以下代码段在资源根后面获取URI中的模板参数。
@Path("/uri-info")
public class UriInfoResource {@GET@Path("/{path: .*}")@Produces(MediaType.APPLICATION_JSON)public Response getPathParameters(final @Context UriInfo uriInfo){return Response.ok(uriInfo.getPathParameters()).build();}}
访问URL http:// localhost:8080 / rest-server / uri-info / path / to / resource后收到的响应是资源根uri-info之后的路径。
{"path": [ "path/to/resource" ]
}
可以通过调用方法getQueryParameters()轻松检索URI查询参数。 看下面的代码示例。
@GET
@Path("/{search}")
@Produces(MediaType.APPLICATION_JSON)
public Response getQueryParameters(final @Context UriInfo uriInfo){return Response.ok(uriInfo.getQueryParameters()).build();
}
对URL http:// localhost:8080 / rest-server / uri-info / search?term = JavaEE的调用将捕获搜索项和值:
{"term": [ "JavaEE" ]
}
也可以将UriInfo实例注入实例变量中,如下所示:
@Context
private UriInfo uriInfo;
接下来是什么?
这就是什么 , 什么是javax.ws.rs.core.context? 您将学习如何使用@Context批注来保护RESTful Web服务以及如何检索和使用资源。
代码库
这个以及我所有文章的源代码都在readlearncode_articles Github存储库中。
翻译自: https://www.javacodegeeks.com/2017/08/javax-ws-rs-core-context-part-1.html