2011-12-15 2 views
3

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

В любом случае, веб-форма существует на 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), который работает, когда он будет представлен и сохраняет данные в базе данных.

Я написал очень простую библиотеку 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

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

Насколько это так формально, как XSD, я так не верю.

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

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

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

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

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

+0

Спасибо. Это именно то, что я имею в виду: координация имен элементов HTML и анализируемых полей. Я ценю ваше понимание. – Eric

0

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

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

+1

Посмотрите, что на самом деле означает OP, «синхронизируйте». Он не предназначен для блокировки ресурса, а для обеспечения надлежащего определения полей ввода. – Christopher

+0

@ Кристофер: Да, это правильный смысл, который я собирался сделать. Я не мог придумать лучшего слова для этого. – Eric

3

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

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

+2

И это прагматичный подход. Также ортогонально. Хант и Томас были бы так горды! :) Дополнительное преимущество здесь, предполагая, что вы всегда * генерируете метки полей из схемы базы данных, заключается в том, что вы избегаете неправильного поля. Проблема, однако, заключается не в том, чтобы предоставить спецификацию или подпрограмму для другого сопровождающего - это заставить его на самом деле назвать это! :) – Christopher

Смежные вопросы