REST –代表性状态转移是一种用于访问Web信息的体系结构样式。 这变得越来越流行,并且是一种访问Web服务的简便方法。 在REST架构样式中,服务器端可用的信息被视为资源,并且可以使用Web(统一资源标识符(URI))和Web协议HTTP以统一的方式访问这些资源。 由于首选使用HTTP作为通信协议,因此REST将架构限制为本质上是无状态的客户端-服务器架构。 网络上的资源由URI标识。 使用REST原理创建和访问的Web服务称为RESTful Web服务。

RESTful Web服务将HTTP协议的方法用于它们执行的操作。 HTTP方法POST,GET,PUT和DELETE可以映射到诸如创建,读取,更新和删除(CRUD)之类的操作。 可以使用JAX-RS( 用于RESTful Web服务的Java API)构建Java中的RESTful Web服务 ,该API是Java EE 6平台的一部分,它完全支持REST原理。

JAX-RS –简介

JAX-RS (JSR311)是Java编程API,已包含在新的Java EE 6平台中。 JAX-RS旨在简化使用REST原理/体系结构以Java开发应用程序的过程。 JAX-RS遵循Java EE的目标-简单和易于开发。 JAX-RS API使用注释,这使使用REST体系结构的Web服务开发变得简单而容易。 借助JAX-RS API提供的注释,类和接口,可以将简单的POJO公开为Web资源。 由于这在很大程度上取决于注释,因此JAX-RS需要Java 5及更高版本。 与Java中的任何其他Web应用程序类似,JAX-RS应用程序捆绑在WAR文件中,并部署在支持Servlet的容器​​上。 供应商提供的Servlet用于将请求路由到适当的Web资源。 JAX-RS的目标之一是使Web资源可跨不同类型的Web容器部署,从而实现可移植性。

使用JAX-RS开发RESTful Web服务

Java的RESTful Web服务可以借助JAX-RS的任何实现来创建。 以下软件包中提供了用于使用JAX-RS创建RESTful Web服务的类和接口:

•javax.ws.rs

•javax.ws.rs.core

•javax.ws.rs.ext

资源类别

JAX-RS允许POJO通过注释将功能公开为Web服务。 根据JAX-RS,“资源”是Java类(POJO),它使用JAX-RS批注来实现Web资源。 在Java类上使用@Path注释将其标识为Resource类。

用Java构建Web服务

此类包装为WAR文件的一部分,并带有JAX-RS实现提供的Servlet条目(例如,Jersey)。 然后,将WAR文件部署在提供对JSR 311支持的容器(例如Glassfish )中。然后使用常规URI http:// hostname:portnumber / WARfilename / stockquote访问资源。

用Java构建Web服务

这将导致使用@Path注释注释的此类的调用,该注释的值与URI的对应值匹配。

资源类别的生命周期

将为对该资源的每个请求创建一个资源类的新实例。 资源的生命周期从创建对象开始,调用构造函数,然后注入所需的依赖项。 调用适当的资源方法,并在提供响应后,使该对象可用于垃圾回收。

资源方法

资源方法是使用请求方法指示符注释标识的“ Resource ”类的公共方法。 该规范通过定义明确的类和接口为HTTP协议和URI提供了清晰的映射。 如前所述,在RESTful Web服务中,HTTP方法映射到它们执行的CRUD(创建,读取,更新和删除)操作。 请求方法指示符是用于标识处理HTTP请求的方法的注释,而JAX-RS为HTTP方法(例如GET,POST,PUT,DELETE和HEAD)定义注释。 JAX-RS还允许创建用户定义的定制请求方法指示符。

根据HTTP方法请求调用相应的请求方法指示符。 例如,如果请求来自HTTP GET请求,则使用@GET注释进行注释的方法将自动被调用并提供响应。 但是,对于HEAD和OPTIONS之类的HTTP方法请求,提供了一些自动化支持。 当HEAD请求到来时,将调用以@HEAD请求方法指示符注释的方法,如果没有这样的请求方法指示符,则默认情况下将调用@GET而不提供任何响应。 但是,这将对性能产生一些影响。 具有请求指示符批注的方法的返回值通常为void,Java语言类型或javax.ws.rs.core.Response类型的响应对象。

