HTMLのformからPOSTメソッドでデータを取得してみます。
・HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form action="cgiへのパス" method="post">
<textarea name="test1"></textarea>
<textarea name="test2"></textarea>
<input type="submit" value="送信">
</form>
</body>
</html>form内にテキストエリアが2つ(nameは"test1"と"test2")あり、8行目で呼び出すCGIへのパスとPOSTメソッドを指定しています。・C++
#include <iostream>
#include <string>
#include <stdlib.h> // getenv
using namespace std;
//! 文字列から値に変換します。
template < typename T > T convert( const std::string & str )
{
std::istringstream istream( str );
T type = 0;
if ( !str.empty())
{
istream >> type;
}
return type;
};
int main()
{
// 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。
std::string request_method = getenv( "REQUEST_METHOD" );
if ( request_method != "POST" )
{
cout << "REQUEST_METHOD : " << request_method << endl;
return 0;
}
// 送信されたサイズを取得します。
std::string lengthStr = getenv( "CONTENT_LENGTH" );
unsigned long length = convert< unsigned long >( lengthStr );
if ( length > ( 1024 * 1024 /* 1M byte*/))
{
cout << "CONTENT_LENGTH : " << lengthStr << endl;
return 0;
}
// 送信されたデータを保存する文字列のメモリを確保します。
char * tmpBuf = new char[ length + 1 ];
if ( !tmpBuf )
{
cout << "Allocate is failed." << endl;
return 0;
}
// 標準入力からPOSTされたデータを取得します。
if ( fread( tmpBuf, 1, length, stdin ) != length )
{
cout << "fread is failed." << endl;
return 0;
}
tmpBuf[ length ] = '\0';
// HTMLを出力します。
cout << "Content-Type: text/html" << endl << endl;
cout << "<html>" << endl;
cout << "<head><title>test</title></head>" << endl;
cout << "<body>" << endl;
cout << tmpBuf << "<br>" << endl;
cout << "</body>" << endl;
cout << "</html>" << endl;
return 0;
}
9行目から20行目までは、文字列から数値に変換する関数です。
送信されたサイズを数値に変換するのに使用しています。
25行目で環境変数[REQUEST_METHOD]からGET/POSTのどちらのメソッドかを取得しています。
32~39行目までは環境変数[CONTENT_LENGTH]から送信されたサイズを文字列で取得した後、数値に変換しています。
42行目で、送信されたデータを保存する文字列のメモリを確保し、
50行目でfreadを使用して送信されたデータを確保したメモリに書き込んでいます。
57行目移行は、送信されたデータをHTMLとして書き出しています。
GETメソッドと同様、送信されたデータはURLエンコードされnameと内容が[=]で結ばれ、各項目が[&]で結ばれます。
最初の テキストエリア(test1)に[123]、次のテキストエリア(test2)に[test]を入力した時は、
送信される文字列は[test1=123&test2=test]になります。
実際に使用する時は、文字列をURLデコードし文字列を[&]と[=]で区切る必要があります。

Posted in: 
1 コメント:
All Your favorite online casino games - 벳썸 바카라사이트 바카라사이트 bet365 bet365 31BEST Casino Games Online for Real Money | 났체크 먹튀
コメントを投稿