JAX-RS 2.0 REST 客户端

转载 2015年07月10日 13:43:57

JAX-RS 2.0对客户端API进行了标准化。客户端API通过HTTP请求Web资源,同样符合统一接口和REST架构风格。与Apache HTTP Client和HttpURLConnection相比,客户端API具备对REST感知的高层API,可以和Providers集成,返回值直接对应高层的业务类实例。

1. 客户端接口

REST客户端主要包括三个接口:javax.ws.rs.client.Client、javax.ws.rs.client.WebTarget和javax.ws.rs.client.Invocation。

1.1 Client接口

Client内部要管理客户端通信底层实现所需的各种对象,它是一个重量级的对象,应该尽量少地构造Client实例此外接口要求其实例要有关闭连接的保障,否则会造成内存泄露

Jersey对Client接口的实现类是JerseyClient。通常使用构造模式,使用ClientBuilder创建实例。示例如下:

ClientConfig clientConfig = new ClientConfig();
//注册Provider
clientConfig.register(MyProvider.class);
//注册Feature
clientConfig.register(MyFeature.class);
//注册Filter
clientConfig.register(new AnotherClientFilter());
//创建Client
Client client = ClientBuilder.newClient(clientConfig);
//通过property设置相关属性
client.property("MyProperty", "MyValue");

//配置完毕后,可以通过getConfiguration()获取配置信息
Configuration configuration = client.getConfiguration();
Map<String, Object> properties = configuration.getProperties();
Iterator<Entry<String, Object>> it = properties.entrySet().iterator();
...

Client接口还提供了对客户端的安全连接和异步支持。

1.2 WebTarget接口

WebTarget接口为REST客户端实现资源定位,可以定义请求资源的地址、查询参数和媒体类型等信息。Jersey中的WebTarget接口实现类是JerseyWebTarget。

WebTarget对象接收配置参数的方法是通过方法链,采用不变模式完成。如果分开写每次都返回一个新的WebTarget对象,如果不将其覆值会造成信息丢失。

WebTarget webTarget = client.target(BASE_URI);
webTarget.path("books").path("book").queryParam("bookId", "1");

1.3 Invocation接口

当WebTarget接口完成资源定位后,Invocation接口向REST服务端发起请求。请求包括同步和异步方式,由Invocation接口内部的Builder接口定义。Jersey中的Invocation接口实现类是JerseyInvocation。

final Invocation.Builder invocationBuilder = webTarget.request();

//以多种方式请求数据
final Book book = invocationBuilder.get(Book.class);
Response response = invocationBuilder.post(userEntity);
invocationBuilder.put(userEntity);

JAX-RS 2.0的REST框架无需开发者编码实现对客户端实例的资源管理,Response实例的readEntity()在返回响应实体的同时,就完成了对客户端资源的释放。

2. Connector

Connector接口是REST客户端底层连接器接口,Jersey提供了4个实现:

  • HttpUrlConnector REST客户端的默认连接器
  • ApacheConnector
  • GrizzlyConnector
  • InMemoryConnector 不是真实的HTTP连接器,而是使用JVM调用来模拟HTTP请求访问。

2.1 默认连接器

默认情况下,Jersey的Client初始化时会构造一个HttpUrlConnector实例作为连接器。

2.2 Apache连接器

ApacheConnector是基于Apache HTTP Client的连接器实现,比默认连接器功能更完整。可以实现代理服务器设置、超时设置。示例如下:

final ClientConfig clientConfig = new ClientConfig();

//代理服务器配置
clientConfig.property(ApacheClientProperties.PROXY_URI, "http://192.168.0.100");
clientConfig.property(ApacheClientProperties.PROXY_USERNAME, "user");
clientConfig.property(ApacheClientProperties.PROXY_PASSWORD , "pwd");
//连接超时配置
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 1000);
//读取超时配置,指连接和资源定位成功后,客户端接收服务响应的最长时间
clientConfig.property(ClientProperties.READ_TIMEOUT, 2000);

clientConfig.connectorProvider(new ApacheConnectorProvider());
client = ClientBuilder.newClient(clientConfig);

2.3 Grizzly连接器

GrizzlyConnector是Grizzly提供的连接器实现,内部使用异步处理客户端com.ning.http.client.AsyncHttpClient类作为底层的连接。

final ClientConfig clientConfig = new ClientConfig();
clientConfig.property("TestKey", "TestValue");

clientConfig.connectorProvider(new GrizzlyConnectorProvider());
Client client = ClientBuilder.newClient(clientConfig);

