FORMのMETHODの違いについて

[上に] [前に] [次に]
oka [E-Mail] [HomePage] 1998/08/28(金) 00:15:26
Javascriptをフルに使って検索エンジンや辞書・データベースを
簡単に検索できる、いわゆる「メタサーチ」のページを作っている
のですが、フォームのMETHOD属性の違いがはっきりせず、困っています。
一つ分かったのはMETHOD=GETの場合、URLを直接指定して検索を実行
できるということです。例えばYahoo!は、
http://search.yahoo.co.jp/bin/search?p=キーワード&...
というURLで直接検索できます。しかし、METHOD=POSTのCGIの場合は
どうしてもフォームを通して検索する必要がありそうなのです。

それから、METHOD=GETだと半角スペースを+に変換するらしいのですが
多くの検索エンジンでは+によってAND検索を行います。よって、
+を記入しても検索エンジン側が「半角スペースである」と判断して
しまうのです。

METHOD=GETの方がフォームが必要無いので、スクリプトとしては
軽くなるのですが、こうしたフォームのMETHOD属性の具体的な違いを、
どなた様か、端的にご説明願えませんでしょうか。長文ですみません。

p.s. 検索エンジンは112サイト、辞書・データベースは42サイト検索できるページです。多機能かつコンパクトになるように工夫しています。

oka [E-Mail] [HomePage] 1998/08/28(金) 00:17:42
(自己レス)すみません。HomePageのURL間違えました。
http://www7.cds.ne.jp/~oka/s/  です。

B-Cus 1998/08/28(金) 00:43:32
ひとつだけ。「+」は「%2B」と書きます。

URLデコードは、
 1. 「+」を空白に変換
 2. %xxを元に戻す
ですから、エンコードはその逆で、
 1. a-zA-Z0-9._-と空白以外を%xxに変換
 2. 空白を「+」に変換
です。

# a-zA-Z0-9._-って、あってるかなぁ。自信ないなぁ。

# ちなみに「~」は将来的には%7eにエンコードする必要は
# なくなるそうです。まだdraftですが、
#  rfc2396   Uniform Resource Identifiers (URI): Generic Syntax
# に書いてあるらしいです。

oka [E-Mail] [HomePage] 1998/08/28(金) 01:13:53
速攻レス、ありがとうございます。
直接「%2B」を付けてやってみたら、うまくいきました(^o^)/
「-」の方はエンコードしないので問題なさそうですね。

しかし、METHODのGETとPOSTの違いにはエンコード等の際に、
どう影響してくるのでしょうか。

B-Cus 1998/08/28(金) 01:25:14
GETとPOSTは、引数(っていうのかな?)の渡し方の違いだけで、
渡すべき内容自体は変わりません。

僕ならpost.cgi?hoge=fugaと呼ぶとPOST形式で送ってくれる
CGIを作るかな。でもJavaScript使えば簡単にできるかもしれない
ですね(僕はJavaScriptはさっぱりなので…)。

匿名希望 1998/08/28(金) 06:22:39
たしか、GETで引数を渡すとデータの量に制限が
あったような・・・
POSTには制限はなかったと思います。

まさお [E-Mail] [HomePage] 1998/08/28(金) 10:10:59
>たしか、GETで引数を渡すとデータの量に制限が
>あったような・・・
たしかにGetではデータ量に制限があります。
が、どのくらい制限があるのか具体的に書かれている資料を
見たことがありません。
どなたかご存知の方いらっしゃいませんか?

B-Cus 1998/08/28(金) 18:51:33
「GETだと最低何文字は送れるようにするべし」なんて
決まってなかったと思うので、処理系依存としか言いようが
ないんじゃないかと…たぶん。

