web-dev-qa-db-ja.com

Spring MVC @RestControllerおよびリダイレクト

Spring MVC @RestControllerで実装されたRESTエンドポイントがあります。いつか、コントローラーの入力パラメーターに依存して、クライアントにhttpリダイレクトを送信する必要があります。

Spring MVC @RestControllerで可能ですか?可能であれば、例を示していただけますか?

56
alexanoid

HttpServletResponseパラメーターをハンドラーメソッドに追加し、response.sendRedirect("some-url");を呼び出します

何かのようなもの:

@RestController
public class FooController {

  @RequestMapping("/foo")
  void handleFoo(HttpServletResponse response) throws IOException {
    response.sendRedirect("some-url");
  }

}
95
Neil McGuigan

HttpServletRequestまたはHttpServletResponseへの直接の依存関係を回避するには、次のような ResponseEntity を返す「純粋なSpring」実装をお勧めします。

HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);

メソッドが常にリダイレクトを返す場合は、ResponseEntity<Void>を使用します。それ以外の場合は、通常はジェネリック型として返されます。

34
Arne Burmeister

この質問に出くわし、RedirectViewについて誰も言及していないことに驚きました。私はちょうどそれをテストしました、そしてあなたはこれをきれいな100%春の方法で解決できます:

@RestController
public class FooController {

    @RequestMapping("/foo")
    public RedirectView handleFoo() {
        return new RedirectView("some-url");
    }
}
3
DhatGuy

redirectはhttpコード302を意味します。これはspringMVCのFoundを意味します。

これは、ある種のBaseControllerに配置できるutilメソッドです。

protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect,
    response.sendRedirect(url);
    return null;
}

ただし、代わりにhttpコード301を返したい場合があります。これはmoved permanentlyを意味します。

その場合のutilメソッドは次のとおりです。

protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { // 301, moved permanently,
    return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build();
}
0
Eric Wang