49.3. 构建客户端调用


概述

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

invocation.Builder 类

javax.ws.rs.client.Invocation.Builder builder 类提供了 fluent API 的一部分,可让您构建 HTTP 消息的内容并调用 HTTP 方法。

创建调用构建器

要创建 Invocation.Builder 实例,请在 javax.ws.rs.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);

但是,为了正常工作,您必须将合适的 实体供应商 注册到 Client 实例,该实例能够将响应格式 application/xml 映射到请求的类型。有关实体供应商的详情,请参阅 第 49.4 节 “解析请求和响应”

在发布或放置中指定传出消息

对于在请求中包含消息正文(如 POST 或 PUT)的 HTTP 方法,您必须将消息正文指定为方法的第一个参数。邮件正文必须指定为 javax.ws.rs.client.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.entity () 构造器方法将自动使用注册的实体提供程序将提供的消息实例映射到指定的介质类型。始终可以将消息正文指定为一个简单的 String 类型。

延迟调用

您可以选择创建 javax.ws.rs.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 节 “客户端上的异步处理”

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.