用Java构建Web服务

用Java构建Web服务

资源方法可以具有一组参数。 其中一些参数将带有注释,而其他一些则不会。 可以使用以**释之一对方法参数进行注释:

用Java构建Web服务

调用该方法时,根据请求的语义映射适当的参数。 注释的参数称为“ 实体参数”,其值是从请求实体主体映射的。 规范不允许每种方法使用多个实体参数。

用Java构建Web服务

如前所述,资源方法的返回值可以是void,响应对象或任何其他Java类型。 对于HTTP请求,使用将请求实体主体映射到方法参数的JAX-RS API提供的MessageBodyReader类。 同样,对于HTTP响应,要将返回值映射到响应实体主体,则使用MessageBodyWriter。 这些类负责Java类型与实体主体之间的转换。 需要返回不属于标准Java类型的其他类型的方法应返回Response对象的实例。 资源方法还可以引发任何检查或未检查的异常。

URI模板

众所周知,根资源类是使用@Path注释标识的。 批注的值可以具有在花括号{,}之间提及的相对URI路径模板,并引用由部署上下文提供的基本URI。 URI路径模板充当相对路径URI的占位符。 URI路径模板通常是一个包含零个或多个嵌入式参数的字符串。 将值应用于参数时,将形成有效的URI路径。

用Java构建Web服务

在以下示例中,Stock资源类由相对URI路径stock / abc标识,其中abc是符号参数的值。 但是'{'和'}'不会出现在URI中,因为它是无效的,仅用于指定URI模板。 可以在方法中使用@PathParam批注作为URI路径一部分中的参数值来检索symbol参数的值。 URI模板参数可以选择具有正则表达式。

用Java构建Web服务

同样,参数注释@FormParam将有助于从请求中的表单元素获取信息。

用Java构建Web服务

子资源

除了Resource类之外,资源类的方法也可以使用@Path注释进行注释。 当使用@Path注释对方法进行注释时,这些方法称为子资源方法或子资源定位符

子资源方法

资源类中用@Path注释以及请求方法指示符注释(例如@ GET,@ POST等)注释的方法称为子资源方法 将通过将方法的URI模板与资源类的URI模板连接在一起而创建的URI请求调用子资源方法。

用Java构建Web服务

在上面的示例中,来自URI / sayHello / lastname的GET请求将由SayHello资源类中的hello()子资源方法直接处理。

子资源定位器

用@Path注释注释的资源类中用于动态标识将处理请求的对象的方法称为“ 子资源定位符” 这些方法的返回值通常是将处理请求的资源类的对象。 子资源

定位器类似于普通资源方法,但是不能具有实体参数。

JAX-RS支持的用于请求和响应的MIME类型

MIME媒体类型用于标识HTTP请求实体和表示形式。 资源类可以产生或使用任何MIME类型。 注释用于为资源类或资源方法上的请求和响应指定MIME媒体类型。 注释@Produces用于指定响应的MIME类型(可以由资源生成并发送回客户端的表示形式),@ Consumes用于指定请求的MIME类型(资源可以接受的表示形式) HTTP请求实体或使用客户端发送的内容)。 为了指定简单的“文本/纯文本” MIME,将使用@Produces(“文本/纯文本”)和@Consumes(“文本/纯文本”)。

用Java构建Web服务

如果MIME类型为HTML,则将“ text / html”用作@Produces和@Consumes批注的值。

用Java构建Web服务

如果HTTP请求不支持资源方法的注释@Produces的值(如果它不是标头的一部分– HTTP请求中的Accept ),那么将不会调用该资源方法。 同样,如果资源方法的注释@Consumes的值与HTTP请求中的标头– Content-Type不匹配,则不会调用该资源方法。 如果不存在这些批注,则支持任何MIME类型(* / *)。

