アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (3件)

UNIXでの経験しかないのでWindowsでは違うかもしれませんが。


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

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

お礼日時:2001/03/28 14:45

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

この回答への補足

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

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

教えていただた身で大変恐縮ではありますが、確認のために補足として
記述させていただきました。宜しくお願い致します。

補足日時:2001/03/28 14:56
    • good
    • 0

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を使って処理するともっとすっきり
かけます。
こんな感じでいかがでしょ?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!