使用REST重定向URL的最佳方法

use*_*589 5 java rest servlets

任何人都可以建议我在以下两种方式中使用REST重定向URL的最佳方法:

1. httpResponse.sendRedirect("URL");
2. Response.temporaryRedirect(new URI("path"));
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 14

有几种类型的重定向

根据RFC 7231,HTTP/1.1的语义和内容的当前参考,有几种类型的重定向.他们都是

  1. 重定向指示资源可能在不同的URI处可用,如"位置"字段所提供的,如状态代码301(永久移动),302(找到)和307 (临时重定向).

  2. 重定向,提供匹配资源的选择,每个都能够表示原始请求目标,如 300(多个选择)状态代码中所示.

  3. 重定向到由"位置"字段标识的不同资源,该资源可以表示对请求的间接响应,如303(请参阅其他)状态代码中所示.

  4. 重定向到先前缓存的结果,如304(未修改)状态代码中所示.

正确的一个取决于您的需求.但是,这些是最常见的:

6.4.2.301永久移动

301(永久移动)状态代码表示目标资源已经被分配了一个新的永久性URI,该资源的任何将来参考应该使用封闭的URI之一.[...]

6.4.4.303见其他

303(见其他)状态代码表示该服务器将用户重定向代理不同的资源,如通过一URI在Location头字段,其旨在提供对原始请求的间接响应中指示.[...]

6.4.7.307临时重定向

307(临时重定向)状态代码表示该目标资源暂时位于如果它执行一个自动重定向到该URI不同的URI和用户代理必须不改变请求方法.[...]

在JAX-RS中执行重定向

通过您在问题中发布的代码,我相信您正在使用JAX-RS API.如果是这样,您可以执行以下重定向:

URI uri = ...
return Response.status(Status.MOVED_PERMANENTLY).location(uri).build();
Run Code Online (Sandbox Code Playgroud)
URI uri = ...
return Response.seeOther(uri).build();
Run Code Online (Sandbox Code Playgroud)
URI uri = ...
return Response.temporaryRedirect(uri).build();
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,Response类文档可能很有用.

使用JAX-RS时可能有用的其他细节

您还可以UriInfo在REST端点中注入:

@Context
UriInfo uriInfo;
Run Code Online (Sandbox Code Playgroud)

并获取一些有用的信息,例如基URI请求绝对路径.在构建重定向URI时非常有用.

具有重定向的资源方法如下:

@Path("/foo")
public class MyEndpoint {

    @Context
    private UriInfo uriInfo;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response myMethod() {
        URI uri = uriInfo.getBaseUriBuilder().path("bar").build();
        return Response.temporaryRedirect(uri).build();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

有许多形式的重定向.该3xxHTTP状态代码系列包含:

  • 301 Moved Permanently
  • 307 Temporary Redirect

这些和其他代码具有不同的语义.哪个是对的,取决于你的情况.资源是否已永久移至新位置?或者重定向只是暂时的?