• ベストアンサー

CGIで受信パラメータを解析する処理

私が使っているマシンはWin98なのですが、ここにWindows付属のPersonalWebSaverをインストールし、 イントラネットを構築するようにしました。 そこで見れるページをVC++4(中身はまったくCです)を使いCGIを 作成することにしました。 そこでCGIを作るにあたり、送信されたきたURLにあるパラメータ(&aaa=xxx)などを解析する処理を 入れたいのですが、どのような処理させればよろしいのでしょうか? サンプルなどご紹介していただけると大変嬉しいです。 では宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

POSTとGETによりパラメータの取得方法が異なります。 環境変数「REQUEST_METHOD」によりPOSTかGETかを判断します。POSTの場合は標準入力からGETの場合は環境変数「QUERY_STRING」からパラメータを取得します。取得したパラメータはエンコーディングされているので、処理可能な文字列に変換する必要があります。 パラメータの取得方法のサンプル /* REQUEST_METHOD環境変数の取得 */ MethodPtr=getenv("REQUEST_METHOD"); /* METHOD==POST */ if(0==memcmp(MethodPtr,"POST",4)) { /* CONTENT_LENGTH環境変数の取得 */ ContentLengthPtr=getenv("CONTENT_LENGTH"); /* 標準入力より読込み */ ReadSize=read((int)0,QueryStr,ContentLength); } /* METHOD==GET */ else if(0==memcmp(MethodPtr,"GET",3)) { /* QUERY_STRING環境変数の取得 */ WkQueryStr=getenv("QUERY_STRING"); QueryStr = malloc( strlen(WkQueryStr)+1 ) ; strcpy( QueryStr , WkQueryStr ) ; } こんな感じです。 パラメータの取得サンプル WorkPtr = (char *)strstr( QueryStr , "code=" ) ; WorkPtr+=5; /* "code="の文字数分インクリメント */ do{   if(NULL==*WorkPtr || '&'==*WorkPtr) { break; } wk_code[strlen(wk_code)]=*WorkPtr; WorkPtr++; }while(1); こんな感じです。 パラメータのエンコーディングの解凍方法については参考URLを参照すれば理解出来ると思います。

参考URL:
http://www.iroiro.org/cgi/index.html
noname#149114
質問者

補足

早速のご回答ありがとうございます。 ひとつ気になるところがあるのですが、上記コーディングで... QueryStrはchar型のポインタ変数だと思いますが、METHODの形式が"POST"であった場合 QueryStrの領域は確保する必要性はあるのでしょうか? 上記コーディングを見たところ"POST"であった場合、malloc()での領域確保処理が 内容なので気になってはいるのですが... 教えていただた身で大変恐縮ではありますが、確認のために補足として 記述させていただきました。宜しくお願い致します。

その他の回答 (2)

  • kenbo00
  • ベストアンサー率0% (0/4)
回答No.3

METHODの形式が"POST"の場合も当然メモリの確保をする必要があります。 下の人は恐らく書き忘れたのでしょう。 PWSを使用といことなのでこのページはかなり参考になるのではないでしょうか?   http://www.argus.ne.jp/hsp/setup/pwscgi.html パラメーターの解析としてはパラメーターを取得後エンコードされた文字を デコードする必要があります。 サンプルソース /*************** 日本語にデコードする  ****************/ void decode(char *url) { int i, j; for(i = 0, j = 0; url[j]; ++i, ++j){ if((url[i] = url[j]) == '%'){ url[i] = tochar( &url[j + 1]); j += 2; } else if (url[i] == '+') url[i] = ' '; } url[i] = '\0'; } char tochar(char *x) { register char c; c = (x[0] >= 'A' ? ((x[0] & 0xdf) - 'A') + 10 : (x[0] - '0')); c *= 16; c += (x[1] >= 'A' ? ((x[1] & 0xdf) - 'A') + 10 : (x[1] - '0')); return c; } tocharで行っている処理をsscanfを使って処理するともっとすっきり かけます。 こんな感じでいかがでしょ?

  • baha
  • ベストアンサー率38% (16/42)
回答No.1

UNIXでの経験しかないのでWindowsでは違うかもしれませんが。 パラメータにはGETとPOSTがありますが、たぶん質問されているのは GETの場合だと思われます。 GETのパラメータは環境変数"QUERY_STRING"に格納されます。 それをgetenv()関数で取得します。 取得した文字列より目的のパラメータの値を取り出せばOKです。 POSTの場合は、標準入力(stdin)できますので、その中身を readすれば中身を取得できます。 Windowsは違っていたらゴメンナサイ。

noname#149114
質問者

お礼

早速のアドバイスありがとうございます。 こちらでWindowsで試したところうまく動作してくようでした。 自分でもUNIXしかダメなのかなとあきらめつつやってみたところ、 WinもUNIXも同様のようでした。 OSは違うとも考え方は一緒なんですね。

関連するQ&A