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

时间:2018-03-17 19:01:48

标签: java rest jax-rs

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

我试图这样做:

Response r = target.request().method(method, Entity.text(body));

我将method设置为GET,将body设置为my get body。但是,使用这种方法我得到一个例外:

javax.ws.rs.ProcessingException: RESTEASY004565: A GET request cannot have a body.

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

(这不是HTTP GET with request body的重复,因为我在询问如何在JAX-RS中使用body创建GET请求,而不是应该这样做。)

1 个答案:

答案 0 :(得分:2)

这取决于您的JAX-RS实现。可以使用SUPPRESS_HTTP_COMPLIANCE_VALIDATION属性

在Jersey 2.25中禁用此检查
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"));

而不是例外,您将获得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.

但是在RESTEasy 3.5.0.Final中,URLConnectionEngineApacheHttpClient4Engine都进行了硬编码检查:

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

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

ClientHttpEngine engine = new MyEngine();
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();