【Spring】redirectを利用する際、POSTを指定する

java

 Springでredirectを利用する際、あんまりHttp Methodを意識したことがないかもしれません。ただ、何もしなければ、デフォルトでGETとなり、POSTしたいときは困ります。

 HTTP 1.1 プロトコル リファレンスに従って、ステータス コード 301 (Moved Permanently) および 302 (Found) により、リクエスト メソッドを POST から GET に変更できます。
 リクエストメソッドを POST から GET に変更することを許可したくなければ、307 (Temporary Redirect) および 308 (Permanent Redirect) ステータスコードを指定すればOKです。

@PostMapping("/redirectPostToPost")
public ModelAndView redirectPostToPost(HttpServletRequest request) {
    request.setAttribute(
      View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
    return new ModelAndView("redirect:/redirectedPostToPost");
}
@PostMapping("/redirectedPostToPost")
public ModelAndView redirectedPostToPost() {
    return new ModelAndView("redirection");
}

こうすれば、redirectはPOSTで送信されます。もう少しちゃんとコードを書いて検証しますと、

@RestController
@RequestMapping("app")
public class TestController {

    @PostMapping("/addCompany")
    public ModelAndView addCompany(@RequestBody Company company, HttpServletRequest request) {
        System.out.println("First method: " + company.name);
        request.setAttribute(
                View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT);
        return new ModelAndView("redirect:/app/postmethod/");
    }

    @PostMapping("/postmethod")
    public void getData(@RequestBody Company company) {
        System.out.println("Redirected: " + company.name);
    }

    public static class Company {
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

bodyに「{"name": "Test Company"}」を入れてPOSTで「http://localhost:8080/app/addCompany」に送信しますと、以下のような結果となります。

First method: Test Company
Redirected: Test Company

コメント

タイトルとURLをコピーしました