-
Notifications
You must be signed in to change notification settings - Fork 4
/
56.txt
671 lines (511 loc) · 30.4 KB
/
56.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
[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]
** 参考文献
[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>