3 Minutes NetWorking
No.74

3Minutes NetWorking

第74回HTTP(5) メソッド

■ メソッド

インター博士

さてさて。ネット君、メソッドについては説明したな。

ネット助手

え〜っと、リクエストヘッダにある動作の指定、でしたっけ?

インター博士

うむうむ。ちなみにリクエストメッセージの中身はこの形、だったな。

リクエストメッセージ

[Figure74-01:リクエストメッセージ]

インター博士

この開始行にあるものだな。でもって、種類は以下の種類だ。

Method対応バージョン
GETHTTP/0.9
HEADHTTP/1.0
POSTHTTP/1.0
PUTHTTP/1.1
DELETEHTTP/1.1
OPTIONSHTTP/1.1
TRACEHTTP/1.1
CONNECTHTTP/1.1

[Table74-01:Method]

ネット助手

でしたでした。

インター博士

今回は、メソッドについてもうちょっと詳しく説明しよう。
だがしかし。

ネット助手

だがしかし?

インター博士

ブラウザや、Webサーバアプリケーションによって動作に微妙な違いがあったりなかったりするので、そこらへんだけは要注意だ。

ネット助手

あったりなかったりって、どっちなんです?

インター博士

あったりなかったり、だ。

ネット助手

いえ、だから、どっちなんです?

インター博士

君もしつこいな。
どうしてそのしつこさが物事を覚えるという点に関してまったくいかされないのが不思議だよ。

ネット助手

はぅっ。

■ GET

インター博士

まずGET。リソース回収するためのメソッドだ。
つまり、リクエストURIに書かれたリソースを要求することだな。

GETメソッド

[Figure74-02:GET Method]

ネット助手

一番使われる「ページを見る」ためのメソッドですよね。

インター博士

そういうことだな。GETについてはあまりに標準なのであまり話すこともないが、まぁ2つほど話しておこう。
1つ目は条件つきGETだ。

ネット助手

条件つき? どんな条件がつくんです?

インター博士

うむ、これには前回説明したメッセージヘッダの中の「If-Modified-Since」が使用される。

ネット助手

いふもでぃふぁいどしんす?
Modifiedってどんな意味でしたっけ?

インター博士

「修正済み」って意味だな。
「If-Modified-Since」の値は日付だ。前回使ったEtherealを使って、どのような値が送られているか見てみると。 ▼ link

If-Modified-Since

[Figure74-03:If-Modified-Since]

インター博士

2004年10月6日、14:27:37という値がサーバに送られている。
まぁ、GMTだから、実際は2004年10月6日23時ってことだな。

ネット助手

ははぁ。で、これはなんの時間なんですか?

インター博士

ユーザエージェントはキャッシュとして以前取得したページを持っている。
そのキャッシュされたページの更新日時がIf-Modified-Sinceってことだ。

ネット助手

はぁ。

インター博士

でもって、このIf-Modified-Sinceがついた条件つきGETではこう問い合わせているわけだ。
「もしIf-Modified-Sinceより後に更新されていたら、GETします」と。

ネット助手

ははぁ。だからもし(if)、この日時から(since)、修正された(Modified)なら、ってわけですか?

インター博士

そうだ。さっきのEtherealの要求に対しての返答を見てみよう。

If-Modified-Since

[Figure74-04:304 Not Modified]

インター博士

もし、If-Modified-Sinceの値以降に更新されていたなかったら、304 Not Modifiedを返す。この時、ページを送らないわけだな。

ネット助手

ページを送らない?

インター博士

「あなたの持っているキャッシュと変わらないですよ」ってことだな。
う〜む、動きがあったほうがわかりやすいか?

[Figure74-05:条件つきGET]

ネット助手

は〜。同じページをわざわざ送らないってことですか。

インター博士

そういうことだな。それにより、転送量を減らす役割があるわけだ。

ネット助手

なるほど。
ところで、キャッシュってどこにされるんです?

インター博士

それはブラウザによって異なる
さて、GETに関してもう1つ。CGIなどの動的ページの場合だ。

ネット助手

CGIっていうと、アレでしたっけ。掲示板とかに使ってるやつでしたっけ?

インター博士

うむ。「Roads to Node」でもCGIを使った掲示板を持っているな。
CGIをGETで要求する場合、要求URIはこのような形だ。

  • http://cgi.www5e.biglobe.ne.jp/~aji/cgi-bin/3min/ibbs.cgi
インター博士

ここでの問題は、このURIはCGIソースであって、HTMLファイルではない、ということだ。

ネット助手

インター博士

つまり、上の例の「ibbs.cgi」というファイルは、Perlという言語で書かれたプログラムファイルなのだよ。
中身はこんな感じだ。

ソースファイル

[Figure74-06:Roads to Node BBSのソースファイル]