2.4 HTTP连接池

既然Client是一个重型组件,因此频繁地创建Client实例会影响总体性能。一种常见的解决方案是使用HTTP连接池来管理连接。下例使用ApacheConnector来实现HTTP连接池:

final ClientConfig clientConfig = new ClientConfig();
final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
//设置最大连接数
cm.setMaxTotal(20000);
//设置每条路由的默认最大连接数
cm.setDefaultMaxPerRoute(10000);
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, cm);

clientConfig.connectorProvider(new ApacheConnectorProvider());
client = ClientBuilder.newClient(clientConfig);

后记

通常REST式的Web服务会按模块分别提供独立的Web服务,而模块之间的调用通过Web服务的REST API来实现。也就是说每个模块对其他模块的调用就是客户端请求。为了避免每次请求时重复编写构造客户端实例的代码,可以封装Client到公共模块,减少代码冗余。

参考:《Java RESTful Web Service实战》

转载自:http://blog.ubone.com/blog/2015/04/12/rest-ke-hu-duan/

用Jersey构建RESTful服务4--通过jersey-client客户端调用Jersey的Web服务模拟CURD

一、总体说明 通过jersey-client接口,创建客户端程序,来调用Jersey实现的RESTful服务,实现增、删、改、查等操作。 服务端主要是通过内存的方式,来模拟用户的增加、删除、修改、查询...
  • kkkloveyou
  • kkkloveyou
  • 2014年03月19日 10:43
  • 33922

jersey Rest请求URI路径构造

https://jersey.java.net/nonav/documentation/latest/user-guide.html Table of Contents Preface1....
  • zeng_84_long
  • zeng_84_long
  • 2013年06月02日 12:15
  • 14373

Jersey Client api 基本使用

Jersey client api 基本使用。 1.必须通过ClientBuilder工厂初始化Client实例; Client client = ClientBuilder.newClient();...
  • yanghanxiu
  • yanghanxiu
  • 2016年11月07日 23:43
  • 3529

JAX-RS 2.0 REST客户端编程实例

导读 JAX-RS 2.0 又称 JSR 339 不仅定义了一套用于构建 RESTful 网络服务的 API,同时也通过增强客户端 API 功能简化了REST 客户端的构建过程。 JA...
  • zheng963
  • zheng963
  • 2015年06月17日 09:48
  • 1719

CXF系列之JAX-RS:CXF发布与调用REST服务

今天我们将视角集中在 REST 上,它是继 SOAP 以后,另一种广泛使用的 Web 服务。与 SOAP 不同,REST 并没有 WSDL 的概念,也没有叫做“信封”的东西,因为 REST 主张用一种...
  • u013313550
  • u013313550
  • 2016年11月30日 15:57
  • 1640

cxf jax-rs client 笔记。

参考:http://cxf.apache.org/docs/jax-rs-client-api.html 第一步:          根据WS服务端提供的信息 编写一个Service接口 例...
  • is_zhoufeng
  • is_zhoufeng
  • 2012年12月22日 09:47
  • 4545

第1章 JAX-RS 2.0 入门

RPC(Remote Procedure Call Protocol) :远程过程调用协议。 JAX-WS全称是JavaTM API forXML-Based Web Services  JAX-R...
  • u010819416
  • u010819416
  • 2016年06月23日 21:33
  • 669

JAX-RS 2.0 REST 请求处理

本章学习REST请求的完整处理过程,其中涉及JAX-RS 2.0定义的Provider及其两个特殊类型:过滤器和拦截器。 REST风格的框架都从容器级别支持AOP式开发,Jersey内置AOP支...
  • joeyon
  • joeyon
  • 2016年10月31日 18:25
  • 1622

Eclipse Java EE工程报错:JAX-RS (REST Web Services) 2.0 can not be installed、JAX-RS (REST Web Services) 2

导入了一个Java EE SDK7 里面的工程,Eclipse报错JAX-RS (REST Web Services) 2.0 can not be installed : One or more c...
  • zwt0909
  • zwt0909
  • 2016年09月21日 14:04
  • 2950

restful web service学习1-JAX-RS 2.0入门

1.4个概念 1)REST:一种跨平台、跨语言的架构风格。 2)REST式的WEB服务:REST在WEB领域的实现。 3)JAX-RS标准:在JAVA领域,对REST式的WEB服务制定的实现标准...
  • u010059036
  • u010059036
  • 2016年07月14日 14:23
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAX-RS 2.0 REST 客户端
举报原因:
原因补充:

(最多只允许输入30个字)