[506] [[HTTP]] および派生プロトコルにおける[DFN[[RUBYB[[[要求メソッド]]]@en[request method]]]]は、当該[[要求]]によって[[鯖]]に対して求めている操作の種類を表します。
[[メソッド]]は短い英数字列 (通常は[[大文字]]) によって表されます。

* 仕様書

[REFS[
- [524] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-4>'''
- [521] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-3.1.1>
- [8] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-8.1>
- [32] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-8.1.2.3>
- [513] [CITE@en-US[XMLHttpRequest]] ([TIME[2012-02-18 19:54:32 +09:00]] 版) <http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-open>
]REFS]

* 意味

[525] [[要求メソッド]]は、[[要求]]の意味を表すものであり、
[[クライアント]]が[[要求]]を行った目的と、
成功した場合に[[クライアント]]が期待する挙動を示したものです。 [SRC[>>524]]

[13] 標準化される[[メソッド]]は一般的なもので、特定の [[MIME型]]や[[資源]]の種類、
[[応用]]に限定されるものではなく、どんな[[資源]]にも適用可能であろうものとされています。
[SRC[>>8]]

;; [14] [[WebDAV]] という特定の[[応用]]でしか使えなそうな[[要求メソッド]]が沢山登録されていますが、
一応汎用的に使える定義になっているという建前なのでしょう...

[15] [CODE(HTTP)@en[[[HEAD]]]] の場合を除き、 [[HTTPメッセージ]]の構文解析は[[要求メソッド]]とは独立したもの
[SRC[>>8]] で、
新たな[[メソッド]]で[[メッセージ本体]]を無しとするなどの変更は行えないとされています。

* 構文

[522] [[メソッド]]の名前は、 [[字句]]です [SRC[>>521, >>524]]。

[FIG(railroad)[
= [[字句]]
]FIG]

** 大文字と小文字

[3] [[HTTP]] [SRC[>>521, >>524]] でも [[RTSP]] でも [[SIP]] でも、
大文字・小文字を区別します。

[49] 
とはいえ実装は区別しないものも多いみたいです。

[514] [[XHR]] は9種類のメソッドについて[[ASCII大文字・小文字不区別]]、それ以外について区別するとしています
[SRC[>>513]]。

[48] 
[[HTTPメソッド]]と関係が深い [[HTML]] の [CODE[form]] [[要素]]の [CODE[method][<form method>]]
[[属性]] (や [CODE[formmethod]] [[属性]]) では、
[[大文字・小文字不区別]]です。

;; [526] 区別する理由を、 大文字と小文字を区別する[[メソッド]]名を用いる[[オブジェクト]]ベースのシステムへの[[関門]]として用いられることがあるから
[SRC[>>524]]、と [[HTTP]] の仕様書は説明していますが、 [[HTTP]]
の[[メソッド]]はそのようなシステムで普通[[オブジェクト]]に適用できる[[メソッド]]ほど種類も豊富ではありませんし、
[[HTTP]] の[[メソッド]]は[[オブジェクト]]ごとに自由に追加するものではないことを特徴にしているわけですから、
本当にそんな根拠で大文字と小文字を区別しないことにする理由があるのか怪しいところです。

;; [26] [[HTTP]] 派生プロトコルの1つである [[S-HTTP]] は明記していませんが、
規定されている [CODE(HTTP)@en[[[Secure]]]] [[メソッド]]を使った例に
[CODE(HTTP)@en[[[SECURE]]]] としているところがあり、
[[大文字・小文字不区別]]としているようです。

-*-*-


[44] 
[[IE11]] の [[IE5]] モードで

>
[PRE[
xhr=new ActiveXObject("Microsoft.XMLHTTP");xhr.open ("foo", "/");xhr.send()
]PRE]

を実行すると[[HTTPメソッド]]は [CODE[foo]]のまま。
[[大文字]]化されるのは [CODE[get]], [CODE[post]], [CODE[put]]。
[CODE[delete]] や [CODE[head]], [CODE[connect]], [CODE[options]] 
は[[大文字]]化'''されない'''。
[CODE[trace]] は[[大文字・[[小文字]]のどの組合せでも[[例外]]。

少し変えて

>
[PRE[
xhr=new XMLHttpRequest;xhr.open ("foo", "/");xhr.send()
]PRE]

にすると「引数が無効です」例外で [CODE[open]] が失敗。
失敗しないで実行できるのは [CODE[get]], [CODE[post]], [CODE[put]],
[CODE[delete]], [CODE[head]], [CODE[options]] のみ。
[[大文字]]化されるのはやはり最初の3つだけ。
[CODE[trace]], [CODE[connect]] も[[大文字・[[小文字]]のどの組合せでも[[例外]]。

[46] 
[[IE11]] の [[IE11]] モードだと 
[CODE[ActiveXObject]]
の方の挙動は同じ ([[大文字]]化も同じ)、
[CODE[XMLHttpRequest]]
の方はその他[[メソッド]]でも[[例外]]にならない
(ただし [CODE[connect]], [CODE[trace]] は[[例外]]) & 
[CODE[delete]], [CODE[head]], [CODE[options]]
も[[大文字]]化される。


[45] 
[[IE5]] モードがどれだけ [[IE5]] 当時の挙動に近いのかはわからないが (そもそも [[IE5]]
当時に [CODE[[[new]] [[XMLHttpRequest]]]] はない)、
何も考えずに知ってるものは全部[[大文字]]化してたという単純な話でもなさそう。


[REFS[
- [5] [CITE[HTTP methods, Web browsers and XMLHttpRequest - Anne’s Weblog]] ([TIME[2007-10-10 00:14:30 +09:00]] 版) <http://annevankesteren.nl/2007/10/http-method-support>
]REFS]

[510] >>5 は [[XHR]] の仕様策定時点での各[[Webブラウザー]]の [[XHR]] 
における[[メソッド]]の[[大文字]]と[[小文字]]についての調査結果です。


-
[536] [CITE@en[Re: XMLHttpRequest: uppercasing method names]]
( ([[Boris Zbarsky]] 著, [TIME[2014-08-13 00:23:39 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2014JulSep/0256.html>
-
[537] [CITE@en[Normalize method names as in XMLHttpRequest · 7a516d0 · whatwg/fetch]]
( ([TIME[2014-08-13 12:19:07 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/7a516d057f9c3441e0bc507c058d80a1045d9b46>
-
[538] [CITE@en[Normalizing method names is defined in Fetch now · 7281399 · whatwg/xhr]]
( ([TIME[2014-08-13 12:19:26 +09:00]] 版))
<https://github.com/whatwg/xhr/commit/7281399e252626393e994f53d0426e34d44793fb>
-
[47] 
[CITE@en[Method case sensitivity · Issue #1 · httpwg/http-core · GitHub]], [TIME[2023-10-11T06:04:03.000Z]] <https://github.com/httpwg/http-core/issues/1>

[50] 
この辺によると、 [CODE[fetch]] の仕様検討時点で整理することも考えられたものの、
[[XHR]] 以来の仕様を踏襲するのが妥当と判断されたようです。
なおこの時代でもまだ[[Webブラウザー]]の [[XHR]] の挙動差が残っていた模様。

[HISTORY[

[51] [CITE@ja[Fetch APIは「PATCH」だけ大文字と小文字の挙動が異なる]], [TIME[2023-10-11T06:09:15.000Z]] <https://zenn.dev/neet/articles/de54e08de01c22#%E3%81%AA%E3%81%9C-xhr-%E3%81%AF-patch-%E3%82%92%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%8B>


[52] >>51 この記事は

>[SNIP[]]XMLHttpRequest は Microsoft が Internet Explorer 5.0 で独自に実装した機能が元になっており、開発時点で最新版の HTTP の仕様では、標準メソッドとして PATCH が定義されていなかったこと、のちの 2010 年に PATCH が標準化されたことを確かめました。

と [[IE5]] の挙動の理由を当時の [[HTTP]] 仕様に求めていますが、
この記事がいう 
「[[IE5]] が [[RFC 2616]] を実装していた」
は必ずしも正確ではありません
([[IE5]] が対応していた機能の集合と [[RFC 2616]] にある機能の集合は重なるだけで、
どちらがどちらの[[部分集合]]でも[[超集合]]でもありません)。
>>44 >>5 
のように [[RFC 2616]] にある [CODE[HEAD]] を[[大文字]]化しないので、
この説明は成り立ちません。

;; [53] そもそも [[RFC 2616]] の先代の [[RFC 2068]] に一応 [CODE[PATCH]]
は定義されています。

[54] 
>>51

>自分のリサーチでは「XHR の側で正規化を定義して、fetch では一切の正規化をしない」というようにしなかった理由が「API 間の一貫性」以外に見つけられなかった。

その理由は >>538 あたり.


]HISTORY]

-*-*-

[55] 
[[Webサーバー]]も古いものは[[大文字・小文字不区別]]のことがよくありました。

;;
[56] 
[CODE[GeT]] や [CODE[get]] のような[[メソッド]]を定める[[仕様書]]が存在しない、
という点を除けば、
[[サーバー]]が
[CODE[GeT]] や [CODE[get]] を [CODE[GET]] を同じように処理したとしても、
[[相互運用性]]上それほど問題にはなりません。
(相手あってこその[[クライアント]]がそれをやると[[相互運用性]]の問題になりますが、
[[サーバー]]は自[[サーバー]]の挙動を自ら決められる立場だからです。)


** 長さ

[523] [[メソッド]]名に長さの上限は設けられていません。

[403] 実装しているどの[[メソッド]]よりも長い[[メソッド]]名を受信した[[鯖]]は、
[CODE(HTTP)[[[501]]]] を返す[['''べきです''']] [SRC[>>521]]。

[503] [[メソッド]]を含む[[要求行]]全体では、
最低でも8000[[オクテット]]の[[要求行]]には対応する[['''べき''']] [SRC[>>521]]
とされています。 (ほとんどは[[要求対象]]となる[[URL]]の長さでしょう。)

** [CODE(HTTP)@en[M-]]

[27] [[RFC 2774]] は必須の要求であることを表すために[[要求メソッド]]の接頭辞
[CODE(HTTP)[[[M-]]]] を使っています。

;; [CODE(HTTP)[[[M-*]]]] 参照。

[16] [[RFC 7231]] は、 [CODE(HTTP)[[[M-]]]] から始まる[[要求メソッド]]は
[[RFC 2774]] で使われているので新規登録を避けるよう [SRC[>>8]] 述べています。

;; [17] 現在 [CODE(HTTP)[M-]] から始まる[[メソッド名]]は [[IANA]]
に登録されていないようです。 [TIME[2014-09-04T05:23:08.000Z]]

** [CODE(HTTP)@en[PEP-]]

[28] 同様に [[PEP]] は [CODE(HTTP)@en[[[PEP-]]]] を接頭辞として予約していました [SRC[>>29]]。

[REFS[
- [29] [CITE[PEP - an Extension Mechanism for HTTP]] ([TIME[1998-04-08 06:31:46 +09:00]] 版) <http://www.w3.org/TR/WD-http-pep#_Toc404743957>
]REFS]

[30] こちらは [[RFC 7231]] は何も言及していません。

* 性質と分類

[11] [[要求メソッド]]によって[[要求]]や[[応答]]の性質や処理方法が異なることがあります。

[FIG(short list)[
- [503] [[安全]]
- [504] [[冪等]]
- [505] [[キャッシュ可能性]]
- [515] 大文字・小文字の区別
- [516] [[XHR]] での安全性
- [[CORS安全リスト化メソッド]]
]FIG]

* 文脈

[23] [[要求メソッド]]は次の場面で用いられます。
[FIG(short list)[
- [[要求行]]
- [CODE(HTTP)@en[[[Allow:]]]]
- [CODE(HTTP)@en[[[Public:]]]]
- [CODE(HTTP)@en[[[:method]]]]
]FIG]

** [CODE[:method]] 擬似ヘッダー (HTTP)

[34] [[HTTP/2]] [[要求]]の[[疑似ヘッダー]] [DFN[[CODE(HTTP)@en[[[:method]]]]]] は、
[[要求メソッド]]を表します [SRC[>>32]]。 [[HTTP/1.1]] [[以下]]の[[要求行]]の[[要求メソッド]]に相当します。
[[要求]]には丁度1つだけ含まれなければ[['''なりません''']] [SRC[>>32]]。
含まれない[[要求]]は、[[奇形]]です [SRC[>>32]]。

[35] [[Chrome]] はなぜか [CODE[[[:method]]]] がなくてもエラーにしません。
(他の[[擬似ヘッダー]]は[[奇形]]とします。) [TIME[2015-10-12T15:13:32.500Z]]

[36] [[Firefox]] はなぜか [CODE[[[:method]]]] がないと[[ストリームエラー]]
[CODE[[[REFUSED_STREAM]]]] を無限に(?)送信し続けます。 [TIME[2015-10-12T15:13:55.00Z]]

[38] >>36 [CODE[[[:method]]]] が [CODE[[[PUT]]]] のように不適切なときもそうなるようです。[TIME[2015-10-12T15:26:04.400Z]]

[37] [[Chrome]] も [[Firefox]] も、 [CODE[[[:method]]]] が複数あってもエラーとはしません。
[TIME[2015-10-12T15:16:17.200Z]]

* 処理

[531] [[鯖]]は、[[要求]]で指定された[[メソッド]]に従って処理を試み、
その結果を[[メソッド]]の定義に従って[[応答]]として[[クライアント]]に送信します。

[527] 一般目的の[[鯖]]は、 [CODE(HTTP)@en[[[GET]]]] と [CODE(HTTP)@en[[[HEAD]]]]
は少なくても実装しなければ[['''なりません''']] [SRC[>>524]]。

;; [528] どのような[[鯖]]が一般目的ではないのかは不明です。
現実には一般目的っぽい[[鯖]]であっても、 [CODE(HTTP)@en[[[HEAD]]]]
が実装されていないことがあります。

;; [534] 実装しなければならないからといって、すべての[[対象資源]]で [CODE(HTTP)[[[2xx]]]]
を返さなければならないわけではありません。例えばある [[URL]]
を [CODE(HTTP)@en[[[GET]]]] した時はもちろん [CODE(HTTP)[[[404]]]]
を返したり、 [CODE(HTTP)[[[405]]]] を返したりしても構いません。

;; [2] 更に、ある[[対象資源]]がどの[[要求メソッド]]も実装しないことがあり得て良いようです。
[CODE(HTTP)@en[[[Allow:]]]] が空になることが認められています。

[532] [[起源鯖]]は、[[要求メソッド]]を認識できないか、実装していない時は、
[CODE(HTTP)[[[501]]]] [[応答]]を返す[['''べきです''']] [SRC[>>524]]。

[533] [[起源鯖]]は、[[要求メソッド]]を知っているものの、[[対象資源]]に対して認めていない時は、
[CODE(HTTP)[[[405]]]] [[応答]]を返す[['''べきです''']] [SRC[>>524]]。

[39] [[nginx]] は[[小文字]]を含む[[要求メソッド]]の[[要求]]を受け取ったら、
[[要求行]]を受信した時点で ([[ヘッダー]]の末尾を待たずに) 
[CODE(HTTP)[400]] [[応答]]を返して[[接続][HTTP接続]]を閉じます。
[TIME[2016-08-26T15:32:30.600Z]]

[40] [[Apache]] は[[小文字]]の [CODE[get]] や [CODE[head]] のような[[要求メソッド]]でも、
[[大文字]]とみなします。 [TIME[2016-08-26T15:32:55.100Z]]

[41] 未知の[[要求メソッド]]の時、 [[nginx]] も [[Apache]] も、
[[reverse proxy]] として動作しているならそのまま[[上流]]に送るようです。
[[ファイルシステム]]から返す時、 [[nginx]] は [CODE[405]] を返し、
[[Apache]] は [CODE(HTTP)[GET]] として動作するようです。
[TIME[2016-08-26T15:37:14.600Z]]

[42] [[HTTP/0.9]] も参照。

* メソッド一覧の提示

[530] [[起源鯖]]は、[[対象資源]]が対応している[[要求メソッド]]の一覧を
[CODE(HTTP)@en[[[Allow:]]]] [[ヘッダー]]で示すことができます。
この[[ヘッダー]]は [CODE(HTTP)[[[405]]]] [[応答]]では必須ですが、
それ以外の[[応答]]でも使うことができます。

[12] [[起源鯖]]は、 [[CORS]] において[[対象資源]]についての[[要求]]に用いることができる[[メソッド]]の一覧を
[CODE(HTTP)@en[[[Access-Control-Allow-Methods:]]]] [[ヘッダー]]で示すことができます。

* メソッドの一覧

[31] [[HTTP]] の[[要求メソッド]]は数多ありますが、実用上意味があるのは
[CODE(HTTP)@en[[[GET]]]]、[CODE(HTTP)@en[[[POST]]]]、[CODE(HTTP)@en[[[HEAD]]]]、
[CODE(HTTP)@en[[[CONNECT]]]] のみです。宗教上の理由により [[Web API]]
の一部は [CODE(HTTP)@en[[[PUT]]]] や [CODE(HTTP)@en[[[DELETE]]]]
を使うこともあります。その他の[[要求メソッド]]は [[HTTP]]
以外の[[プロトコル]]のものか、限られた用途でのみ使われているものや提案されたものの普及しなかったものです。

[FIG(list)[
[FIGCAPTION[
[1] [[HTTP]] および派生プロトコルの[[メソッド]]の一覧
]FIGCAPTION]
,*[CODE(ABNF)[request-method]]	,*プロトコル
,[[ACK]]	,"SIP ([RFC 2543], [IANAREG])"
,[CODE(HTTP)@en[[[ACL]]]],[[HTTP]]
,[[ANNOUNCE]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[BASELINE-CONTROL]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BCOPY]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BDELETE]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BEGIN]]]],[[Q4S]]
,[CODE(HTTP)@en[[[BIND]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BMOVE]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BPROPFIND]]]],[[HTTP]]
,[CODE(HTTP)@en[[[BPROPPATCH]]]],[[HTTP]]
,[[BREW]]	,HTTP ([RFC 2324])
,[[BROWSE]]	,HTTP ([Gripes])
,[CODE(HTTP)@en[[[BWIDTH]]]],[[Q4S]]
,[[BYE]]	,"SIP ([RFC 2543], [IANAREG])"
,[[CANCEL]]	,"SIP ([RFC 2543], [IANAREG]),[[Q4S]]"
,[CODE(HTTP)@en[[[CHECKIN]]]],[[HTTP]]
,[CODE(HTTP)@en[[[CHECKOUT]]]],[[HTTP]]
,[[CONNECT]]	,HTTP ([RFC 2616] 予約)
,[CODE[[[COPY]]]]	,HTTP ([RFC 2518])
,[CODE[[[DELETE]]]]	,"HTTP ([RFC 2068], [RFC 2616]; [RFC 2518])"
,[[DESCRIBE]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[X-MS-ENUMATTS]]]],[[HTTP]]
,[CODE[[[GET]]]]	,"HTTP ([HTTP/0.9], [RFC 1945], [RFC 2068], [RFC 2616]; [RFC 2518], [RFC 2324])"
,[[GET_PARAMETER]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[GET-WITH-BODY]]]],"[[HTTP]]"
,[CODE[[[HEAD]]]]	,"HTTP ([RFC 2068], [RFC 2616]; [RFC 2518])"
,[[INFO]]	,"SIP ([RFC 2976], [IANAREG])"
,[[INVITE]]	,"SIP ([RFC 2543], [IANAREG])"
,[CODE(HTTP)@en[[[LABEL]]]],[[HTTP]]
,[[LINK]]	,HTTP ([RFC 2068] 参考)
,[CODE[[[LOCK]]]]	,HTTP (RFC 2518)
,[[M-*]]	,HTTP ([RFC 2774])
,[[M-GET]]	,HTTP ([RFC 2774])
,[CODE[[[M-POST]]]],HTTP
,[[M-PUT]]	,HTTP ([RFC 2774])
,[CODE(HTTP)@en[[[M-SEARCH]]]],[[SSDP]]
,[CODE(HTTP)[[[MDELETE]]]]	,HTTP ([[URIQA]])
,[CODE(HTTP)@en[[[MERGE]]]],[[HTTP]]
,[CODE(HTTP)[[[MGET]]]]	,HTTP ([[URIQA]])
,[CODE(HTTP)[[[MPUT]]]]	,HTTP ([[URIQA]])
,[[MESSAGE]]	,"SIP ([RFC 3428], [IANAREG])"
,[CODE(HTTP)@en[[[MKACTIVITY]]]],[[HTTP]]
,[CODE(HTTP)@en[[[MKCALENDAR]]]]	,[[HTTP]] ([[RFC 4791]])
,[CODE[[[MKCOL]]]]	,HTTP ([RFC 2518])
,[CODE(HTTP)@en[[[MKREDIRECTREF]]]],[[HTTP]]
,[CODE(HTTP)@en[[[MKWORKSPACE]]]],[[HTTP]]
,[CODE[[[MOVE]]]]	,HTTP ([RFC 2518])
,[CODE(HTTP)@en[[[NOTIFY]]]],"[[HTTP]], [[SIP]], [[SSDP]]"
,[[OPTIONS]]	,"HTTP ([RFC 2068], [RFC 2616]), RTSP ([RFC 2326]), SIP ([RFC 2543], [IANAREG])"
,[CODE(HTTP)@en[[[ORDERPATCH]]]],[[HTTP]]
,[[PATCH]]	,HTTP ([RFC 2068] 参考)
,[[PAUSE]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[PEP]]]],[[HTTP]]
,[CODE(HTTP)@en[[[PEP-[VAR[*]]]]]],[[HTTP]]
,[CODE(HTTP)@en[[[PEP-PUT]]]],[[HTTP]]
,[CODE(HTTP)@en[[[PING]]]],[[Q4S]]
,[[PLAY]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[POLL]]]],[[HTTP]]
,[[POST]]	,"HTTP ([RFC 2068], [RFC 2616], [RFC 2324]))"
,[[PRACK]]	,"SIP ([RFC 3262], [IANAREG])"
,[CODE(HTTP)@en[[[PRI]]]]
,[CODE[[[PROPFIND]]]]	,"HTTP ([RFC 2324], [RFC 2518])"
,[CODE[[[PROPPATCH]]]]	,HTTP ([RFC 2518])
,[CODE[[[PUT]]]]	,"HTTP ([RFC 2068], [RFC 2616]; [RFC 2518])"
,[CODE(HTTP)@en[[[Q4S-ALERT]]]],[[Q4S]]
,[CODE(HTTP)@en[[[READY]]]],[[Q4S]]
,[[RECORD]]	,RTSP ([RFC 2326])
,[[REDIRECT]]	,RTSP ([RFC 2326])
,[[REFER]]	,"SIP ([RFC 3315], [IANAREG])"
,[CODE(HTTP)@en[[[REBIND]]]],[[HTTP]]
,[[REGISTER]]	,"SIP ([RFC 2543], [IANAREG])"
,[CODE(HTTP)@en[[[REPORT]]]]	,[[HTTP]] ([[RFC 4791]])
,[CODE(HTTP)@en[[[RPC_IN_DATA]]]],[[HTTP]]
,[CODE(HTTP)@en[[[RPC_OUT_DATA]]]],[[HTTP]]
,[CODE[[[SEARCH]]]]	,HTTP (ワーム)
,[CODE(HTTP)@en[[[Secure]]]],[[S-HTTP]]
,[[SETUP]]	,RTSP ([RFC 2326])
,[[SET_PARAMETER]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[SHOWMETHOD]]]],[[HTTP]]
,[CODE(HTTP)@en[SOURCE]]
,[CODE(HTTP)@en[[[SPACEJUMP]]]],[[HTTP]]
,[CODE(HTTP)@en[SSTP_DUPLEX_POST]],[[HTTP]]
,[CODE(HTTP)@en[[[SUBSCRIBE]]]],"[[HTTP]], [[SIP]]"
,[[TEARDOWN]]	,RTSP ([RFC 2326])
,[CODE(HTTP)@en[[[TEXTSEARCH]]]],[[HTTP]]
,[[TRACE]]	,"HTTP ([RFC 2068], [RFC 2616])"
,[CODE(HTTP)@en[[[TRACK]]]],[[HTTP]]
,[CODE(HTTP)@en[[[UNBIND]]]],[[HTTP]]
,[CODE(HTTP)@en[[[UNCHECKOUT]]]],[[HTTP]]
,[[UNLINK]]	,HTTP ([RFC 2068] 参考)
,[CODE[[[UNLOCK]]]]	,HTTP ([RFC 2518])
,[CODE(HTTP)@en[[[UNSUBSCRIBE]]]],[[HTTP]]
,[CODE(HTTP)@en[[[UPDATE]]]],"[[HTTP]], [[SIP]]"
,[CODE(HTTP)@en[[[UPDATEREDIRECTREF]]]],[[HTTP]]
,[CODE(HTTP)@en[[[VERSION-CONTROL]]]],[[HTTP]]
,[[WHEN]]	,HTTP ([RFC 2324])
]FIG]

[57] [[CATP]] のもの [SEE[ [[CATPメソッド]] ]]

** 参考文献

[REFS[
- [511] [CITE[List of HTTP methods (verbs) — Anne’s Blog]] ([TIME[2012-02-19 14:31:55 +09:00]] 版) <http://annevankesteren.nl/2007/10/http-methods>
- [512] [CITE@en-us[WebDAV Methods]] ([TIME[2012-02-19 14:32:08 +09:00]] 版) <http://msdn.microsoft.com/en-us/library/aa142917.aspx>
]REFS]

* IANA 登録簿

[529] [[メソッド]]は、 [[IANA]] に登録する[RUBYB[べき]@en[ought to]]です [SRC[>>524]]。

[4] [[HTTP]]、[[RTSP]]、[[SIP]] で[[メソッド]]名は共通するものもありますが、
それぞれ別個の [[IANA登録簿]]が用意されています。

[REFS[
- [9] [CITE[Hypertext Transfer Protocol (HTTP) Method Registry]] ([TIME[2014-06-11 05:05:50 +09:00]] 版) <http://www.iana.org/assignments/http-methods/http-methods.xhtml>
- [509] [CITE[Real Time Streaming Protocol (RTSP)/1.0 Parameters]] <http://www.iana.org/assignments/rtsp-parameters>
- [508] <http://www.iana.org/assignments/sip-parameters>
]REFS]

;;
[507] [[HTTP]] と [[RTSP]] は当初登録簿がありませんでしたが、次第に整備されてゆきました。
[[HTTP]] の登録簿は [[RFC 7231]] で新設されました。

[10] [[HTTP]] の登録簿では、名前と出典の他に、[[安全なメソッド]]か否か、
[[冪等メソッド]]か否かも登録することになっています [SRC[>>8]]。

* データ

[520] [[メソッド]]の一覧とそれぞれの[[特性]]をまとめたデータが
[REFS[
- [CITE[data-web-defs/data/http-methods.json at master · manakai/data-web-defs]] ([TIME[2013-11-27 12:38:22 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/data/http-methods.json>
]REFS]
にあります。

* 歴史

** HTTP/0.9

[25] [[HTTP/0.9]] では [CODE(HTTP)@en[[[GET]]]] のみ認められていました [SRC[>>24]]。

;; [[HTTP/0.9]] も参照。

[REFS[
- [24] [CITE@en[RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0]] ([TIME[2014-09-07 13:12:32 +09:00]] 版) <http://tools.ietf.org/html/rfc1945#section-4.1>
]REFS]

** HTTP/1.0

[REFS[
- [517] [CITE[HTTP: A protocol for networked information: Predefined Methods]] ([TIME[1997-06-05 20:05:11 +09:00]] 版) <http://www.w3.org/Protocols/HTTP/Methods.html>
- [518] [[RFC 1945]]
]REFS]

** HTTP/1.1

[FIG(quote)[
[FIGCAPTION[
[502] RFC 1945 (HTTP/1.0); RFC 2068・2616 (HTTP/1.1) 5.1.1 Method
]FIGCAPTION]

> The Method token indicates the method to be performed on the resource
identified by the Request-URI. The method is case-sensitive.

[CODE(ABNF)[Method]] 字句は、 [CODE(ABNF)[[[Request-URI]]]]
で識別される[[資源]]に施される方式を示します。方式は大文字・小文字を区別します。

[DEL[

[DEL[

> [INS[{1945}]]
- 
[PRE[
       Method         = "GET"                    ; Section 8.1
                      | "HEAD"                   ; Section 8.2
                      | "POST"                   ; Section 8.3
                      | extension-method
]PRE]
]DEL]

[INS[

> [INS[{2068}]]
- 
[PRE[
          Method         = "OPTIONS"                ; Section 9.2
                         | "GET"                    ; Section 9.3
                         | "HEAD"                   ; Section 9.4
                         | "POST"                   ; Section 9.5
                         | "PUT"                    ; Section 9.6
                         | "DELETE"                 ; Section 9.7
                         | "TRACE"                  ; Section 9.8
                         | extension-method
]PRE]
]INS]
]DEL]

[INS[

> [INS[{2616}]]
- 
[PRE[
       Method         = "OPTIONS"                ; Section 9.2
                      | "GET"                    ; Section 9.3
                      | "HEAD"                   ; Section 9.4
                      | "POST"                   ; Section 9.5
                      | "PUT"                    ; Section 9.6
                      | "DELETE"                 ; Section 9.7
                      | "TRACE"                  ; Section 9.8
                      | "CONNECT"                ; Section 9.9
                      | extension-method
]PRE]
]INS]

>
- extension-method = token

> The list of methods [DEL[acceptable]] [INS[allowed]] by a [DEL[specific]] resource can [DEL[change dynamically; the client is notified through the return code of the response if a method is not allowed on a resource.]] [INS[be specified in an Allow header field (section 14.7). The return code of the response always notifies the client whether a method is currently allowed on a resource, since the set of allowed methods can change dynamically.]] [DEL[[INS[{1945,2068}]] Servers]] [INS[[INS[{2616}]] An origin server]] [DEL[should]] [INS[SHOULD]] return the status code [INS[405 (Method Not Allowed) if the method is known by the [INS[original]] server but not allowed for the requested resource, and]]
501 ([DEL[not implemented]] [INS[Not Implemented]]) if the method is unrecognized or not implemented [INS[by the [INS[original]] server]]. [DEL[[INS[[INS[{2068}]] The list of methods known by a server can be listed in a Public response-header field (section 14.35).]]]]

ある資源に認められる方式の目録は [CODE(HTTP)[[[Allow]]]] 頭欄に指定されます。
応答の復帰符号は方式が現在資源について認められているかどうかを常にクライアントに通知します。
認められる方式の集合は動的に変わり得るからです。
[[起源サーバー]]は、方式を起源サーバーが知っているがその要求された資源には認めない場合には [CODE(HTTP)[[[405]]]] (方式不認可)
[[状態符号]]を、起源サーバーが方式が認識できないか実装していない場合は
[CODE(HTTP)[[[501]]]] (未実装) 状態符号を返す'''べきです'''。[DEL[サーバーが知っている方式の目録は [CODE(HTTP)[[[Public]]]] 応答頭欄で列挙できます。]]

[DEL[

> [INS[{1945}]] The methods commonly used by HTTP/1.0 applications are fully defined in Section 8.

HTTP/1.0 応用が広く使っている方式は8章で完全に定義しています。
]DEL]

[INS[

> The methods GET and HEAD MUST be supported by all general-purpose
servers. All other methods are [DEL[optional]] [INS[OPTIONAL]]; however, if the above
methods are implemented, they MUST be implemented with the same
semantics as those specified in section 9.

方式 [CODE(HTTP)[[[GET]]]] および [CODE(HTTP)[[[HEAD]]]]
にすべての一般目的サーバーは対応しなければなりません。
他のすべての方式は'''[[任意選択]]'''です。しかし、
上の方式を実装する場合は、9章で規定する意味と同じに実装しなければ'''なりません'''。
]INS]

[INS[

注: 注記なき変更点は 1945 → 2068 の変更。
]INS]
]FIG]

[FIG(quote)[
[FIGCAPTION[
[6] RFC 1945 (HTTP/1.0) 8.; RFC 2068・2616 (HTTP/1.1) 9 Method Definitions
]FIGCAPTION]

> The set of common methods for [DEL[HTTP/1.0]] [INS[HTTP/1.1]] is defined below. Although
this set can be expanded, additional methods cannot be assumed to
share the same semantics for separately extended clients and servers.

HTTP の共通の方式 (method) の集合を次に定義します。
この集合は拡張可能ではありますが、追加の方式は別々の拡張されたクライアントやサーバーで同じ意味を共有しているとは仮定できません。

[INS[

> The Host request-header field (section 14.23) MUST accompany all
HTTP/1.1 requests.

[CODE(HTTP)[[[Host]]]] 要求頭欄はすべての HTTP/1.1
要求に伴わなければ'''なりません'''。
]INS]
]FIG]

*** RFC 2068・2616 (HTTP/1.1) 9.1 Safe and Idempotent Methods

→[CODE(WikiPage)[[[安全]]]]

*** RFC 1945 (HTTP/1.0) 9.1〜; RFC 2068・2616 (HTTP/1.1) 9.2〜 

(各 method の定義 : 省略)

*** RFC 1945 (HTTP/1.0) D.1; RFC 2068 (HTTP/1.1) 19.6.1 Additional Request Methods

(各 method の定義 : 省略)

[FIG(quote)[
[FIGCAPTION[
[7] RFC 2616 (HTTP/1.1) 19.6.3 (抜粋)
]FIGCAPTION]

> The PATCH, LINK, UNLINK methods were defined but not commonly
implemented in previous versions of this specification. See RFC 2068 [33].

この仕様書の以前の版で
[CODE(HTTP)[[[PATCH]]]], [CODE(HTTP)[[[LINK]]]], [CODE(HTTP)[[[UNLINK]]]]
方式が定義されていましたが、広くは実装されていません。
[[RFC 2068]] 参照。
]FIG]

** RFC 723x

[19] [[RFC 2616]] の改訂である [[RFC 7231]] で [[HTTP]] [[要求メソッド]]の 
[[IANA登録簿]]が初めて整備されました。

[20] [[RFC 723x]] 以外の従来の [[RFC]] で規定されていた[[要求メソッド]]は
[[RFC 7237]] により登録されています [SRC[>>18]]。

[REFS[
-[519] [CITE@en[draft-ietf-httpbis-method-registrations-13 - Initial Hypertext Transfer Protocol (HTTP) Method Registrations]]
( ([TIME[2013-09-25 22:18:51 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-httpbis-method-registrations-13>
- [18] [CITE@en[RFC 7237 - Initial Hypertext Transfer Protocol (HTTP) Method Registrations]] ([TIME[2014-06-07 01:59:34 +09:00]] 版) <https://tools.ietf.org/html/rfc7237>
]REFS]

;; [21] [CODE(HTTP)@en[[[M-*]]]] [[メソッド群]]は登録されていないようです。

;; [22] [[RFC]] 化されていない[[メソッド]]は登録されていないようです。

* 関連

[535] [CODE(HTMLe)@en[[[form]]]] [[要素]]の [CODE(HTMLa)@en[[[method]]]]
[[属性]]は、元々は [[HTTP]] の[[メソッド]]から派生したものですが、
現在では必ずしも [[HTTP]] の[[メソッド]]とは対応しないものになっています。

* 歴史


[539] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#section-4.3.2>

[540] [CITE[HTTP: A protocol for networked information: Predefined Methods]]
( ([TIME[1997-06-06 05:05:11 +09:00]] 版))
<http://www.w3.org/Protocols/HTTP/Methods.html>

[43] [CITE@en[Access-Control-Expose-Headers: * can be interpreted in two ways · Issue #548 · whatwg/fetch]]
([TIME[2017-09-08 14:55:33 +09:00]])
<https://github.com/whatwg/fetch/issues/548>

