什么是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标头中的参数。 这是这些方法的列表。 如您所见,有一些便捷的方法可以返回MediaTypeLocal

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring的事件

理论 异步的实现方式可以使用事件&#xff0c;或者异步执行&#xff1b; spring中自带了事件的支持&#xff0c;核心是ApplicationEventPublisher; 事件包括三个要点&#xff1a; 事件的定义&#xff1b;事件监听的定义&#xff1b;发布事件&#xff1b;实战 代码路径&#xff…

[多项式算法]多项式求逆 学习笔记

多项式求逆 和整数的乘法逆元定义类似&#xff0c;对于多项式\(A(x)B(x)1\)&#xff0c;则称\(A(x),B(x)\)互为乘法逆元。 \(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。 现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元&#xff1a; 考虑倍增&…

java jax-rs_在Java EE 6中将Bean验证与JAX-RS集成

java jax-rsJavaBeans验证&#xff08;Bean验证&#xff09;是Java EE 6平台的一部分提供的新验证模型。 约束通过以JavaBeans组件&#xff08;例如托管Bean&#xff09;的字段&#xff0c;方法或类上的注释形式的约束来支持Bean验证模型。 javax.validation.constraints包中提…

ubuntu16.04+cuda9.0_cudnn7.5+tensorflow-gpu==1.12.0

1、查找可用的tensorflow源&#xff0c;该命令运行后终端会输出所有可用的源 anaconda search -t conda tensorflow2、这里name是上一步中输出源的tensorflow name栏的名称&#xff0c;show命令会在终端输出该源具体的信息和下载需要的指令,执行后如图&#xff1a; anaconda sh…

介绍OpenHub框架

本文介绍了OpenHub框架 -基于Apache Camel的新的开源集成解决方案。 本文回答了一些问题&#xff0c;为什么您应该关心另一个集成框架&#xff0c;强弱属性以及如何使用OpenHub启动新项目。 OpenHub框架是Apache Camel&#xff0c;但经过改进…… 当然&#xff0c;您只能使用A…

问题 1072: 汽水瓶

题目描述有这样一道智力题&#xff1a;“某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶&#xff0c;她最多可以换多少瓶汽水喝&#xff1f;”答案是5瓶&#xff0c;方法如下&#xff1a;先用9个空瓶子换3瓶汽水&#xff0c;喝掉3瓶满的&#xff0…

呼叫我或异步REST

本文是使用Spring Boot Java 8创建的工作正常的异步REST应用程序的非常简单的示例。SpringBoot使得开发Web应用程序几乎非常容易&#xff0c;但是为了简化任务&#xff0c;我从Spring存储库中举了一个例子&#xff0c;称为rest- service &#xff0c;将其分叉到我自己的存储库…

NOIP模拟测试22「位运算」

范围n-----$100000$ m $30$ 输出方案 这是一个很好的$dp$题 首先我们应该看出来一条性质只要你最后有方案达到$n$个$1$&#xff0c;那么你可以达到任何一种$n$个$1$的情况 例如 你最后可以达到$3$个$1$ 那么你可以达到$11100 $ $ 01110$ $01011$ $01101$等方案 证明&a…

系统测试集成测试单元测试_等待正确的时刻–集成测试

系统测试集成测试单元测试当您必须测试多线程程序时&#xff0c;总是需要等到系统达到特定状态为止&#xff0c;此时测试可以验证是否已达到正确的状态。 这样做的通常方法是在系统中插入一个“探针”&#xff0c;该探针将向同步原语发出信号 &#xff08;例如Semaphore &…

Apollo的基本概念和集成实战

基本概念 使用场景 是一个分布式的配置中心。适用于微服务&#xff1b; 核心功能 集中管理不同环境&#xff0c;不同集群的配置&#xff1b;配置修改后可以实时推送到应用端&#xff1b;具备规范的权限&#xff0c;流程治理特性&#xff1b;开发技术 服务端使用springboot,spri…

flatMap()和事件顺序– RxJava常见问题解答

