Шаг 9 - Обработка простой формы

Понятие формы языка html описано в "Шаг 19 - Изящные формы" раздела Html&Web. Давайте сделаем простую форму.

<form action="http://localhost/cgi-bin/primer.cgi" method=GET>
Введите свое имя пользователя:
<input type=text maxlength=150 name=user>
<p><input type=submit value=Send>
</form>

Мы уже обсуждали методы передачи данных в шлюз раньше. Какие тут могут быть советы ? Лично мне кажется передавать такие маленькие формы лучше всего посредством метода GET. С чем это связано ? Во-первых получить данные из переменной окружения намного легче, чем считать их из потока. Чтобы считать данные из потока надо точно знать их размер, позаботиться о выделении памяти и многом другом. Тут же обо всем позаботится сервер и встроенные средства программирования вашего языка. Во-вторых пользователь сможет обратиться к вашему скрипту непосредственно из адресной строки браузера. Например, многие программы для поиска информации в интернете используют различные поисковые сервера. Для того чтобы сделать запрос к одному из них требуется всего лишь вызвать браузер и сообщить ему URL. В Windows это делается просто в командной строке (а значит и просто сделать программе):

  start http://www.abc.com/cgi-bin/search.cgi?word=hello&language=ru

Таким образом программа может сразу вызвать браузер с уже подготовленной страничкой и пользователю не прийдется даже знать адрес этого поисковика и как он работает, все знает программа.

С методом POST в этом отношении сложнее, для этого программе нужно уметь работать по протоколу HTTP и связываться с серверами в интернете. Размер и сложность такой программы будет на порядок выше. Поэтому, если Ваш ресурс может быть полезен и при этом передаваемые ему данные не будут превышать 32 Кб (это ограничение на длинну URL, если я все правильно помню :-), то лучше метода GET не найти.

Давайте напишем программу для обработки этой формы.

#include <stdio.h>
#include <stdlib.h>

//Здесь надо вставить процедуру получения
//параметра по его имени... Она была описана
//раньше.

char *getparam(...)
{
};

int main()
{
  char *user=NULL;
  char *content=NULL;
  char *request_method=getenv("REQUEST_METHOD");
  if (strcmp(request_method,"GET")!=0)
	{
		printf("Content-type: text/html\n\n");
		printf("Unknown REQUEST_METHOD. Use only GET !\n");
		return -1;
	};
  
  content=getenv("QUERY_STRING");
  user=getparam(content,"user=");
  printf("Content-type: text/html\n\n");
  printf("User name=\"%s\"\n",user);
};

После того как вся программа будет собрана и откомпилированна, расположите ее в директории cgi-bin вашего вебсервера. Теперь можно смело пробовать форму написанную выше. Я для теста использовал браузер напрямую... Как я уже говорил, достаточно набрать

   http://localhost/cgi-bin/primer.cgi?user=hello
И Вы увидите тот же результат, что и при использовании формы. Кстати вот он:
  User name="hello" 

Обратите внимание на то, что я уже в первой программе начинаю предусматривать возможные ошибки, и поэтому неизвестные программе методы она не будет выполнять. Вообще Вы должны приучиться к этому сразу, т.е. отлавливать возможные ошибки уже на этапе создания шлюза, иначе без этого он может стать большой дырой в системе безопастности вашего сервера. Я по ходу шагов еще тысячу раз упомяну Вам об этом, но только потому, что это действительно очень важно.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.