J'ai un REST noeud final implémenté avec Spring MVC @RestController. Parfois, cela dépend des paramètres d'entrée dans mon contrôleur. Je dois envoyer une redirection http sur le client.
Est-ce possible avec Spring MVC @RestController et si oui, pourriez-vous s'il vous plaît montrer un exemple?
Ajoutez un paramètre HttpServletResponse
à votre méthode de gestionnaire, puis appelez response.sendRedirect("some-url");
Quelque chose comme:
@RestController
public class FooController {
@RequestMapping("/foo")
void handleFoo(HttpServletResponse response) throws IOException {
response.sendRedirect("some-url");
}
}
Pour éviter toute dépendance directe sur HttpServletRequest
ou HttpServletResponse
, je suggère une implémentation "pure Spring" renvoyant un ResponseEntity comme ceci:
HttpHeaders headers = new HttpHeaders();
headers.setLocation(URI.create(newUrl));
return new ResponseEntity<>(headers, HttpStatus.MOVED_PERMANENTLY);
Si votre méthode retourne toujours une redirection, utilisez ResponseEntity<Void>
, sinon tout ce qui est retourné normalement en tant que type générique.
Je suis tombé sur cette question et j'ai été surpris de constater que personne ne mentionnait RedirectView. Je viens de le tester, et vous pouvez le résoudre de manière propre et 100% printanière avec:
@RestController
public class FooController {
@RequestMapping("/foo")
public RedirectView handleFoo() {
return new RedirectView("some-url");
}
}
redirect
signifie code http 302
, qui signifie Found
dans springMVC.
Voici une méthode util, qui pourrait être placée dans une sorte de BaseController
:
protected ResponseEntity found(HttpServletResponse response, String url) throws IOException { // 302, found, redirect,
response.sendRedirect(url);
return null;
}
Mais parfois, vous voudrez peut-être renvoyer le code http 301
à la place, ce qui signifie moved permanently
.
Dans ce cas, voici la méthode util:
protected ResponseEntity movedPermanently(HttpServletResponse response, String url) { // 301, moved permanently,
return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).header(HttpHeaders.LOCATION, url).build();
}