웹브라우저에서 서버측의 CGI프로그램에 요청할 때는 GET, POST방식에 따라서 서버측에서 요청 문자열을 접수하는 방법이 다르다.
GET방식일 경우에는 웹브라우저의 요청 문자열을 서버측 환경변수인 QUERY_STRING에 저장되므로 CGI 프로그램에서는 getenv("QUERY_STRING) 과 같은 방법으로 읽을 수가 있다.
POST방식으로 요청한 경우에는 서버측 환경변수 CONTENT_LENGTH에 요청 문자열의 길이가 저장되고, 실제 요청문자열은 서버측에서 표준 입력스트림으로 읽어야 한다.
아래에 제시된 form.html은 Apache 2.2/htdocs/ 안에 복사하고, posttest.exe는 cgi-bin/안에 복사한 후에 웹브라우저에서 form.html을 요청하고 숫자를 입력한 후에 전송버튼을 누르면 CGI 프로그램이 실행된 결과를 볼 수 있다.
form.html
<head> <title> POST example</title> </head>
<body>
<center>
<form action="http://localhost/cgi-bin/posttest.exe" method="POST">
<input type="text" name="m"/> x
<input type="text" name="n"/> =
<input type="text" value=""/><br>
<input type="submit" value="보여주세요"/>
</form>
</center>
</body>
</html>
posttest.exe
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char content[32];
long m,n;
long length;
/* POST방식으로 요청한 문자열의 크기를 구한다 */
char *content_len = getenv("CONTENT_LENGTH");
/* 문자열의 크기는 문자열 형식이므로 정수로 변환한다 */
sscanf(content_len, "%ld", &length);
/* 표준입력스트림(stdin)으로부터 요청 문자열을 읽어온다 */
fgets(content, length+2, stdin);
printf("Content-Type:text/html;charset=euc-kr\n\n");
printf("<html><head><title> POST요청, 곱셈결과 </title></head>\n");
printf("<body><center>\n");
printf("<h3>POST요청, 곱셈결과</h3>\n");
printf("전달된 파라미터 : %s <br>\n 문자수 : %d \n", content, strlen(content));
if(content==NULL) {
printf("<p>웹브라우저에서 전달된 파라미터 문자열이 없습니다.<br>\n");
printf("<p>요청폼에 2개의 수를 입력하고 다시 해보세요.<br>\n");
}
else if(sscanf(content, "m=%ld&n=%ld", &m, &n)!=2)
printf("<p>파라미터의 값은 정수이어야 합니다<br>.\n");
else
printf("<p>계산 결과: %ld * %ld = %ld.\n", m,n,m*n);
printf("</center></body>\n");
return 0;
}