我正在使用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。
如果有任何办法,请告诉我。
由于
答案 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请求中发送正文。