まさお [E-Mail] 1998/08/29(土) 15:53:13
>「GETだと最低何文字は送れるようにするべし」なんて
>決まってなかったと思うので、処理系依存としか言いようが
>ないんじゃないかと…たぶん。
どうも調べたところ、WWWサーバーによって制限されるようです。
環境変数に代入しているようなので、制限は128文字か256文字
程度になるのかな・・・。(自信無し(^^;)

まる高 [E-Mail] [HomePage] 1998/08/31(月) 20:28:59
具体的な資料はわかりませんが、経験から申し上げますと、
(1)JavaScriptではPOSTで送れませんでした。どうもGET扱いになるよ
 うです。location.href="xxx.cgi?parm1+param2+..."とした際、
 3Kbyteの引数をUNIX・Netscape Commerce Serverで受けた場合、
 1Kbyteで切られていました。やむなく、POSTに切り替えました。
(2)GETはUNIXの環境変数BUFSIZに依存しているような気がします。

匿名希望 1998/09/01(火) 16:56:11
GETでの制限は256byte~4,096byteと書いてある資料を見たことが
あります。
~というのは、やはり機種依存なのでしょうか。

まさお [E-Mail] 1998/09/02(水) 17:12:46
皆さん、GETの制限に関して情報ありがとうございました。
私の「GETの制限」関してはもう解決ということで結構です。
okaさんがよろしければ発言をチェックして終了しましょう。

> ~というのは、やはり機種依存なのでしょうか。
機種依存ではないと思いますよ。

oka [E-Mail] [HomePage] 1998/09/03(木) 02:21:33
[[解決]]
GETは環境変数QUERY_STRINGに渡し、
POSTは標準入力に渡すということですが、
GETの場合渡せるデータ量に制限がある、ということですね。

私もいろいろ調べてみましたが、GETは256文字までという
資料がありました。これは*たぶん*UNIXの制限によるものですね。
もう一つの違いは、POSTの場合URIに因数が含まれないので
セキュリティ上、安全であるというのがありますね。
こちらのレファレンスに資料がありました。
http://www.three-a.co.jp/~kmuto/html/node29.html

また、W3CではGETはASCII文字限定と書いてありました。
http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.1
http://www.w3.org/TR/REC-html40/interact/forms.html#form-data-set

何はともあれ、多くの発言をありがとうございました。
結論としては、GETは軽くてJavascriptでも出来るが送れる
データ量とデータの種類に制限があり、
POSTはより高機能である代わりにFORMから送信する必要がある、
ということですね。CGIを利用してJavascriptでGETにされたのを
POSTに変換する、という手もありますが、そこまでするなら
単純にフォーム使ったほうがいいですね。
ではこれにて解決ということにしますが、
まだ何かありましたら遠慮なく発言してください。

B-Cus 1998/09/03(木) 02:47:18
> 結論としては、GETは軽くてJavascriptでも出来るが送れる
> データ量とデータの種類に制限があり、

「軽くて」というのは違うかと思います。データ量的にはあまり
差はないです(ちょっとだけPOSTの方が大きいかな)。

あと、データの種類というのも、

> Note. The "get" method restricts form data set values to ASCII characters.
> Only the "post" method (with enctype="multipart/form-data") is specified to
> cover the entire [ISO10646] character set.

とあるように、基本的にはPOSTでもURLエンコードすべき、という
ふうに認識してますが、もしかして僕が勘違いしてます?(だんだん
心配になってきた)

> もう一つの違いは、POSTの場合URIに因数が含まれないので
> セキュリティ上、安全であるというのがありますね。

それは

> またURIの引数にデータが含まれないので、セキュリティを高めた
> い場合にはこちらを使用します。

のことでしょうか。おそらくPOSTだとhttp://hoge/fuga?=data
なんて風に直接URL表記できない、ってことを言ってるかと
思うんですが、これをもって安全かと言うと??ではないかと
個人的には思います。

POSTだから、ブラウザがちゃんと「a=b&c=d」などという形に
整形して送ってくれる、と期待するのはいかがなものかと
思うんですが、いかがなもんでしょうか(変な日本語(^^;)

[上に] [前に] [次に]