telnetからPOSTでデータを渡す方法について

はじめまして。
telnetで探るWWWとHTTPの仕組みを見てクライアントとサーバ間の
GET仕組みが分かりました。
そこで、telnetからPOSTで送信しようとしたのですが、値を渡す事が出来ませんでした。
POSTでデータを渡すにはどのように記述すればよいのでしょうか?

つまり、このようにして test_data1 に yes , test_data2 に no,
を設定して送信し,サーバ側でそれぞれの値を取得したいのです。

[a@tatsuya]$ telnet 193.240.xxx.xxx 80
Trying 193.240.xxx.xxx...
Connected to 193.240.xxx.xxx.
Escape character is '^]'.
POST /test/test.php HTTP/1.0
test_data1:yes
test_data2:no

よろしくお願いします。

名前: 
たつや
日時: 
02/03/29 19:32

コメント

フォームに入力したデータは,
<パラメータ名>=<値>&<パラメータ名>=<値>&....
というような形式で送ることになっています。
だから,
POSTコマンドでフォームのデータを送るときの形式は
下のようになります。
このとき,Content-Lengthヘッダを忘れずにつけてください。
-----
POST <プログラムのURI> HTTP/1.0
Content-Length:<空白行以後の長さ>
(空白行)
<パラメータ名>=<値>&<パラメータ名>=<値>
-----

ちなみに,GETコマンドで送るときは次のようになります。
-----
GET <プログラムのURI>?<パラメータ名>=<値>&<パラメータ名>=<値> HTTP/1.0
(空白行)
-----
GETのときは,Contet-Lengthは不要です。

回答ありがとうございました。

教えていただいたPOST形式でチャレンジしてみましたが
Content-Lengthを設定し
次の(空白行)を入れようとして
リターンキーを1回押下すると、すぐに
HTTP/1.1 200 OKという返却が帰ってきてコネクションが切れ
送りたいデータの設定が出来ませんでした。

それではと(空白行)にスペースを設定すればいいのかなと
思いやってみると
HTTP/1.1 400 Bad Requestとなりました。

(空白行)はどうやって入力すれば良いのでしょうか?

単純な質問で申し訳有りませんがよろしくお願いします。

>リターンキーを1回押下すると、すぐに
>HTTP/1.1 200 OKという返却が帰ってきてコネクションが切れ
>送りたいデータの設定が出来ませんでした。

telnetはどんなソフトを使ってますか?
その設定はどうなっていますか?
要するに,リターンキーを押したときにどんなコードが送信されるのか,
が問題なので,そこを確かめた方がいいでしょう。
HTTPの仕様では,改行コードは CRLF と定められています。
もし,telnetの設定がわからないようなら,
下記のようにコントロールキーを使って,CRやLFを直接入力する方法もあります。
 CR = ctrl-m
 LF = ctrl-j

>それではと(空白行)にスペースを設定すればいいのかなと
>思いやってみると
>HTTP/1.1 400 Bad Requestとなりました。

空白行は,行の先頭にCRLFがある行,ということですから,
空白を入れてはいけません。
表題 返信 削除
>リターンキーを1回押下すると、すぐに
>HTTP/1.1 200 OKという返却が帰ってきてコネクションが切れ
>送りたいデータの設定が出来ませんでした。

telnetはどんなソフトを使ってますか?
その設定はどうなっていますか?
要するに,リターンキーを押したときにどんなコードが送信されるのか,
が問題なので,そこを確かめた方がいいでしょう。
HTTPの仕様では,改行コードは CRLF と定められています。
もし,telnetの設定がわからないようなら,
下記のようにコントロールキーを使って,CRやLFを直接入力する方法もあります。
 CR = ctrl-m
 LF = ctrl-j

>それではと(空白行)にスペースを設定すればいいのかなと
>思いやってみると
>HTTP/1.1 400 Bad Requestとなりました。

空白行は,行の先頭にCRLFがある行,ということですから,
空白を入れてはいけません。

telnetのソフトは"Tera Term"を使用しています。

TeraTermの設定の
Terminal setup --- New-line --- Transmit が "CR"になっていたので
"CR+LF"にしてみましたが (Terminal ID : VT100)
1回リターンキーを押すとコネクションが切れてしまいます。

また、
コントロールキーを使って,CR+LFを直接入力しようとして
"ctrl+m"を押すだけでコネクションが切れてしまいました。
ちなみにコントロールキーを使って,CR+LFを直接入力する場合は
(ctrl-m)を押して、すぐ(ctrl-j)を押すのでしょうか?

それではと、
Windows付属のtelnetでやってみようと思いましたが
改行コードの設定個所が有りませんでした。

>コントロールキーを使って,CR+LFを直接入力しようとして
>"ctrl+m"を押すだけでコネクションが切れてしまいました。

サーバ側のアプリケーションはどんなものですか?
HTTPのメッセージヘッダの内容によって,
エンティティボディ(空白行以後の部分)
の有無をチェックしているようなものもありますから,
その手のものは,適当にヘッダを指定しないとだめです。
要するに,サーバ側のアプリケーションによって,
動作が違うことがある,ということです。

下記のシェルスクリプトのように,ヘッダを何もチェックしないものだったら,
Content-Lengthのバイト数だけボディのデータと取り込んでくれるんですけど...
-----
#!/bin/sh
echo "Content-type: text/html"
echo
echo 'Body: '
read BODY
echo $BODY
-----

