如何在 JAX-RS 中向 GET 请求添加正文

Mig*_*ida 6 java rest jax-rs

我正在尝试使用一个 REST API,它需要一个带有 GET 请求的主体。但是由于 GET 通常没有正文,所以我找不到在我的请求中附加正文的方法。我也在构建 REST API,但教授不允许我们将方法更改为 POST(他给了我们一个我们要创建的端点列表,不多也不少)。

我正在尝试这样做:

Response r = target.request().method(method, Entity.text(body));
Run Code Online (Sandbox Code Playgroud)

我在哪里设置methodtoGETbodyto my get body。但是,使用这种方法我得到一个例外:

javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.
Run Code Online (Sandbox Code Playgroud)

有没有办法用 JAX-RS 做到这一点?我们学会了使用 JAX-RS,所以我更喜欢使用它的解决方案,因为我不确定我的教授会允许我们使用任何其他 REST 客户端。我目前正在使用 WildFly 服务器提供的 RESTEasy。

(这不是带有请求正文HTTP GET的副本,因为我问的是如何在 JAX-RS 中创建带有正文的 GET 请求,而不是是否应该这样做。)

Kar*_*cki 4

这取决于您的 JAX-RS 实现是什么。可以使用以下属性在 Jersey 2.25 中禁用此检查SUPPRESS_HTTP_COMPLIANCE_VALIDATION

ClientConfig config = new ClientConfig();
config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
JerseyClient client = JerseyClientBuilder.createClient(config);
WebTarget target = client.target(URI.create("https://www.stackoverflow.com"));
Response response = target.request().method("GET", Entity.text("BODY HERE"));
Run Code Online (Sandbox Code Playgroud)

您将得到一个 INFO 日志,而不是异常

INFO: Detected non-empty entity on a HTTP GET request. The underlying HTTP transport connector may decide to change the request method to POST.
Run Code Online (Sandbox Code Playgroud)

URLConnectionEngine然而,在 RESTEasy 3.5.0.Final 中,和都有硬编码检查ApacheHttpClient4Engine

if (request.getEntity() != null)
{
  if (request.getMethod().equals("GET")) throw new ProcessingException(Messages.MESSAGES.getRequestCannotHaveBody());
Run Code Online (Sandbox Code Playgroud)

您必须创建自己的实现才能ClientHttpEngine跳过此步骤。然后你需要在构建客户端时提供它:

ClientHttpEngine engine = new MyEngine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
Run Code Online (Sandbox Code Playgroud)

  • @MiguelAlmeida 我已经更新了我的答案。在 RESTEasy 中没有好的方法可以做到这一点。如果你的教授要求使用一个有问题的端点和无法处理它的库,他就不知道他在做什么。 (2认同)