インター博士

Roads to Nodeでは「CJ-Club」の「I-Board(の旧ver)」と呼ばれるフリーのCGIを使わせてもらってる。 ▼ link

ネット助手

なんです、これ?
全然HTMLじゃないですよ?

インター博士

だろう? CGIのような動的ページについては後述するとして。
本来のGETの意味からすれば、このPerlで書かれたソースファイルを取得しなければおかしいわけだ。

ネット助手

そうなりますかね。

インター博士

だが、実際GETが取得してくるのは、CGIによって生成されたページ、となるわけだ。こういう動作もGETは行う、ということだな。

ネット助手

なるほど。

■ HEAD

インター博士

次はHEADを説明しよう。
HEADはレスポンスヘッダのみを要求するメソッドだ。

HEADメソッド

[Figure74-07:HEAD Method]

インター博士

見てわかるようにGETの場合と同じレスポンスヘッダを返す。
違いはレスポンスボディ、つまりデータがないだけだ。

ネット助手

レスポンスヘッダだけ取得して、なにかいいことあるんですか?

インター博士

確かに通常のブラウザでは、HEADメソッドを使うことはない。

ネット助手

ないんですか。
ブラウザが使わないってことは、なんか他に使い道があるんですか?

インター博士

所謂、巡回エージェントなどがよく使うな。
設定されたURIに対し、HEADリクエストを行い、ページの更新状況などを確認するソフトウェアだ。

ネット助手

ははぁ、そんな便利なソフトがあるんですか。

インター博士

私が知っているのだと、WWWCがあるな。 ▼ link

ネット助手

ははぁ。なんでその巡回エージェントとやらはGETを使わないんですか?
GETでもさっきの条件つきGETを使えば更新状況がわかるじゃないですか?

インター博士

確かにそうだが。GETだと更新されている場合、ページを送り返してくるだろう?
更新されているかどうか判断するだけなら、HEADだけでも十分だ。

ネット助手

確かにそうかも。

インター博士

まぁ、せっかくだから、HEADメソッドを使った場合も見てもらおう。
自宅サーバのIIS5.0に対し、telnetクライアントを使って、HEADメソッドを実行した場合だ。

HEADメソッドの実行例

[Figure74-08:HEAD Methodの実行例]

インター博士

と、このように普通に「200 OK」が返ってきているが、データとしてページが送られてきていないわけだ。

ネット助手

ははぁ。

■ POST

インター博士

次はPOST。
これはなんと説明したっけ?

ネット助手

「要求メッセージのメッセージ本体にデータを入れて送る時に使う」と。

インター博士

そうだな。掲示板などクライアント側からのデータに応じて変化する、動的ページなどではこのメソッドが使用される。

POSTメソッド

[Figure74-09:POST Method]

インター博士

上の例は、掲示板などの場合だ。掲示板に書き込んだものがデータとして渡されるわけだな。

ネット助手

えぇ〜っと、つまり。POSTで要求を出したページに、その、掲示板に書き込んだものをデータとしてくっつけて送って。
で、その結果をページとして受け取るってことですか?

インター博士

うむうむ。なかなかいい理解力だぞ。
実際の例を見てもらおうか。Roads to Nodeの掲示板に書き込んだ時の状態をEtherealで見た場合のものだ。

POSTメソッドの例

[Figure74-10:POST Methodの例]

インター博士

実際、長いのでカットしたが。この「Line-based text data」というところが書き込んだデータだ。
ヘッダ終了の改行の後に、続いているだろう?

ネット助手

「no=0」とか「mode=wri」とかの部分ですよね?
どういう意味なんです?

インター博士

それはデータを送る時のHTMLファイルの記述によるもので、必ずこうなるというわけではない。
わかってほしいのは、リクエストメッセージなのに、ヘッダだけでなくデータを送っているという点だな。

ネット助手

ははぁ、確かに。
ヘッダ終了の改行があっても、その後ろにまだデータがありますものね。

インター博士

うむ。そして、送られてきたデータによってCGIを使って作成されたページをサーバは送るわけだな。
この場合は、200 OKになるわけだ。

ネット助手

なるほど。

インター博士

CGIのような動的ページの場合、POSTを使う場合と、GETを使う場合がある。
どこで区別するかというと、CGIを呼び出すページのHTMLソースで決まる。ココだ。

  • <form name="test" method="POST" action="./bbs.cgi">
インター博士

ココを「method="POST"」とするか、「method="GET"」とするかで、使用するメソッドが異なる。

ネット助手

へ? GETを使う場合があるんですか?
なんか今までの説明を聞くと、CGIのようなデータが必要な場合はPOSTを使うってことっぽいですけど?

インター博士

確かに「データを送る」時はPOSTだ。だが、これはCGIの仕組みによっていろいろあるのだよ。
詳しくはCGIを使うときに説明しよう。

