- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIでPOSTで送受信するプログラムの作り方)
CGIでPOSTで送受信するプログラムの作り方
このQ&Aのポイント
- C言語でCGIを作成する際に、POSTメソッドで送受信するプログラムを統合できるか疑問に思いました。
- 以下の2つのプログラムを1つに統合して、送受信を1つのプログラムで行うことはできないのでしょうか?
- 回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
普通のCGI(Perlとかphp)では、入力フォームを返すのとフォームからのPOST(やGET)を受け取って処理するスクリプトが同一というのはよくあります。httpリクエストがどうなっているか(content bodyの有無やQueryString)で処理を分けます。 提示されたソースでも >clen = getenv("CONTENT_LENGTH"); >if(clen == NULL){ >printf("no contents.\n"); no contentsを返す代わりに、最初のソースにある「入力フォームを返す」ようにすればいいだけです。
その他の回答 (1)
- ralf124c
- ベストアンサー率52% (232/446)
回答No.1
POSTで送信すれば、URLのケツについてるデータも送られます(要するにGETメソッド)。 環境変数「QUERY_STRING」に入っているのでそれも取り出せばいいのです。 ただし、処理の仕方によってキーコードでデータ管理するとキー名がダブる可能性がゼロでないことに留意してください。 例: POSTで「A=200」と送信 GETでも「A=125」と送信 となった場合キーコードAをどのように扱うかという点です。 まあ、Cには連想配列が無いのでいらぬ心配かと思いますが念のため また、メジャーブラウザでは検証済みですが、必ずこれが保証されるものではないことにもご注意ください。
質問者
お礼
ご回答ありがとうございます。
お礼
ご回答ありがとうございました。 無事、解決致しました。
補足
ありがとうございます。無事に 動作致しました。 気が向いたらご回答頂きたいのですが、、 入力フォームにGETでの送信を追加し、 GETとPOSTを判断するする機能も追加しようと、 以下のプログラムを組みました。 /* 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"); } こちらを動作させようとしたのですが、 上手く動作せず、(白紙のページが表示されるだけでした。) getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは? こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。 何も送信していないのに、GETと判断されているのは何故でしょうか? 重ねてのご質問で申し訳ありません。 ご迷惑でしたらお答え頂かなくても大丈夫です。