Spring MVC @RestControllerで実装されたRESTエンドポイントがあります。いつか、コントローラーの入力パラメーターに依存して、クライアントにhttpリダイレクトを送信する必要があります。
Spring MVC @RestControllerで可能ですか?可能であれば、例を示していただけますか?
HttpServletResponse
パラメーターをハンドラーメソッドに追加し、response.sendRedirect("some-url");
を呼び出します
何かのようなもの:
@RestController
public class FooController {
@RequestMapping("/foo")
void handleFoo(HttpServletResponse response) throws IOException {
response.sendRedirect("some-url");
}
}
HttpServletRequest
またはHttpServletResponse
への直接の依存関係を回避するには、次のような ResponseEntity を返す「純粋なSpring」実装をお勧めします。
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);
メソッドが常にリダイレクトを返す場合は、ResponseEntity<Void>
を使用します。それ以外の場合は、通常はジェネリック型として返されます。
この質問に出くわし、RedirectViewについて誰も言及していないことに驚きました。私はちょうどそれをテストしました、そしてあなたはこれをきれいな100%春の方法で解決できます:
@RestController
public class FooController {
@RequestMapping("/foo")
public RedirectView handleFoo() {
return new RedirectView("some-url");
}
}
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();
}