1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バリデーションエラー サーバサイドレンダリング時のHTTPステータスコードについて

Last updated at Posted at 2024-06-18

バリデーションエラーについてAPIは400を返す ですんなり納得いったが、APIとしてではなく、SSR(サーバサイドレンダリング)するようなケースも400を返すのか?200のほうがよい?について少し気になったでメモ。

結論

個人的には以下に落ち着いた。
200と400どちらがよいかは、プロジェクト・チームで方針を合わせておけばよいと思う。

詳細

API

いくつか記事をみたところ400に着地していてこれは納得できる。
https://qiita.com/nesheep5/items/6da796f6ac628c430c36

SSR

これについての記事はみつけられなかった。

  • SSRの場合に200を返してもよいのではと思った理由
    • SSRの場合、バリデーションエラーになったとしても、画面をレンダリングするということが責務だとすると、エラーメッセージとともに画面を再表示するという風に解釈すると200を返すことでも納得できる。
    • いくつかのフレームワークの実装などをみるとSSR時はそのまま200を返している(というより、テンプレートを指定しているだけで、httpStatusCodeをわざわざ設定していないからそのまま200になっている)がみられた。
    • spring bootだとbindingResultでvalidation結果を取得してそれをviewに返す例も多い(この場合も200を返す)
sample.java
    @PostMapping("/register")
    public String registerUser(@Validated @ModelAttribute("userForm") UserForm userForm, BindingResult bindingResult, Model model) {
        if (bindingResult.hasErrors()) {
            return "register"; //registerというviewを返す HTTPステータスコードは200
        }

200
Ugh... (309, 400, 403, 409, 415, 422)... a lot of answers trying to >guess, argue and standardize what is the best return code for a >successful HTTP request but a failed REST call.

の箇所。ここではHTTPとRESTfulを混同しないように的なことで議論されていて近いものはあるかなと思った。記事を追ったが、そういう考え方もあるというのでどっちが正解というのはなさそうだった。

  • SSR時でも400を返しておいた方が良いと判断するポイント
    • テストがやりやすい
      • ステータスコードが200だとバリデーションできたかはhtmlをみないといけない。400にしておけば楽。
    • 同じリポジトリ内にSSRとAPI呼び出しが混ざっている
      • APIはバリデーションエラー400で返しているのにSSRの箇所は200なの気持ち悪いという議論になりそうなのでこういう場合はもう400にしてしまったほうがよいのかなと思う。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?