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:
 Posted in:   

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