正如我们已经发现的&#xff0c; flatMap()不会保留原始流的顺序。 让我们使用上一篇文章的GeoNames API示例进行说明 &#xff1a; public interface GeoNames {Flowable<Long> populationOf(String city);}通过使用flatMap()请求多个城市的人口&#xff0c;我们不能保…

技术管理规划-从哪入手?

前言 最近在学习技术管理课程&#xff0c;对学习的内容做一些笔记&#xff0c;结合当前的工作环境在对应的知识点上做一些思考&#xff0c;慢慢建立自己的团队管理方法论。 学习方法 早上骑单车的时候或者跑步的时候听音频&#xff0c;熟悉课程内容&#xff1b;仔细阅读文字&am…

NOIP模拟测试23「mine·water·gcd」

mine 题解 一道比较水的dp 考试因为初始化挂掉了只有$80$分 代码有注释 #include<bits/stdc.h> using namespace std; //无脑dp #define ll long long #define A 2222222 const ll mod1e97; //设f[x][5][2]为当前是第x个格子,当前填什么 0前面填1后面填 ll f[A][5][2]; /…

在AWS中设置Cassandra集群

Apache Cassandra是一个NoSQL数据库&#xff0c;它使用一致的哈希机制可以轻松进行水平扩展。 七年前&#xff0c;我尝试了它&#xff0c;并决定不将其用于我的附带项目&#xff0c;因为它太新了。 现在情况有所不同&#xff0c;Cassandra早已建立起来&#xff0c;背后有一家公…

k8s停止服务_使用 K8S 几年后,这些技术专家有话要说

9 月 7 日下午&#xff0c;在深圳南山软件产业基地&#xff0c;腾讯云 K8S & 云原生技术开放日成功落幕&#xff0c;来自腾讯、灵雀云、超参数科技、虎牙等资深技术专家与现场开发者共同探讨企业落地 K8S 的过程中遇到的难点以及解决问题的方法。K8S 逐渐成为容器编排的标准…

spring的事件机制实战

理论 在分布式场景下&#xff0c;实现同步转异步的方式有三种方式&#xff1a; 1.异步线程池执行&#xff1b;比如借助Asyn注解&#xff0c;放到spring自带的线程池中去执行&#xff1b; 2.放到消息队列中&#xff0c;在消费者的代码中异步的消费&#xff0c;执行相关的逻辑&am…

苹果wifi网速慢怎么办_所以,WiFi和4G到底哪个更耗电?

来源 | 中科院物理所(ID&#xff1a;cas-iop)编辑 | 椒盐猫巨烦现代人行走江湖&#xff0c;必备三件法宝&#xff1a;手机&#xff0c;网络&#xff0c;充电宝。即便在4G基站遍布各个旮旮角角的今天&#xff0c;当你带着心仪的人儿走进一家咖啡店&#xff0c;第一件事仍然是低声…

问题 1073: 弟弟的作业

题目描述你的弟弟刚做完了“100以内数的加减法”这部分的作业&#xff0c;请你帮他检查一下。每道题目&#xff08;包括弟弟的答案&#xff09;的格式为abc或者a-bc&#xff0c;其中a和b是作业中给出的&#xff0c;均为不超过100的非负整数&#xff1b;c是弟弟算出的答案&#…

苹果4怎么越狱_苹果手机如何截屏

很多用过苹果手机的用户对苹果的评价可是非常高对&#xff0c;苹果手机最大的特点便是手感好&#xff0c;并且使用一年以上也不会卡机现象&#xff0c;因此苹果手机才得到了广泛的关注。苹果手机的截屏程序与安卓手机不同&#xff0c;一般情况下&#xff0c;安卓手机是可以设置…

简单的Spring Boot管理员设置

Spring Boot Admin是一个不错的仪表板&#xff0c;用于监视您的Spring Boot应用程序。 但是&#xff0c;设置它并不是一件容易的事。 该文档概述了两个选项 &#xff1a; 在连接到admin应用程序的启动应用程序中包括一个客户端库–这要求将admin应用程序部署在公共位置或至少可…