-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.56860
  • 閲覧数347
  • ありがとう数4
  • 気になる数0
  • 回答数3
  • コメント数0

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

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

  • 回答No.2
レベル7

ベストアンサー率 66% (6/9)

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を参照すれば理解出来ると思います。
補足コメント
noname#149114

早速のご回答ありがとうございます。
ひとつ気になるところがあるのですが、上記コーディングで...

QueryStrはchar型のポインタ変数だと思いますが、METHODの形式が"POST"であった場合
QueryStrの領域は確保する必要性はあるのでしょうか?
上記コーディングを見たところ"POST"であった場合、malloc()での領域確保処理が
内容なので気になってはいるのですが...

教えていただた身で大変恐縮ではありますが、確認のために補足として
記述させていただきました。宜しくお願い致します。
投稿日時 - 2001-03-28 14:56:17
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル8

ベストアンサー率 38% (16/42)

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

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


  • 回答No.3
レベル3

ベストアンサー率 0% (0/4)

METHODの形式が"POST"の場合も当然メモリの確保をする必要があります。 下の人は恐らく書き忘れたのでしょう。 PWSを使用といことなのでこのページはかなり参考になるのではないでしょうか?   http://www.argus.ne.jp/hsp/setup/pwscgi.html パラメーターの解析としてはパラメーターを取得後エンコードされた文字を デ ...続きを読む
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を使って処理するともっとすっきり
かけます。
こんな感じでいかがでしょ?
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