什么是javax.ws.rs.core.context? [ 第1部分 ]
如何使用@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
什么是javax.ws.rs.core.context? [ 第1部分 ]相关推荐
- 什么是javax.ws.rs.core.context? [第3部分]
如何使用@Context批注 在什么是javax.ws.rs.core.context的第2部分中? 您学习了如何使用@Context批注从SecurityContext类的注入实例检索安全信息,以及 ...
- 什么是javax.ws.rs.core.context? [ 第2部分 ]
如何使用@Context批注 在什么是javax.ws.rs.core.context? 您学习了如何使用@Context批注从HttpHeaders类的注入实例中检索HTTP标头信息,以及如何从Ur ...
- 什么是javax.ws.rs.core.context? [第5部分]
如何使用@Context批注 在什么是javax.ws.rs.core.context的第4部分中? 您学习了如何使用@Context批注将HttpServletResponse和HttpServle ...
- 什么是javax.ws.rs.core.context? [第4部分]
如何使用@Context批注 在什么是javax.ws.rs.core.context的第3部分中? 您学习了如何在请求和配置,提供程序和应用程序实例中使用@Context批注. 在本文中,您将学习如 ...
- Couldn‘t find grammar element for class javax.ws.rs.core.Response(没有解决)
复现: $HADOOP_HOME/bin/yarn timelineserver 12月 22, 2020 3:21:49 下午 com.sun.jersey.server.wadl.generato ...
- Couldn‘t find grammar element for class javax.ws.rs.core.Response
测试hive on tez,启动顺序如下: 启动hadoop hive --service metastore hiveserver2 starthis yarn timelineserver hiv ...
- 【registry】registry AbstractMethodError javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws
1.概述 在 [registries]registrie rest-service idea 无法引入的背景下,以及 [registry]NoSuchFieldError: INCLUDE_ALL 以 ...
- javax maven项目缺少_Eclipse项目中的Maven:软件包javax.ws.rs不存在
在Eclipse中,当我转到myProject->右键单击-> Run As-> Maven构建时,控制台中出现多个错误,概述某些软件包不存在,例如: javax.ws.rs doe ...
- flink启动yarn-session报错javax/ws/rs/ext/MessageBodyReader
问题复现: /home/appleyuchi/bigdata/flink-1.10.1/bin/yarn-session.sh 报错如下: 2020-06-07 19:05:01,358 ERROR ...
最新文章
- 年终盘点:2015年人工智能的五大关键词
- linux 用户/用户组添加修改删除(ubuntu/centos)
- 17秋 软件工程 团队第五次作业 Alpha Scrum3
- VC++6.0如何创建与调用动态链接库(dll)
- OpenCL(CUDA5.0) + Visual Studio 2010 环境配置
- ES10新特性_数组方法扩展flat_与flatMap---JavaScript_ECMAScript_ES6-ES11新特性工作笔记059
- 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件
- android11 谷歌安装器,gms安装器安卓11版2021最新版-安卓11gms安装器2021最新版v4.8.5华为专版_新绿资源网...
- Dynamic resolution 动态分辨率 相机系列6
- 软件测试的风险分析与解决办法
- java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
- Axure幻灯片案例
- IE 浏览器中不能使remove删除节点的解决方法
- 计算机科学与技术专业就业方向及前景如何?
- js 日期增加加天数计算
- mp4格式封装工具MP4Box(十一)
- 【SQL注入漏洞-04】布尔盲注靶场实战
- android icloud云盘,icloud备份恢复到安卓手机(全方面了解iCloud轻松玩转iCloud)
- 用 Go 构建一个区块链 -- Part 2: 工作量证明
- java poi预览word文档_apache poi操作office文档----java在线预览txt、word、ppt、execel,pdf代码...
热门文章
- MySQL 调优/优化的 101 个建议!
- 3分钟了解“关联规则”推荐
- 漫画:什么是一致性哈希
- Java Excel导出
- ssm使用全注解实现增删改查案例——applicationContext-servlet.xml
- 最全三大框架整合(使用映射)——IDeptDao.java
- Python缩进的几个原则
- 2019蓝桥杯省赛---java---A---8(修改数组)
- mybatis-plus 错误java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
- Centos7安装apt-get 在centos下用yum install xxx 不是使用apt-get