こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CGIで送受信するプログラムの作り方

入力フォームを返すのとフォームからのPOSTとGETを受け取って処理する、
同一のスクリプトを、CGI、C言語で作成致しましたが、
上手く動作していません。(白紙のページが表示されるだけでした。)
getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは?
こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。
何も送信していないのに、GETと判断されているのは何故でしょうか?
また、正しい動作をするプログラムをご提示頂けますと助かります。

/* form2.c */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int len;
char *clen;
char *data,*method,*qs;

printf("Content-type: text/html\n\n");
printf("<html><head></head><body>\n");

method = getenv("REQUEST_METHOD");
printf("%s\n", method);

if(method == NULL){
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<head>\n");
printf("<title>form test page</title>\n");
printf("</head>\n");
printf("<body>\n");

printf("<form method=\"post\" action=\"form2.cgi\">\n");
printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n");
printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n");
printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n");
printf("<input type=\"submit\" value=\"書き込み\">\n");
printf("</form>\n");

printf("<form method=\"get\" action=\"form2.cgi\">\n");
printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n");
printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n");
printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n");
printf("<input type=\"submit\" value=\"書き込み\">\n");
printf("</form>\n");

printf("</body>\n");
printf("</html>\n");
exit(0);
}

//POST
else if(!strcmp(method, "POST")){
clen = getenv("CONTENT_LENGTH");
if(clen == NULL){
exit(0);
}
len = atol(clen);
data = malloc(len+1);
scanf("%s",data);
data[len] = '\0';
printf("Content-type: text/html\n\n");
printf("<html><head></head><body>\n");
printf("%s<br>\n", data);
printf("</body></html>\n");
}
//GET
else if(!strcmp(method, "GET")){
qs = getenv("QUERY_STRING");
printf("Content-type: text/html\n\n");
printf("<html><head></head><body>\n");
printf("%s<br>\n", qs);
printf("</body></html>\n");
}
printf("</body></html>\n");
}

宜しくお願いいたします。

投稿日時 - 2012-11-15 12:15:38

QNo.7798788

困ってます

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

たびたびすいません。
URLが空でないかぎりと書きましたがCGIを呼び出すからには空というのはありえないので、要するにURL情報にドメインやらパスやらCGIファイル名なんか入れてCGIを呼び出すと、リクエストメソッドはGETまたはPOSTのいずれかの値をとり、デフォルトではGETとなるのでした。
フォームタグで通常、「method="????"」でメソッドタイプを指定するのですが、省略されてsubmitされたり、直でCGI呼び出しがあったりすると、Webサーバ側では自動的にGETメソッドと判断されます。
正しい動作の例って
//GET
else if(!strcmp(method, "GET")){
 qs = getenv("QUERY_STRING");
 printf("Content-type: text/html\n\n");
 if(strlen(qs) > 0){
  printf("<html><head></head><body>\n");
  printf("%s<br>\n", qs);
  printf("</body></html>\n");
 }else{
  printf("<html><head></head><body>\n");
  printf("%s<br>\n", "パラメータが無いよ。");
  printf("</body></html>\n");
 }
}
こんな感じ?

投稿日時 - 2012-11-15 19:30:15

お礼

ご丁寧なご回答ありがとうございました。
解決しました。

投稿日時 - 2012-11-15 23:47:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

POSTでなく、URLが空でないかぎり、REQUEST_METHODはGETになってしまいます。
REQUEST_METHODがGETで、なおかつQUERY_STRINGが空のとき、なにもないと判定するといいと思います。

投稿日時 - 2012-11-15 12:32:47

お礼

ありがとうございます!

投稿日時 - 2012-11-15 23:47:40

あなたにオススメの質問