TL;DR
method
の指定をpatch
からPATCH
と、大文字に変更してください。
method: "patch", // NG!! ---- method: "PATCH", // OK
fetch()で「patch」リクエストが通らない
以下のようなコードを使ってHTTP PATCHを送ろうとしてもうまくいきません。
const response = await fetch(`some/api/endpoint`, { method: "patch", // <---------------------- 小文字になっていませんか? });
自分の環境(Chrome)では、net::ERR_EMPTY_RESPONSE
というエラーになりました。
fetch()を使う場合、HTTPリクエストメソッドはpatch
ではなく、全て大文字のPATCH
で指定する必要があります。
小文字にしている場合は大文字に直すことで(それ以外にエラーがなければ)動作するようになります。
postとかは小文字でもいけるよ??
まず、HTTPのメソッド名は大文字と小文字を区別する(case-sensitive)仕様になっています。
HTTPのメソッドはオブジェクトシステムのゲートウェイとして(つまりオブジェクト指向言語のメソッド名として)使われることを想定しているから、という事のようです。(プログラミング言語での「オブジェクトのメソッド」は基本的にcase-sensitiveです。)
すなわち、get
ではなく、GET
と指定する必要があります。
しかし、Fetch API
の仕様によると、 以下のメソッドについては正規化(Normalization)のため、fetch()内部で大文字に変換されるとのこと。
- DELETE
- GET
- HEAD
- OPTIONS
- POST
- PUT
To normalize a method, if it is a byte-case-insensitive match for
DELETE
,GET
,HEAD
,OPTIONS
,POST
, orPUT
, byte-uppercase it.
https://fetch.spec.whatwg.org/#methods
そのため、GET
やPOST
はget
、post
とそれぞれ小文字で指定しても「fetch()がよしなに大文字に変換してくれていた」から問題なく通信できた、ということですね。
しかし、PATCH
はこの「正規化(Normalization)」するメソッド一覧に含まれていません。
よって、fetch()内部で自動で大文字に変換されず、HTTPの仕様(case-sensitive)に反していたため通信できなかったという訳ですね。
まとめ
fetch()
でPATCH
のリクエストを送信するときは、メソッド名は必ず大文字のPATCH
で指定しよう。
参考リンク
http method patch is case sensitive · Issue #254 · github/fetch · GitHub
Add PATCH HTTP verb normalization · Issue #37 · github/fetch · GitHub
RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content