提供者

JAX-RS的提供程序可帮助在实体和关联的Java类型之间进行映射。 这些被称为实体提供者 JAX-RS支持的两种类型的实体提供程序是:

1. MessageBodyReader是一个类,用于将HTTP请求实体主体映射到方法参数。

2. MessageBodyWriter是一个类,用于将返回值映射到HTTP响应实体主体。 默认情况下,MessageBodyReader和MessageBodyWriter自动支持某些类型,它们被称为标准类型。 以下是标准类型:

•byte [] –所有媒体类型(* / *)

•java.lang.String –所有媒体类型(* / *)

•java.io.InputStream –所有媒体类型(* / *)

•java.io.Reader-所有媒体类型(* / *)

•java.io.File –所有媒体类型(* / *)

•javax.activation.DataSource –所有媒体类型(* / *)

•javax.xml.transform.Source –仅适用于XML Media类型

(文本/ xml,应用程序/ xml,应用程序/ * + xml)

•javax.xml.bind.JAXBElement和应用程序提供的JAXB类–仅适用于XML媒体类型(text / xml,application / xml,application / * + xml)

•MultivaluedMap <String,String> –表单内容(应用程序/ x-www-form-urlencoded)

•StreamingOutput –所有媒体类型(* / *),仅适用于MessageBodyWriter如果应用程序选择不使用任何标准类型,则方法可以返回使用ResponseBuilder类构建的Response对象。

JAX-RS允许从/到表示和实体主体编写自定义映射。 这样的类将提供自定义映射,并在@Provider处进行注释,并实现MessageBodyReader或MessageBodyWriter类。 Entity Provider也是一个带有@Provider注释的资源类,并实现了JAX-RS API。 @Provider批注可以与@Produces和@Consumes批注一起使用,如下所示:

用Java构建Web服务

stock参数的值将使用StProvider类从请求实体主体映射。 类似地,当必须从表示形式到响应实体主体进行映射时,将使用StockProvider类。

语境

为了处理部署环境和单个请求,JAX-RS为资源类和提供程序提供了不同类型的Context 注释@Context用于获取与请求或响应相关的Java类型。 JAX-RS提供的不同类型的上下文是:

UriInfo提供有关请求URI组件的信息。 提供了有关静态和动态请求URI的信息。 但是,所提供的信息仅对每个请求有效。 使用@Context批注将UriInfo的实例注入到类的字段或方法的参数中。

用Java构建Web服务

•在上面的示例中,使用Context注入类型为UriInfo的对象作为方法参数,该方法的方法提供对请求URI信息的访问。

•标头: HttpHeaders提供有关请求标头的信息。 通常,信息以地图的形式提供。 使用@Context批注将HttpHeader的实例注入到类的字段或方法的参数中。 HttpHeaders的方法提供对请求信息的访问。

用Java构建Web服务

用Java构建Web服务

请求:提供了请求接口,用于内容协商和评估某些前提条件。 使用@Context批注将请求的实例注入到类的字段或方法的参数中。

安全性: SecurityContext提供有关请求的安全性上下文的信息。 使用SecurityContext,可以从请求中检索有关用户,组和角色的信息,它还有助于识别使用的身份验证方案以及请求是否使用https。 使用@Context批注将SecurityContext的实例注入到类的字段或方法的参数中。

上面提到的所有上下文对于部署JAX-RS根资源类或提供程序的所有容器均可用。 除了这些标准资源外,@ Context批注还可用于指定容器特定的资源。 例如,在基于Servlet容器的环境中,@ Context可用于注入HttpServletRequest,HttpServletResponse,ServletConfig和ServletContext类型的依赖项。

支持JAX-RS的框架

