【问题标题】:How to forward a request using JAX-RS?如何使用 JAX-RS 转发请求?
【发布时间】:2013-07-13 07:22:24
【问题描述】:

我想将 REST 请求转发到另一台服务器。

我将 JAX-RS 与 Jersey 和 Tomcat 一起使用。我尝试设置See Other 响应并添加Location 标头,但这并不是真正的转发。

如果我使用:

request.getRequestDispatcher(url).forward(request, response); 

我明白了:

  • java.lang.StackOverflowError: 如果url是相对路径
  • java.lang.IllegalArgumentException:路径http://website.com 不以/ 字符开头(我认为转发仅在相同的servlet 上下文中是合法的)。

如何转发请求?

【问题讨论】:

  • 您可能应该发送重定向。 HttpServletResponse#sendRedirect(String)
  • @SotiriosDelimanolis 但是这个 HttpServletResponse#sendRedirect(String) 方法基本上发送一个 302 HTTP 响应代码,我认为 URL 在 LOCATION 标头中。所以和我的SEE_OTHER“解决方案”差不多,但不是真正的前锋。还是我错了?
  • 除了使用302 重定向之外,您是否找到了解决方案?使用 RequestDispatcher.forward 时,我得到一个 java.lang.ClassCastException: org.glassfish.jersey.message.internal.TracingLogger$1 cannot be cast to org.glassfish.jersey.message.internal.TracingLogger

标签: java http servlets jax-rs forward


【解决方案1】:

转发

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:

看例子:

@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 URIabsolute path of the request

@Context
UriInfo uriInfo;

【讨论】:

  • 问题是关于转发而不是重定向。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
相关资源
最近更新 更多