ネット助手

ははぁ。
……なんか最近、「後述する」とか「また後で説明しよう」が多いですね。

インター博士

む。
むむぅ。

ネット助手

あ、博士が珍しく困ってる。へへへ。

インター博士

ネット君?

ネット助手

はい?

インター博士

君はいらん事によく気がつくな。

ネット助手

えへへ。

インター博士

褒めてねぇ

ネット助手

はうっ。

■ PUTとDELETE

インター博士

さて、GET、HEAD、POSTはHTTP1.0までに規定されたものだが。
HTTP1.1で新しく入ったメソッドもいくつか紹介しよう。PUTとDELETEだ。

ネット助手

PUTは「置く」? DELETEは「消す」?

インター博士

その通り。つまりHTTPを利用したサーバ上のファイルの作成・更新・削除に使用するメソッド、ということだな。

ネット助手

え? え? HTTPって「見る」ためにあるんじゃないんですか?
サーバ上でファイルを作成したり、更新したりしたら、それはFTPじゃないですか?

インター博士

おいおい。前に話したろう? WebDAVというものがあると。
HTTP1.1ならば、FTPに近いこともできると。

ネット助手

そういえば、HTTPの歴史の話の時にそんな話をしてたような…。

インター博士

まったく。
ともかく、ファイルの作成、更新を行うためのメソッドがPUTとGETだ。

PUTメソッド

[Figure74-11:PUT Method]

インター博士

リクエストヘッダのURIに、作成するファイルの名前。
データに、そのファイルの中身を入れて送るわけだな。

ネット助手

で、レスポンスが201 Created
Createだから、作成したって返事ですか?

インター博士

そうだ。すでにファイルが存在して、中身の入れ替えの場合は200 OKになる。
ではちょっとやってみよう。

PUTメソッドの例

[Figure74-12:PUT Methodの例]

インター博士

ちょっと不必要な部分を省略して見せているが。
ちなみにtelnetクライアントを使って実行する場合には、Content-lengthヘッダが必要だ。

ネット助手

は〜。

インター博士

今のがファイルの新規作成。次は更新を見せてみよう。

PUTメソッドの例2

[Figure74-13:PUT Methodの例2]

ネット助手

あ、ほんとに200 OKになってる。

インター博士

うむ。更新だからCreateしたわけではないから、200 OKだ。
最後はDELETEをやってみよう。

DELETEメソッドの例

[Figure74-14:DELETE Methodの例]

ネット助手

あれ、またも200 OKだ。

インター博士

そうだ。つまり200 OKというのは、メソッドに対して正常に実行できた場合のレスポンスコードなわけだ。
このDELETEの場合は、「正常に削除できました」というレスポンスになるわけだ。

ネット助手

なるほど。

インター博士

あぁ、そうそう。このPUTとDELETEの例は、IIS5.0での例だからな。
他のWebサーバアプリケーションでは試したことがないので。あしからず。

ネット助手

博士、Windows好きですねぇ。

インター博士

好きと言うわけではないが、特に用意したりするものが必要ないからな。例にはぴったりだろう。

ネット助手

そういうもんですか?

インター博士

そういうものだ。

ネット助手

ははぁ。

インター博士

では、このぐらいにしておこうか。

ネット助手

あれ? OPTIONSやTRACEやCONNECTは?

インター博士

まぁ、あまり使うメソッドではないからな。
どちらかといえば、Webサーバアプリケーションやプロキシに対する診断用のメソッドだ。

ネット助手

そうなんですか。

インター博士

うむ。
では、また次回。

ネット助手

了解です。 3分間ネットワーキングでした〜♪

GMT
[Greenwich Mean Time]
グリニッジ標準時。日本の標準時(JST:Japan Standard Time)とは9時間の時差があるため、JST = GMT + 9である。
ブラウザによって異なる
Internet Explorerの場合、標準だと、「C:\Documents and Settings\[ユーザ名]\Local Settings\Temporary Internet Files」です。変更も可能。
Perl
[Practical Extraction and Report Language]
C言語に似たインタプリタ型言語。テキストの検索・抽出、正規表現などに優れる。
読みは「パール」。
ネット助手ネット君の今日のポイント
  • GETメソッドはリクエストURIのリソースを取得する。
    • If-Modified-Sinceを使って条件つきGETを実行することもできる
  • HEADメソッドはリクエストURIのレスポンスヘッダだけを取得する。
  • POSTメソッドはクライアントからのデータを転送する時に使用する。
    • 主にCGIなどの動的ページで使用される
  • PUT、DELETEメソッドはファイルの作成・更新・削除に使用する

3 Minutes NetWorking No.74

管理人:aji-ssz(at)selene.is.dream.jp