私が使っているマシンはWin98なのですが、ここにWindows付属のPersonalWebSaverをインストールし、
イントラネットを構築するようにしました。
そこで見れるページをVC++4(中身はまったくCです)を使いCGIを
作成することにしました。
そこでCGIを作るにあたり、送信されたきたURLにあるパラメータ(&aaa=xxx)などを解析する処理を
入れたいのですが、どのような処理させればよろしいのでしょうか?
サンプルなどご紹介していただけると大変嬉しいです。
では宜しくお願い致します。
No.1
- 回答日時:
UNIXでの経験しかないのでWindowsでは違うかもしれませんが。
パラメータにはGETとPOSTがありますが、たぶん質問されているのは
GETの場合だと思われます。
GETのパラメータは環境変数"QUERY_STRING"に格納されます。
それをgetenv()関数で取得します。
取得した文字列より目的のパラメータの値を取り出せばOKです。
POSTの場合は、標準入力(stdin)できますので、その中身を
readすれば中身を取得できます。
Windowsは違っていたらゴメンナサイ。
早速のアドバイスありがとうございます。
こちらでWindowsで試したところうまく動作してくようでした。
自分でもUNIXしかダメなのかなとあきらめつつやってみたところ、
WinもUNIXも同様のようでした。
OSは違うとも考え方は一緒なんですね。
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
この回答への補足
早速のご回答ありがとうございます。
ひとつ気になるところがあるのですが、上記コーディングで...
QueryStrはchar型のポインタ変数だと思いますが、METHODの形式が"POST"であった場合
QueryStrの領域は確保する必要性はあるのでしょうか?
上記コーディングを見たところ"POST"であった場合、malloc()での領域確保処理が
内容なので気になってはいるのですが...
教えていただた身で大変恐縮ではありますが、確認のために補足として
記述させていただきました。宜しくお願い致します。
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を使って処理するともっとすっきり
かけます。
こんな感じでいかがでしょ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI サイト訪問者の情報を取得したい 1 2023/02/21 11:03
- CGI (フリーの)ツリー掲示版CGI、昔は多用させてもらいましたが・・今セキュリティ上どうでしょう? 2 2023/06/25 07:18
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- CGI htmlからcgiを自動的に起動させたい 1 2023/02/21 19:39
- Perl perlのrequireの動き方についての質問 2 2022/10/30 17:27
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- ASP・SaaS イントラネットを構築したい 2 2022/04/24 11:08
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
like演算子内に変数って使えな...
-
データ数をカウントしたいのですが
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
Spreadの選択行の取得について
-
count(*)で取得した値をJAVAの...
-
コンボボックスの表示は最大何行?
-
ListViewで複数選択された項目...
-
リクエストからArrayListのデー...
-
getParameter と getAttribut...
-
VBA リストボックス内の値を複...
-
Flexgridで選択行の列の値を取...
-
自動的に高さ指定していないt...
-
URLパラメータの取得方法を教え...
-
JavaScriptにおいてコンピュー...
-
C言語にてプログラミングを行っ...
-
DOS窓の非表示
-
getUpdateCount( ); でDelete件...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBA:小数点以下の数字を取得で...
-
count(*)で取得した値をJAVAの...
-
データ数をカウントしたいのですが
-
like演算子内に変数って使えな...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
JavaScriptでWindowsログオンID...
-
利用者側のMACアドレスを取得し...
-
郵便番号検索APIにてget Elemen...
-
COMポート 名前を取得する方法
-
コンボボックス表示文字列を取...
-
VBA Shapesの座標からセル位置...
-
Spreadの選択行の取得について
-
VBScriptで数値にコンマを付け...
-
C言語におけるコンピュータ名・...
-
Excel VBA でログインしてい...
おすすめ情報