Red Hat Training

A Red Hat training course is available for Red Hat Fuse

49.3. 构建 Client Invocation

概述

构建目标 URI 后,使用 WebTarget 构建器类,下一步是配置请求的其他方面,如 HTTP 标头、cookies 等,使用 Invocation.Builder 类。构建调用的最后一步是调用适当的 HTTP 动词(GET、POST、PUT 或 DELETE),并提供消息正文(如果需要)。

invocation.Builder 类

javax.ws.rs.client.Invocation.Builder 构建器类提供 fluent API 的一部分,使您能够构建 HTTP 消息的内容并调用 HTTP 方法。

创建调用构建器

若要创建 Invocation.Builder 实例,可在 javax.ws.rs.client.client.WebTarget 实例中调用其中一个 请求 方法。例如:

// Java
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.client.Invocation.Builder;
...
WebTarget books = client.target("http://example.org/bookstore/books/123");
Invocation.Builder invbuilder = books.request();

定义 HTTP 标头

您可以使用标头方法在请求消息中添加 HTTP 标头,如下所示:

Invocation.Builder invheader = invbuilder.header("From", "fionn@example.org");

定义 Cookie

您可以使用 Cookie 方法在请求消息中添加 Cookie,如下所示:

Invocation.Builder invcookie = invbuilder.cookie("myrestclient", "123xyz");

定义属性

您可以使用属性方法在这个请求上下文中设置属性,如下所示:

Invocation.Builder invproperty = invbuilder.property("Name", "Value");

定义可接受的媒体类型、语言或编码

您可以定义接受的介质类型、语言或编码,如下所示:

Invocation.Builder invmedia = invbuilder.accept("application/xml")
                                        .acceptLanguage("en-US")
                                        .acceptEncoding("gzip");

调用 HTTP 方法

构建 REST 调用的过程通过调用 HTTP 方法(执行 HTTP 调用)终止。可以调用以下方法(继承 javax.ws.rs.client.SyncInvoker 基础类):

get
post
delete
put
head
trace
options

如果您想要调用的特定 HTTP 动词不在此列表中,您可以使用通用方法来调用任何 HTTP 方法。

输入的响应

所有 HTTP 调用方法都附带一个未键入的变体和类型变体(采用额外参数)。如果您使用默认的 get () 方法调用请求(不使用任何参数),则从调用返回 javax.ws.rs.core.Response 对象。例如:

Response res = client.target("http://example.org/bookstore/books/123")
                     .request("application/xml").get();

但是,也可以使用 get (Class<T>) 方法要求以特定类型形式返回响应。例如,要调用请求并要求将响应作为 BookInfo 对象返回:

BookInfo res = client.target("http://example.org/bookstore/books/123")
                     .request("application/xml").get(BookInfo.class);

但是,为了解决这个问题,您必须使用 客户端 实例注册合适的 实体提供程序,该供应商可以将响应格式 application/xml 映射到请求的类型。有关实体供应商的详情,请参考 第 49.4 节 “解析请求和响应”

在创建后指定传出消息

对于在请求中包含消息正文的 HTTP 方法(如 POST 或 PUT),您必须将消息正文指定为方法的第一个参数。消息正文必须指定为 javax.ws.rs.client.Entity 对象,其中 Entity 封装了消息内容及其关联的媒体类型。例如,要调用 POST 方法,其中消息内容作为 String 类型提供:

import javax.ws.rs.client.Entity;
...
Response res = client.target("http://example.org/bookstore/registerbook")
                     .request("application/xml")
                     .put(Entity.entity("Red Hat Install Guide", "text/plain"));

如有必要,实体.entity () 构造器方法会自动将提供的消息实例映射到指定介质类型(使用注册的实体提供程序)。始终可以将消息正文指定为简单的 String 类型。

延迟调用

您可以选择创建 javax.ws.rs.client.client.Invocation 对象,而不是立即调用 HTTP 请求(例如,可以通过调用 get () 方法)。Invocation 对象 封装 待处理的调用的所有详情,包括 HTTP 方法。

以下方法可用于构建 Invocation 对象:

buildGet
buildPost
buildDelete
buildPut
build

例如,要创建 GET Invocation 对象并稍后调用它,您可以使用类似如下的代码:

import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Response;
...
Invocation getBookInfo = client.target("http://example.org/bookstore/books/123")
                     .request("application/xml").buildGet();
...
// Later on, in some other part of the application:
Response = getBookInfo.invoke();

异步调用

JAX-RS 2.0 客户端 API 支持客户端一侧异步调用。要进行异步调用,只需在以下 request () 链中调用 async () 方法。例如:

Future<Response> res = client.target("http://example.org/bookstore/books/123")
                     .request("application/xml")
                     .async()
                     .get();

当您进行异步调用时,返回的值是 java.util.concurrent.Future 对象。有关异步调用的详情,请参阅 第 49.6 节 “客户端上的异步处理”