我想将REST请求转发给另一台服务器。
我将JAX-RS与Jersey和Tomcat一起使用。我尝试设置See Other
响应并添加Location
标头,但这不是真正的前进。
如果我使用:
request.getRequestDispatcher(url).forward(request, response);
我明白了:
java.lang.StackOverflowError
:如果网址是相对路径java.lang.IllegalArgumentException
:路径http://website.com不以/
字符开头(我认为转发仅在同一个servlet上下文中合法)。如何转发请求?
答案 0 :(得分:4)
RequestDispatcher
允许您将请求从servlet转发到同一服务器上的另一个资源 。有关详细信息,请参阅此answer。
您可以使用JAX-RS Client API并将资源类作为代理播放,以将请求转发到远程服务器:
@Path("/foo")
public class FooResource {
private Client client;
@PostConstruct
public void init() {
this.client = ClientBuilder.newClient();
}
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response myMethod() {
String entity = client.target("http://example.org")
.path("foo").request()
.post(Entity.json(null), String.class);
return Response.ok(entity).build();
}
@PreDestroy
public void destroy() {
this.client.close();
}
}
如果重定向适合您,您可以使用Response
API:
Response.seeOther(URI)
:用于POST后重定向(又称POST /重定向/ GET)模式。Response.temporaryRedirect(URI)
:用于临时重定向。参见示例:
@Path("/foo")
public class FooResource {
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response myMethod() {
URI uri = // Create your URI
return Response.temporaryRedirect(uri).build();
}
}
值得一提的是,UriInfo
可以在您的资源类或方法中注入,以获取一些有用的信息,例如base URI和absolute path of the request。
@Context
UriInfo uriInfo;