それから,HTTP 1.1はHostヘッダなどが必要なので,
それもボディを入力する前にエラーのページが出てくるかもしれません。

>ちなみにコントロールキーを使って,CR+LFを直接入力する場合は
>(ctrl-m)を押して、すぐ(ctrl-j)を押すのでしょうか?

そうです。

回答ありがとうございます。

サーバ側の設定は以下の通りです。

OS:RedHat7.1J
WEBサーバ:Apache-1.3.19
(ちなみにApacheはMediaBaseという映像配信ソフトに
 付属していたKasenna社のApacheですが
 普通のApacheと特に違いはないと思います。)

よろしくお願いします。

POSTでデータをサーバに送る,
ということの意味をもう一度考えてください。

つまり,POSTでデータを送るということは,
サーバ側にデータを受信するアプリケーションがあるということです。
POSTでデータを送る方法自身は,[110]のメッセージに書いたとおりですし,
その後,受け取ったデータをどう扱うかは,
サーバ側のアプリケーションの問題なんです。
つまり,データを受け取ったアプリケーションがどう動くか,ということなので,
アプリケーションを調べてみないとわからないのです。
そうそう,ここでいっているアプリケーションっていうのは,
Webサーバのことではなく,CGIやPHPなどで書いたアプリケーションのことです。

試しに[117]に載せておいたCGIアプリケーションをサーバに置いて,
それをPOSTで呼び出してみてください。
空白行の後,Content-Lengthの長さだけデータを入力したところで,
サーバから応答が返ってくるはずです。

たびたび申し訳有りません。

今回の実験用HTMLとPHPのソースは以下のようになっています。

------------------------------------------------------------
index.html
------------------------------------------------------------

テスト

------------------------------------------------------------

"Login"ボタンを押すと呼ばれる"test.php"は

------------------------------------------------------------
test.php
------------------------------------------------------------

テスト2

<?
echo " POST DATA
";
while ( list( $key, $val ) = each( $HTTP_POST_VARS ) ) {
echo "$key => $val
";
}
?>

------------------------------------------------------------

ブラウザを使用して上記を実行しました。

テキストボックスに"yes"と入力して"Login"ボタンを押下すると
ブラウザ上に以下の様に表示されました。

------------------------------------------------------------
POST DATA
test_data1 => aaa
test_data2 => no
------------------------------------------------------------

ブラウザからは正常に処理されていますので
サーバ側のPHPアプリケーションは正常に動作していると思います。

この"Login"ボタンを押した時の動作を
telnetを使って動作させたかったのですが

[a@tatsuya]$ telnet 193.240.xxx.xxx 80
Trying 193.240.xxx.xxx...
Connected to 193.240.xxx.xxx.
Escape character is '^]'.
POST /test/test.php HTTP/1.0
Content-Length:28
(空白行)
test_data1=yes&test_data2=no

上記の空白行をいれようとすると
"test_data1=yes&test_data2=no"を入力する暇も無く
すぐにHTTP/1.1 200 OKという返却が帰ってきてコネクションが切れます。

結果は以下の様になります。

------------------------------------------------------------
[a@tatsuya]# telnet 193.240.xxx.xxx 80
Trying 193.240.xxx.xxx...
Connected to 193.240.xxx.xxx.
Escape character is '^]'.
POST /test/test.php HTTP/1.0
Content-Length:28
← ここが入力できません。
HTTP/1.1 200 OK
Date: Mon, 01 Apr 2002 09:20:16 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.5
X-Powered-By: PHP/4.0.5
Connection: close
Content-Type: text/html
Expires: Mon, 01 Apr 2002 09:20:16 GMT

テスト2

POST DATA

Connection closed by foreign host.

------------------------------------------------------------

初心者で分からない事が多いのため
もっといろいろパターンを試してやってみます。

このような質問にも丁寧に回答していただきありがとうございました。

>今回の実験用HTMLとPHPのソースは以下のようになっています。

PHPですか。
PHPはContent-Type:ヘッダを書いてあげないとはだめなんです。
つまり,PHPはContent-Typeヘッダを見て,
その内容によってエンティティボディの中身を解釈するので,
それがないとだめなんです。
これは,POSTの仕組みの問題ではなくて,PHPの事情によるものです。

POSTするときに,次のようにHTTPヘッダをつければ,
うまくいくと思いますよ。

-----
POST <プログラムのURI> HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: <長さ>
(空白行)
<パラメータ名>=<値>&<パラメータ名>=<値>
-----

[128] Re[123] ありがとうございました。 たつや 2002/04/01 20:49
表題 返信 削除
Content-Typeヘッダをつけてみたところ
結果は以下の通りうまくいきました。

このような質問に大切な時間を割いて頂き感謝しています。
本当にありがとうございました!。

----------------------------------------------------

[a@tatsuya]$ telnet 193.240.XXX.XXX 80
Trying 193.240.XXX.XXX...
Connected to 193.240.XXX.XXX.
Escape character is '^]'.
POST /test/test.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length:28

test_data1=yes&test_data2=no

HTTP/1.1 200 OK
Date: Mon, 01 Apr 2002 11:38:10 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.5
X-Powered-By: PHP/4.0.5
Connection: close
Content-Type: text/html
Expires: Mon, 01 Apr 2002 11:38:10 GMT

テスト2

POST DATA
test_data1 => yes
test_data2 => no

Connection closed by foreign host.