如何将对象传递给REST Get方法

时间:2017-09-19 02:12:40

标签: rest jersey

我正在使用Jersey Rest实施。有一个名为HelloWorld的休息服务。请参阅以下代码。 请将此代码视为参考而非编译代码。

@Path("helloWorld")
public class HelloWorld{

  @Path("test")
  @Produces(...)
  @Consum(...)
  @GET
  public Response test(Person person){
    System.out.println(person);
  }
}

我正在使用Jersey客户端发送请求。 这里我的问题是除了POST方法有没有办法直接将对象发送到GET方法。而不是QueryString。

如果有任何办法,请告诉我。

由于

1 个答案:

答案 0 :(得分:0)

所以问题不应该在服务器上。我在不同的服务器上做了一些测试(不是weblogic,因为我没有使用它),所有这些测试似乎都没有接受GET请求中的正文。问题似乎与客户有关。为了测试,我使用了以下代码

ClientBuilder.newClient()
        .target("http://localhost:8080/api/get-body")
        .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true)
        .request()
        .method(HttpMethod.GET, Entity.text("Hello World"));

SUPPRESS_HTTP_COMPLIANCE_VALIDATION允许我们将正文传递给请求。如果我们不使用它,那么我们会得到一个错误。

这段代码的问题在于,即使我们设置了这个覆盖属性,客户端也会完全覆盖GET方法并自动使其成为POST方法,所以我会回到405方法不允许。

我提出的解决方案是只允许客户端设置标题,例如X-GET-BODY-OVERRIDE,然后在服务器端使用@PreMatching过滤器来检查此标头。如果标题存在,则只需将方法更改为GET

@Provider
@PreMatching
public class GetWithBodyFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext request) throws IOException {
        String getOverride = request.getHeaderString("X-GET-BODY-OVERRIDE");
        if (getOverride != null && "true".equalsIgnoreCase(getOverride)) {
            request.setMethod(HttpMethod.GET);
        }
    }
}

然后只需在服务器端注册过滤器。在客户端上,您只需添加标题

ClientBuilder.newClient()
        .target("http://localhost:8080/api/get-body")
        .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true)
        .request()
        .header("X-GET-BODY-OVERRIDE", "True")
        .method(HttpMethod.GET, Entity.text("Hello World"));

这个解决方案很好,因为它不仅仅考虑了Jersey客户端,因为它能够在GET请求中发送正文。