有几种支持JAX-RS规范的开源框架。 它们都为标准服务器端JAX-RS API和专有客户端API提供了良好的支持。 每个人都有其优点和缺点,并得到适当使用。 这里讨论其中一些:

  • 泽西岛:可以使用泽西岛(Jersey)用Java开发JAX-RS应用程序,这是Sun / Oracle的JAX-RS的开源产品质量参考实现。 Jersey实现了所有API,并提供了注释,以便使用REST样式轻松,快速地用Java创建Web服务。 除了JAX-RS定义的一组注释和功能外,Jersey还通过其自己的API(例如Jersey Client API)提供了许多其他功能。 Jersey可以单独下载,也可以与NetBeans 6.5以及Glassfish V3 Prelude捆绑在一起。 Jersey完全使用Maven构建。 Jersey提供了与Spring MVC之类的框架的良好集成。
  • RESTEasy是一个用于开发RESTful Web服务的JBoss框架,该框架完全受到JAX-RS规范的抱怨。 RESTEasy被设计为可在任何Servlet容器中运行,但由于其紧密集成,因此在JBoss Application Server中是首选。 RESTEasy的一个重要好处是除了提供对JAX-RS服务器端API的完全支持之外; 它带有强大的RESTEasy JAX-RS客户端框架,该框架允许将HTTP请求映射到远程服务器和接口代理。 它提供了与Google Guice,Spring和Spring MVC等其他框架的良好集成。 当需要与JBoss SEAM集成时,它是高度首选。
  • Apache CXF是一个开放源代码服务框架,可帮助同时使用JAX-WS和JAX-RS标准在Java中构建Web服务。 它支持从SOAP,REST HTTP和CORBA到JMS,JBI等传输器的各种协议。Apache CXF与Spring和JAX-WS服务提供了良好的集成,而Maven的使用使集成更加容易。 Apache CXF的好处是它提供了一种可插拔的体系结构,该体系结构通过任何传输支持XML和非XML绑定。
  • Apache Wink是一个开放源代码的简单而功能强大的框架,用于在Java中构建RESTful Web服务。 该框架专为REST支持而设计,与Apache CXF不同,后者同时支持基于SOAP和基于REST的Web服务。 Apache Wink带有两个模块:
  • a) Wink Server –是JAX-RS投诉服务器端API。 除了标准实现之外,它还为RESTful Web服务提供了其他功能。
  • b) Wink Client –是基于Java的客户端框架,有助于使用RESTful Web服务。 这是从java.net包中提供的HttpURLConnection类扩展的。
  • Restlet是Java的领先(最受青睐和最成熟的)开源RESTful Web框架,它不是JAX-RS的抱怨。 它的简单性和可伸缩性有助于将服务器端Web应用程序,Web客户端和Web服务混合到一个统一的Web应用程序中。 有一些扩展可以与JAX-RS集成。 Restlet的优势来自其独特的Java API ,该API可用于使用Java SE,Java EE,Google App Engine,Android和Google Web Toolkit等不同平台构建的应用程序。

结论

JAX-RS为以Java构建RESTful Web服务提供了良好的支持。 它很简单,并且提供了一种简单的方法来将POJO作为服务公开,并支持不同类型的表示形式。 JCP已经开始开发下一个版本的JAX-RS – JAX-RS 2.0,该版本的重点将更多地放在对标准化客户端API的需求上。 已经进行了讨论,以介绍对超媒体的支持,集成来自Apache的成熟的开放源代码客户端框架以及介绍架构-与JAX-RS编程模型兼容的MVC-JAX-RS MVC。 所有这些使JAXRS成为Java中RESTful Web服务更有希望的技术/标准。

致谢

作者衷心感谢ECOM研究小组副总裁Subrahmanya SV先生的所有鼓励,支持和不断的动力。 特别感谢Nitin KL先生从技术角度快速回顾了这一点。


翻译自: https://jaxenter.com/building-web-services-in-java-103218.html

相关文章:

  • 2022-01-18
  • 2022-12-23
  • 2021-12-14
  • 2021-05-05
  • 2022-12-23
  • 2022-12-23
  • 2021-06-23
  • 2022-02-14
猜你喜欢
  • 2022-01-12
  • 2021-12-06
  • 2022-12-23
  • 2021-10-05
相关资源
相似解决方案