如何使用 JAX-RS 转发请求?

2024-02-28

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

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

如果我使用:

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

I get:

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

我如何转发请求?


Forward

The RequestDispatcher https://javaee.github.io/javaee-spec/javadocs/javax/servlet/RequestDispatcher.html允许您将请求从 servlet 转发到另一个资源在同一台服务器上。看到这个answer https://stackoverflow.com/a/3916286/1426227更多细节。

您可以使用JAX-RS 客户端 API https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/client/package-summary.html并使您的资源类充当代理以将请求转发到远程服务器:

@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();
    }
}

Redirect

如果重定向适合您,您可以使用Response https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Response.html API:

  • Response.seeOther(URI) https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Response.html#seeOther-java.net.URI-:用于 POST 之后重定向(又名 POST/redirect/GET)模式。
  • Response.temporaryRedirect(URI) https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Response.html#temporaryRedirect-java.net.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 https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/UriInfo.html可以注入到您的资源类或方法中以获得一些有用的信息,例如base URI https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/UriInfo.html#getBaseUri--请求的绝对路径 https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/UriInfo.html#getAbsolutePath--.

@Context
UriInfo uriInfo;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JAX-RS 转发请求? 的相关文章

随机推荐