Как вы синхронизируете CGI-программирование? - PullRequest
3 голосов
/ 15 декабря 2011

Я написал простую веб-форму, которая будет принимать информацию о пользователе (через POST) и вставлять ее в базу данных.Это не мой типичный тип программирования, но он был достаточно прост, чтобы у меня не было никаких проблем.

В любом случае, веб-форма существует на HTML-странице и довольно стандартна.Что-то вроде следующего (упрощенный пример):

<form method="post" action="/cgi-bin/submit_form" enctype="x-www-form-encoded" id="frm">
   <input id="txtName" type="text" />
   <input id="txtPhone" type="text" />   
   <input id="btnSubmit" type="submit" value="Submit" />
</form>

И у меня есть приложение C ++ (cgi-bin/submit_form), которое запускается при отправке и сохраняет данные в базе данных.

Iнаписал очень простую CGI-библиотеку, которая по сути анализирует выходные данные, которые выглядят примерно так:

txtName=<name>&txtPhone=<phone>&btnSubmit=Submit

И библиотека анализирует ее в map<string, string> следующим образом:

myMap["txtName"] = "John";
myMap["txtPhone"] = "1.800.555.5555";

Что потом довольно легко поместить в базу данных.Однако совершенно очевидно, что мое приложение полностью зависит от имен переменных элемента html (txtName, txtPhone).Если что-то из этого будет изменено, мое приложение внезапно перестанет работать.


У меня вопрос: как синхронизировать процесс получения данных из CGI в приложение на стороне сервера?

Мне очень повезло, что я отвечаю за HTML и серверный скрипт.Но должны быть сценарии, когда один человек управляет веб-сайтом, а другой - сценариями, и они должны каким-то образом координировать действия, чтобы не допустить ничего плохого.

В таких ситуациях ICD можетиспользоваться.Например, при передаче данных XML можно использовать XSD для определения структуры данных.

Есть ли что-нибудь подобное в программировании CGI?Я очень напуган тем, насколько хрупким и легко ломается мое приложение.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Я думаю, что под «синхронизацией» вы имеете в виду эволюцию модели данных, а не блокировку взаимного исключения критических участков кода.

Один (частичный) способ справиться с этим - сгенерировать HTML и запустить скрипт CGI из общей базы данных, которая определяет поля.

3 голосов
/ 15 декабря 2011

Вы имеете в виду изменения между именами элементов HTML и полями, анализируемыми вашим CGI-скриптом?

Что касается чего-то столь формального, как XSD, я не верю.

Как правило, это тот же класс решений, что и

  • система командной строки Unix;
  • Переменные среды;
  • поля заголовков HTTP и SMTP;

… то есть значения POST являются строками произвольной формы и могут по вашему желанию читать, игнорировать или жаловаться на ваш сервер. (Точно так же, как вы можете свободно включать «мусор» в вашу среду или в заголовки SMTP, вплоть до пределов допуска любой системы, в которую вы их отправляете.)

Тем не менее, если у вас do есть отдельный дизайнер, пишущий симпатичные HTML-документы, и другой человек, пишущий приложение, в которое они публикуют, существует любое количество специальных способов совместной работы. Лично я обычно использовал Perl POD или Javadoc (или любой другой подходящий / аналогичный инструмент для встроенной документации для вашего языка) для документирования принятых параметров и ограничений и сделал их доступными для художественного отдела (или кого бы то ни было) в качестве хороших HTML-страниц, которые они может притворяться, что читает.

Если вы, скорее, имеете в виду столбцы таблицы SQL, то существует любое количество инструментов, которые будут генерировать довольно приличную документацию непосредственно с сервера SQL, от SHOW CREATE TABLE foo и выше… SQL DDL сам по себе является схемой на заказ XSD.

0 голосов
/ 15 декабря 2011

У вас может быть специфическая для операционной системы блокировка постоянных данных (то есть файла или базы данных), обновленных вашей программой CGI.

Точнее говоря, если в системе Linux, выполняющей вашу CGI-программу, написанную на C ++, если данные находятся в одном (например, текстовом) файле, вы можете заблокировать этот файл (внутри CGI) с помощью flock системный вызов. Если вы используете файл GDBM , библиотека GDBM, вероятно, сделает за вас блокировку. Если это база данных MySQL, есть способы сериализации доступа к ней (а за это отвечает сервер MySQL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...