Страница 1 из 30
Сегодня такие вещи, как гостевая книга, поиск по серверу, форма для отправки сообщений - неотъемлемый атрибут практически любого серьезного сайта. Проблема внедрения этих и других прибамбасов, разумеется, всячески возбуждает воображение начинающего вебмастера, лишая его сна, аппетита и тяги к пиву. К сожалению, изучение HTML-исходников страниц конкурентов ничего, кроме ссылок на некий "cgi-bin", не дает, да еще в телеконференциях иногда встречается упоминание о каких-то cgi-скриптах. Эта статья и посвящена основам использования этих самых cgi-скриптов во славу и процветание вашего сайта.
Для начала, думаю, надо разобраться с понятиями. CGI-скрипт - это программа, которая выполняется на Web-сервере по запросу клиента (то есть посетителя Web-сайта). Программа эта принципиально ничем не отличается от обычных программ, которые установлены на вашем компьютере - будь то MS Word или игра Quake. CGI - это не язык программирования, на котором написан скрипт, а Common Gateway Interface - специальный интерфейс, с помощью которого и происходит запуск скрипта и взаимодействие с ним.
GET /~paaa/cgi-bin/guestbbok.cgi HTTP/1.0 -Вот это самое главное в запросе
Ну и если запрошен простой файл например .html то если если такой файл есть, То сервер отошлет браузеру ответ:
HTTP/1.0 200 Okay
Content-Type: text/html
Далее после пустой строки(она нужна чтоб отделить заголовок
от тела
) идет информация из самого URL
"а
Краткие сведения о том что надо знать чтоб писать CGI
скрипты: Ну вопервых надо знать что такое интернет
и как он работает (а вы знаете? ;)))
) Ну и чуть-чуть умения прграмировать(это самое главное)
Давайте вместе писанем какой нибудь простенький скриптик а потом я вам расскажу где сдесь собака порылась....
Ну сначала в своем домашнем каталоге создайте директорию cgi-bin
:
cd public_html
mkdir cgi-bin
chmod 0777 cgi-bin
Последняя строчка будет очень важна.
Возьмите редактор и наберите: #!/usr/bin/perl
#first.cgi
print "Content-Type: text/html\n\n";
print "";
print "Hello you!!!
";
print "";
Сохраните его в директории cgi-bin
под именем first.cgi
.Ну как сохранили?
А теперь сделайте его исполняемым(ведь это программа):
chmod +x first.cgi
Ну вот,подходим к торжественному моменту.... наберите в строке браузера http://www.uic.nnov.ru/~твой_логин/cgi-bin/first.cgi
и посмотрите чо будет. Будет одно из двух,либо скрипт заработает и вы увидите сгенерированую им страничку (поздравляю,в нашем полку прибыло!) либо Internal Server Error
-тогда не расстраивайтесь,вы что-то сделали не так. Вам тогда пригодится пособие по ловле блох. Ну вопервых проверку синтаксиса можно осуществить следующим образом:
perl -с first.cgi
Perl вам сразу выдаст либо сообщения об ошибках(ну бывает,точку с запятой пропустили, скобочки или кавычки забыли закрыть...) это сразу по ходу дела поправимо.
Более грубая с логической точки зрения это пропустить вывод пустой строки, которая отделяет заголовок от тела:
print "Content-Type: text/html\n\n"; #Все Правильно
print "Content-Type: text/html\n"; #ОШИБКА!!!
Разберем скрипт:
Первая строка #!/usr/bin/perl
Просто указывает где в системе расположен Perl. Вторая это просто коментарий -вы можете тыкать чо угодно после знака #
Затем идет print "Content-Type: text/html\n\n";
Это заголовок указывающий тип содержимого все что скрипт печатает в свой стандартный вывод STDOUT идет на обработку к серверу. Пустая строка отделяет заголовок от тела,которое в нашем случае представляет собой
Hello you!!!
Сервер обработает ответ скрипта и на базе него сформирует и пошлет браузеру ответ.(Сервер обычно не изменяет тела сообщения,он только дополняет заголовок нужными для протокола HTTP полями)
Ну вот азы уже освоены,все не так трудно и удручающе как могло показаться на первый раз
Вы теперь можете сами потренироваться в написании таких вот простеньких скриптов чтоб набить руку.
E-commerce на понятном русском. Как устроен бизнес в интернете?
Последнее время попадается всё больше проектов, связанных с интернет торговлей. Изучая это направление, не смог найти общего и понятного описания процесса. Поэтому решил сделать что-то вроде шпаргалки, к которой всегда можно будет обращаться, чтобы понять порядок действий в такой области, как e-commerce.
Сразу оговорюсь, что сделал акцент на процессах и каналах, которые помогают приводить клиентов.
Определения на разных источниках говорят что-то о продаже товаров или услуг через интернет. Простыми словами e-commerce, это любая деятельность в сети, где появляются деньги.
Покупки, продажа, страховки, банкинг, электронные деньги, всё сюда. Заберите, распишитесь.
Для того, чтобы разобраться в вопросе, предлагаю начать путь с самого конца. Какая цель у любого бизнеса? Правильно, заработать. Так вот, представьте себе любой продукт, к примеру, силиконовые носки. Почему бы и нет!
Взял первое, что пришло в голову, оказалось есть такое…
Наша задача, это заработать на этих носках. Мы думаем про интернет. Хм…а почему бы не “запилить” сайт и вот как пойдут продажи, только держите меня Мальдивы! Но, не всё так просто.
Мне очень нравится рисовать. Это помогает понять различные процессы. Порисуем?!
Пока наша модель выглядит так. Берём носки, засовываем их в интернет и получаем деньги. Это просто великолепно! Глаза горят, ладошки потеют и уже хочется взяться за это дело. Но ведь нужно сделать сайт или площадку для продажи?
Есть различные решения для размещения своего товара во всемирной паутине. Можно создать свой сайт или использовать сторонние площадки (группы, страницы в соц.сетях, доски объявлений и др.). Остановимся на сайте.
Заказали себе сайт, взяли готовый шаблон или же сами создали с помощью конструктора (CMS можно погуглить), не важно. Дальше разместили кучу силиконовых носков разных видов и счастливы.
Простите, что прерываю чтение. Присоединяйтесь к моему telegram канал . Свежие анонсы статей, развитие digital продуктов и growth hack, там все. Жду вас! Продолжаем…
Но для того, чтобы человек смог у вас купить здесь и сейчас, необходимо будет подкрутить платёжные системы. Это своего рода сервис, который позволяет совершать покупки в сети через: банковские карты, интернет деньги, мобильные телефоны и ещё кучу всего. За это придётся делиться процентом от транзакций, но таким образом вы себе сильно упростите жизнь.
Выбирайте подходящий для себя сервис. Где-то будет повыше процент, а где-то абонентка или что ещё. Просто немного изучите вопрос. Поставите себе необходимый код на сайт, привяжете все транзакции к своему счёту на карте и вуаля!
Вот казалось бы всё. Сайт есть, карточки товаров тоже и даже кнопка “купить” работает, но чего-то не хватает… Нет потока клиентов, который будет покупать.
Где: CAC = Стоимость привлечения нового клиента. MCC (marketingcampaigncosts) = Суммарная стоимость маркетинговых затрат, направленных на привлечение клиентов (но не на удержание). W (wages) = Зарплата маркетологам и менеджерам по продажам. S (software) = Стоимость используемого в рекламе и продажах программного обеспечения (например, используемой платформы продаж, автоматизации маркетинга, A/B-тестирования, сервисов аналитики и т.д.). PS (professionalservices) = Стоимость профессиональных услуг, оказываемых отделам маркетинга и продаж (дизайн, консультации и т.д.). O (other) = Другие накладные расходы, относящиеся к отделам маркетинга и продаж. CA (customersacquired) = Суммарное количество привлеченных клиентов.
Но нельзя забывать о качестве клиента, здесь поможет LTV.
Live Time Value, жизненный цикл клиента, ещё один показатель в e-commerce, который нужно учитывать. Он показывает, сколько в среднем дохода приносит один клиент. Есть разные подходы к расчёту, я выбрал фактический по прибыли, как один из самых точных.
Это просто сумма общего дохода за всю историю покупок для каждого отдельного клиента. Прибавьте сумму всех покупок (транзакций) клиента к транзакции N, где транзакция N - это последняя покупка, которую совершил клиент в вашей компании. Если у вас есть доступ ко всем данным по транзакциям клиентов, то вы можете легко вычислить это с помощью Excel.
LTV = (транзакция 1 + транзакция 2 + транзакция 3… + транзакция N) х долю прибыли в выручке.
Расчет LTV на основании чистой прибыли, в конечном счете показывает фактическую прибыль, которую клиент приносит вашей компании. Здесь берется во внимание и стоимость обслуживания клиентов, и стоимость удержания, и стоимость привлечения и т.д. В результате получается целый комплекс вычислений, основанный на отдельно взятых данных. Совокупная прибыль, получаемая от одного клиента за все время, даст вам точное понимание рентабельности ваших клиентов на сегодняшний день.
С другими подходами можно ознакомиться на .
Для понимания жизнеспособности бизнеса, очень важно смотреть на отношение двух упомянутых показателей CAC:LTV.
Как мы разобрали выше, в e-commerce необходимо чётко понимать, выгодно ли использовать канал привлечения или нет. Помимо LTV и CAC существует ещё один важный показатель, это ROI. Он показывает, окупились ли ваши вложения, в нашем случае в рекламу. То есть. сколько 1 вложенный рубль принёс нам в итоге.
Для расчёта используется весьма несложная формула:
Где “Доход от кампании”, это разница между доходом от канала и себестоимостью на ваш продукт. А чтобы посчитать прибыль, отнимите ещё расходы на рекламу.
Таким образом более развернутая формула будет выглядеть так:
ROI = (Доход по каналу – Себестоимость) – Рекламные расходы / Рекламные расходы х 100%
Более подробный пример с расчётом читайте . По сути, эта несложная формула помещается все в ту же табличку Excel, где всё считается автоматически.
Все три показателя, которые мы разобрали, важны в E-commerce. Каждый их них позволяет найти “узкие” места в ваших потоках и работать с ними. Как раз в них кроется потенциал роста для бизнеса. Ещё немного дополнил нашу модель с носками.
Вместить всё в один материал не удаётся, да и кто его так долго читать-то будет? Позже сделаю отдельный гайд по нюансам e-commerce, которые могут мешать продажам.
В целом теперь у вас есть общее понимание интернет торговли или e-commerce. Дальше, как говорится: “Дьявол кроется в деталях”. Изучайте каждый из каналов отдельно, считайте показатели эффективности и ищите новые инсайты в мелочах. Интернет продаж вам, да побольше! А с меня ещё один материал.
Да, чуть не забыл, с Наступающим вас, дорогие читатели! Желаю в будущем году вам больших побед и свершений!
Глава
№9
.
Программирование с использованием CGI
Включение раздела о CGI в книгу по базам данных может показаться столь же
странным, как если бы в кулинарную книгу была включена глава о ремонте
автомобилей. Разумеется, для того чтобы съездить в магазин за продуктами,
нужен исправный автомобиль, но уместно ли об этом говорить? Полное изложение
CGI и веб-программирование в целом выходят за рамки данной книги, но
краткого введения в эти темы достаточно для того, чтобы расширить
возможности MySQL и mSQL по представлению данных в царстве Web.
В
основном эта глава предназначена тем, кто изучает базы данных, но не прочь
приобрести некоторые знания и в программировании для Web. Если ваша фамилия
Бернерс-Ли или Андрессен, вряд ли вы найдете здесь то, чего еще не знаете.
Но даже если вы не новичок в CGI, наличие под рукой краткого справочника во
время погружения в тайны MySQL и mSQL может оказаться весьма полезным.
Что
такое CGI?
Как и
большинство акронимов, Common Gateway Interface (CGI - общий шлюзовый
интерфейс) мало что говорит по сути. Интерфейс с чем? Где этот шлюз? О какой
общности речь? Чтобы ответить на эти вопросы, вернемся немного назад и
бросим взгляд на WWW в целом.
Тим
Бернерс-Ли, физик, работавший в CERN, придумал Web в 1990 году, хотя план
возник еще в 1988. Идея состояла в том, чтобы дать исследователям в области
физики элементарных частиц возможность легко и быстро обмениваться
мультимедийными данными - текстом, изображениями и звуком - через Интернет.
WWW состояла из трех основных частей: HTML, URL и HTTP. HTML -
язык
форматирования, используемый для представления содержания в Web. URL -
это адрес, используемый для получения содержимого в формате HTML (или
каком-либо ином) с веб-сервера. И, наконец, HTTP -
это язык, который
понятен веб-серверу и позволяет клиентам запрашивать у сервера документы.
Возможность пересылки через Интернет информации всех типов явилась
революцией, но вскоре была обнаружена и другая возможность. Если можно
переслать через Web любой текст, то почему нельзя переслать текст, созданный
программой, а не взятый из готового файла? При этом открывается море
возможностей. Простой пример: можно использовать программу, выводящую
текущее время, так, чтобы читатель видел правильное время при каждом
просмотре страницы. Несколько умных голов в National Center for
Supercomputing Applications (Национальный центр разработки приложений для
суперкомпьютеров -NCSA), которые создавали веб-сервер, такую возможность
увидели, и вскоре появился CGI.
CGI -
это набор правил, согласно которым программы на сервере могут через
веб-сервер посылать данные клиентам. Спецификация CGI сопровождалась
изменениями в HTML и HTTP, вводившими новую характеристику, известную как
формы.
Если CGI
позволяет программам посылать данные клиенту, то формы расширяют эту
возможность, позволяя клиенту посылать данные для этой CGI-программы. Теперь
пользователь может не только видеть текущее время, но и устанавливать часы!
Формы CGI открыли дверь для подлинной интерактивности в мире Web.
Распространенные приложения CGI включают в себя:
В
последующих главах мы обсудим все эти CGI-приложения, а также и некоторые
другие. Все они дают прекрасную возможность соединения CGI с базой данных,
что и интересует нас в этом разделе.
Формы HTML
Прежде
чем изучать особенности CGI, полезно рассмотреть наиболее часто
встречающийся способ, с помощью которого конечные пользователи получают
интерфейс к CGI-программам: формы HTML. Формы являются частью языка HTML,
предоставляющей конечному пользователю поля различных типов. Данные,
вводимые в поля, могут быть пересланы веб-серверу. Поля могут служить для
ввода текста или являться кнопками, которые пользователь может нажать или
отметить галочкой. Вот пример страницы HTML, содержащей форму:
<НТМL><НЕАD><ТITLЕ>Моя страница с формами
<р>Это
страница с формой.
Данная
форма создает строку длиной 40 символов, куда пользователь может ввести свое
имя. Под строкой для ввода располагается кнопка, при нажатии которой данные
формы передаются серверу. Ниже перечислены относящиеся к формам теги,
поддерживаемые HTML 3.2 -наиболее распространенным в настоящее время
стандартом. Названия тегов и атрибутов могут вводиться в любом регистре, но
мы придерживаемся необязательного соглашения, согласно которому открывающие
теги пишутся в верхнем регистре, а закрывающие - в нижнем.
Единственный тип ввода, который мы здесь не использовали, - это тип IMAGE
для тега . Можно было бы использовать его в качестве альтернативного
способа отправки формы. Однако тип IMAGE редко совместим с текстовыми и не
очень чуткими броузерами, поэтому благоразумно избегать его, если только ваш
сайт не выполнен в насыщенном графическом стиле.
После
знакомства с основами форм HTML можно приступить к изучению собственно CGI.
Спецификация CGI
Итак,
что в точности представляет собой «набор правил», позволяющий CGI-программе,
скажем, в Батавии, штат Иллинойс, обмениваться данными с веб-броузером во
Внешней Монголии? Официальную спецификацию CGI наряду с массой других
сведений о CGI можно найти на сервере NCSA по адресу http://hoohoo
. ncsa.uluc.edu/ cgi/.
Однако эта глава для
того и существует, чтобы вам не пришлось долго путешествовать и самому ее
искать.
Есть
четыре способа, которыми CGI передает данные между CGI-npor-раммой и
веб-сервером, а следовательно, и клиентом Web:
С
помощью этих четырех методов сервер пересылает все данные, переданные
клиентом, CGI-программе. Затем CGI-программа делает свое волшебное дело и
пересылает выходные данные обратно серверу, который переправляет их клиенту.
Эти
данные приводятся с прикидкой на сервер HTTP Apache. Apache - наиболее
распространенный веб-сервер, работающий практически на любой платформе,
включая Windows 9х и Windows NT. Однако они могут быть применимы ко всем
HTTP-серверам, поддерживающим CGI. Некоторые патентованные серверы,
например, от Microsoft и Netscape, могут иметь дополнительные функции или
работать несколько иначе. Поскольку лицо Web продолжает изменяться с
невероятной скоростью, стандарты все еще развиваются, и в будущем,
несомненно, произойдут изменения. Однако, что касается CGI, то эта
технология представляется устоявшейся - расплачиваться за это приходится
тем, что другие технологии, такие как апплеты, ее потеснили. Все
CGI-программы, которые вы напишете, используя эти сведения, почти наверное
смогут работать еще долгие годы на большинстве веб-серверов.
Когда
CGI-программа вызывается посредством формы - наиболее распространенного
интерфейса, броузер передает серверу длинную строку, в начале которой стоит
путь к CGI-программе и ее имя. Затем следуют различные другие данные,
которые называются информацией пути и передаются CGI-программе через
переменную окружения PATH_INFO (рис. 9-1). После информации пути следует
символ «?», а за ним - данные формы, которые посылаются серверу с помощью
метода HTTP GET. Эти данные становятся доступными CGI-программе через
переменную окружения QUERY_STRING . Любые данные, которые страница посылает
с использованием метода HTTP POST, который используется чаще всего, будут
переданы CGI-программе через стандартное устройство ввода. Типичная строка,
которую может получить сервер от броузера, показана на рис. 9-1. Программа с
именем formread
в каталоге cgi-bin
вызывается сервером с
дополнительной информацией пути extra/information
и данными запроса
choice=help - по-видимому, как часть исходного URL. Наконец, данные самой
формы (текст «CGI programming» в поле «keywords») пересылаются через метод
HTTP POST .
Переменные окружения
Когда
сервер выполняет CGI-программу, то прежде всего передает ей некоторые данные
для работы в виде переменных окружения. В спецификации официально определены
семнадцать переменных, но неофициально используется значительно больше - с
помощью описываемого ниже механизма, называемого HTTP_/nec/zams/n.
CGI-программа
имеет
доступ к этим переменным так же, как и к любым переменным среды командного
процессора при запуске из командной строки. В сценарии командного
процессора, например, к переменной окружения F00 можно обращаться как $F00;
в Perl это обращение выглядит, как $ENV{"F00"} ; в С - getenv("F00") ; и т.
д. В таблице 9-1 перечислены переменные, которые всегда устанавливаются
сервером - хотя бы и в значение null. Помимо этих переменных данные,
возвращаемые клиентом в заголовке запроса, присваиваются переменным вида
HTTP_F00 , где F00 - имя заголовка. Например, большинство веб-броузеров
включает данные о версии в заголовок с именем USEfl_AGENT . Ваша
CGI-npor-рамма может получить эти данные из переменной HTTP_USER_AGENT .
Таблица 9-1.
Переменные окружения CGI
Переменная окружения
|
Описание
|
||
CONTENT_LENGTH |
Длина
данных, переданных методами POST или PUT, в байтах. |
||
CONTENT_TYPE |
Тип MIME
данных, присоединенных с помощью методов POST или PUT . |
||
GATEWAY_INTERFACE |
Номер
версии спецификации CGI, поддерживаемой сервером. |
||
PATH_INFO |
Дополнительная информация пути, переданная клиентом.
Например, для запроса
http://www.myserver.eom/test.cgi/this/is/a/
path?field=green
значением переменной РАТН_ INFO будет
/this/is/a/path.
|
||
PATH_TRANSLATED |
То же,
что PATH_INFO , но сервер производит всю |
||
|
Возможную трансляцию, например, расширение имен типа
«-account». » |
||
QUERY_STRING |
Все
данные, следующие за символом «?» в URL. Это также данные,
передаваемые, когда REQ-UEST_METHOD формы есть GET. |
||
REMOTE_ADDR |
IP-адрес
клиента, делающего запрос. |
||
REMOTE_HOST |
Имя узла
машины клиента, если оно доступно. |
||
REMOTE_IDENT |
Если
веб-сервер и клиент поддерживают идентификацию типа
identd,
то это имя пользователя учетной записи, которая
делает запрос. |
||
REQUEST_METHOD |
Метод,
используемый клиентом для запроса. Для CGI-программ, которые
мы собираемся создавать, это обычно будет POST или GET. |
||
SERVER_NAME | Имя узла - или IP-адрес, если имя недоступно, -машины, на которой выполняется веб-сервер. | ||
SERVER_PORT | Номер порта, используемого веб-сервером. | ||
SERVER_PROTOCOL |
Протокол, используемый клиентом для связи с сервером. В нашем случае этот протокол почти всегда HTTP. | ||
SERVER_SOFTWARE | Данные о версии веб-сервера, выполняющего CGI-программу. | ||
SCRIPT_NAME |
Путь к
выполняемому сценарию, указанный клиентом. Может
использоваться при ссылке URL на самого себя, и для того,
чтобы сценарии, ссылки на которые существуют в разных
местах, могли выполняться по-разному в зависимости от места. |
||
Приведем
пример сценария CGI на Perl, который выводит все переменные окружения,
установленные сервером, а также все унаследованные переменные, такие как
PATH, установленные командным процессором, запустившим сервер.
#!/usr/bin/perl -w
print << HTML;
Content-type: text/html\n\n
HTML
foreach
(keys %ENV) { print "$_: $ENV{$_}
\n"; }
print
<
HTML
Все эти
переменные могут быть использованы и даже изменены вашей CGI-программой.
Однако эти изменения не затрагивают веб-сервер, запустивший программу.
Командная строка
CGI
допускает передачу CGI-программе аргументов в качестве параметров командной
строки, которая редко используется. Редко используется она потому, что
практические применения ее немногочисленны, и мы не будем останавливаться на
ней подробно. Суть в том, что если переменная окружения QUERY_STRING не
содержит символа « = », то CGI-программа будет выполняться с параметрами
командной строки, взятыми из QUERY_STRING . Например,
http://www.myserver.com/cgi-
bin/finger?root
запустит finger root на www.myserver.com.
Есть две
основные библиотеки, обеспечивающие CGI-интерфейс для Perl. Первая из них -
cgi-lib.pl
Утилита cgi-lib.pl
очень распространена, поскольку
в течение долгого времени была единственной имеющейся большой библиотекой.
Она предназначена для работы в Perl 4, но работает и с Perl 5. Вторая
библиотека, CGI.pm,
более новая и во многом превосходит
cgi-lib.pl. CGI.pm
написана для Perl 5 и использует полностью
объектно-ориентированную схему для работы с данными CGI. Модуль CGI.pm
анализирует стандартное устройство ввода и переменную QUERY_STRING и
сохраняет данные в объекте CGI. Ваша программа должна лишь создать новый
объект CGI и использовать простые методы, такие как paramQ, для извлечения
нужных вам данных. Пример 9-2 служит короткой демонстрацией того, как
CGI.pm
интерпретирует данные. Все примеры на Perl в этой главе будут
использовать CGI.pm.
Пример 9-2.
Синтаксический анализ CGI-данных на Perl
#!/usr/bin/perl -w
use CGI qw(:standard);
#
Используется модуль CGI.pm. qw(:standard) импортирует
#
пространство имен стандартных CGI-функций,чтобы получить
# более
понятный код. Это можно делать, если в сценарии
#
используется только один объект CGI.
$mycgi = new CGI; #Создать объект CGI, который будет "шлюзом" к данным формы
@fields =
$mycgi->param; # Извлечь имена всех заполненных полей формы
print
header, start_html("CGI.pm test"); ft Методы "header" и "start_html",
#
предоставляемые
# CGI.pm,
упрощают получение HTML.
# "header" выводит требуемый заголовок HTTP, a
#"start_html" выводит заголовок HTML с данным названием,
#a также тег
.print
"<р>Данные формы:
";
foreach
(@fields) { print $_, ":",- $mycgi->param($_), "
"; }
# Для каждого поля вывести имя и значение, получаемое с помощью
#
$mycgi->param("fieldname").
print
end_html; # Сокращение для вывода завершающих тегов "".
Обработка входных данных в С
Поскольку основные API для MySQL и mSQL написаны на С, мы не будем полностью
отказываться от С в пользу Perl, но там, где это уместно, приведем несколько
примеров на С. Есть три широко используемые С-библиотеки для
CGI-программирования: cgic
Тома Бу-телла (Tom Boutell)*; cgihtml
Юджина Кима (Eugene Kim)t и libcgi
от EIT*. Мы полагаем, что
cgic
является наиболее полной и простой в использовании. В ней, однако,
недостает возможности перечисления всех переменных формы, когда они не
известны вам заранее. На самом деле, ее можно добавить путем простого патча,
но это выходит за рамки данной главы. Поэтому в примере 9-3 мы используем
библиотеку cgihtml,
чтобы повторить на С приведенный выше сценарий
Perl.
Пример 9-3.
Синтаксический анализ CGI-данных на С
/*
cgihtmltest.c - Типовая
CGI-программа для вывода ключей и их значений
из данных,
полученных от формы */
#include
#include
"cgi-lib.h" /* Здесь содержатся все определения функций СGI */
#include
"html-lib.h" /* Здесь содержатся" все определения вспомогательных функций
для HTML */
void
print_all(llist 1)
/* Эти функции выводят данные, переданные формой, в том же формате, что и приведенный выше сценарий Perl. Cgihtml предоставляет также встроенную функцию
Print_entries(), которая делает то же самое, используя формат списка HTML.
*/ {
node*
window;
/* Тип
"node" определен в библиотеке cgihtml и ссылается на связанный список, в
котором хранятся все данные формы. */
window =
I.head; /* Устанавливает указатель на начало данных формы */
while
(window != NULL) { /* Пройти по связанному списку до последнего (первого
пустого) элемента */
printf("
%s:%s
\n",window->entry. name,replace_ltgt(window->entry.value));
/* Вывести
данные. Replace__ltgt() - функция, понимающая HTML-кодировку текста и
обеспечивающая его правильный вывод на броузер клиента. */
window =
window->next; /* Перейти к следующему элементу списка. */
} }
int main()
{
llist
entries; /* Указатель на проанализированные данные*/
int status;
/* Целое число, представляющее статус */
Html__header(); /* Вспомогательная функция HTML, выводящая заголовок HTML*/
Html_begin("cgihtml test");
/*
Вспомогательная функция HTML, выводящая начало страницы HTML с указанным
заголовком. */
status =
read_cgi_input(&entries); /* Производит ввод и синтаксический анализ данных
формы*/
Printf("<р>Данные формы:
");
Print_all(entries); /* Вызывает определенную выше функцию print_all(). */
html_end();
/* Вспомогательная функция HTML, выводящая конец страницы HTML. */
List_clear(&entries); /* Освобождает память, занятую данными формы. */
return 0; }
Стандартное устройство вывода
Данные,
посылаемые CGI-программой на стандартное устройство вывода, читаются
веб-сервером и отправляются клиенту. Если имя сценария начинается с nph-,
то данные посылаются прямо клиенту без вмешательства со стороны
веб-сервера. В этом случае CGI-программа должна сформировать правильный
заголовок HTTP, который будет понятен клиенту. В противном случае
предоставьте веб-серверу сформировать HTTP-заголовок за вас.
Даже
если вы не используете nph
-сценарий, серверу нужно дать одну
директиву, которая сообщит ему сведения о вашей выдаче. Обычно это
HTTP-заголовок Content-Type , но может быть и заголовок Location . За
заголовком должна следовать пустая строка, то есть перевод строки или
комбинация CR/LF.
Заголовок Content-Type сообщает серверу, какого типа данные выдает ваша
CGI-программа. Если это страница HTML, то строка должна быть Content-Type:
text/html.
Заголовок Location сообщает серверу другой URL - или
другой путь на том же сервере, - куда нужно направить клиента. Заголовок
должен иметь следующий вид: Location: http://
www. myserver. com/another/place/.
После
заголовков HTTP и пустой строки можно посылать собственно данные, выдаваемые
вашей программой, - страницу HTML, изображение, текст или что-либо еще.
Среди CGI-программ, поставляемых с сервером Apache, есть nph-test-cgi
и test-cgi,
которые хорошо демонстрируют разницу между заголовками в
стилях nph и не-nph, соответственно.
В этом
разделе мы будем использовать библиотеки CGI.pm
и cgic,
в
которых есть функции для вывода заголовков как HTTP, так и HTML. Это
позволит вам сосредоточиться на выводе собственно содержания. Эти
вспомогательные функции использованы в примерах, приведенных ранее в этой
главе.
Важные особенности сценариев CGI
Вы уже
знаете, в основном, как работает CGI. Клиент посылает данные, обычно с
помощью формы, веб-серверу. Сервер выполняет CGI-программу, передавая ей
данные. CGI-программа осуществляет свою обработку и возвращает свои выходные
данные серверу, который передает их клиенту. Теперь от понимания того, как
работают CGI-npor-раммы, нужно перейти к пониманию того, почему они так
широко используются.
Хотя вам
уже достаточно известно из этой главы, чтобы собрать простую работающую
CGI-программу, нужно разобрать еще несколько важных вопросов, прежде чем
создавать реально работающие программы для MySQL или mSQL. Во-первых, нужно
научиться работать с несколькими формами. Затем нужно освоить некоторые меры
безопасности, которые помешают злоумышленникам получить незаконный доступ к
файлам вашего сервера или уничтожить их.
Запоминание состояния
Запоминание состояния является жизненно важным средством предоставления
хорошего обслуживания вашим пользователям, а не только служит для борьбы с
закоренелыми преступниками, как может показаться. Проблема вызвана тем, что
HTTP является так называемым протоколом «без памяти». Это значит, что клиент
посылает данные серверу, сервер возвращает данные клиенту, и дальше каждый
идет своей дорогой. Сервер не сохраняет о клиенте данных, которые могут
понадобиться в последующих операциях. Аналогично, нет уверенности, что
клиент сохранит о совершенной операции какие-либо данные, которые можно
будет использовать позднее. Это накладывает непосредственное и существенное
ограничение на использование World Wide Web.
Составление сценариев CGI при таком протоколе аналогично неспособности
запоминать разговор. Всякий раз, разговаривая с кем-либо, независимо от
того, как часто вы общались с ним раньше, вам приходится представляться и
искать общую тему для разговора. Нет нужды объяснять, что это не
способствует продуктивности. Рисунок 9-2 показывает, что всякий раз, когда
запрос достигает программы CGI, это совершенно новый экземпляр программы, не
имеющий связи с предыдущим.
В части
клиента с появлением Netscape Navigator появилось выглядящее наспех
сделанным решение под названием cookies. Оно состоит в создании нового
HTTP-заголовка, который можно пересылать туда-сюда между клиентом и
сервером, похожего на заголовки Content-Type и Location. Броузер клиента,
получив заголовок cookie, должен сохранить в cookie данные, а также имя
домена, в котором действует этот cookie. После этого всякий раз при
посещении URL в пределах указанного домена заголовок cookie должен
возвращаться серверу для использования в CGI-программах на этом сервере.
Метод
cookie используется в основном для хранения идентификатора пользователя.
Сведения о посетителе можно сохранить в файле на машине сервера. Уникальный
ID этого пользователя можно послать в качестве cookie броузеру пользователя,
после чего при каждом посещении сайта пользователем броузер автоматически
посылает серверу этот ID. Сервер передает ID программе CGI, которая
открывает соответствующий файл и получает доступ ко всем данным о
пользователе. Все это происходит незаметным для пользователя образом.
Несмотря
на всю полезность этого метода, большинство больших сайтов не использует его
в качестве единственного средства запоминания состояния. Для этого есть ряд
причин. Во-первых, не все броузеры поддерживают cookie. До недавнего времени
основной броузер для людей с недостаточным зрением (не говоря уже о людях с
недостаточной скоростью подключения к сети) - Lynx - не поддерживал cookie.
«Официально» он до сих пор их не поддерживает, хотя это делают некоторые его
широко доступные «боковые ветви». Во-вторых, что более важно, cookie
привязывают пользователя к определенной машине. Одним из великих достоинств
Web является то, что она доступна из любой точки света. Независимо от того,
где была создана или где хранится ваша веб-страница, ее можно показать с
любой подключенной к Интернет машины. Однако если вы попытаетесь получить
доступ к поддерживающему cookie сайту с чужой машины, все ваши персональные
данные, поддерживавшиеся с помощью cookie, будут утрачены.
Многие
сайты по-прежнему используют cookie для персонализации страниц
пользователей, но большинство дополняет их традиционным интерфейсом в стиле
«имя регистрации/пароль». Если доступ к сайту осуществляется из броузера, не
поддерживающего cookie, то страница содержит форму, в которую пользователь
вводит имя регистрации и пароль, присвоенные ему при первом посещении сайта.
Обычно эта форма маленькая и скромная, чтобы не отпугивать большинство
пользователей, не заинтересованных ни в какой персонализации, а просто
желающих пройти дальше. После ввода пользователем в форму имени регистрации
и пароля CGI находит файл с данными об этом пользователе, как если бы имя
посылалось с cookie. Используя этот метод, пользователь может
регистрироваться на персонализированном веб-сайте из любой точки света.
Помимо
задач учета предпочтений пользователя и длительного хранения сведений о нем
можно привести более тонкий пример запоминания состояния, который дают
популярные поисковые машины. Осуществляя поиск с помощью таких служб, как
AltaVista или Yahoo, вы обычно получаете значительно больше результатов, чем
можно отобразить в удобном для чтения виде. Эта проблема решается тем, что
показывается небольшое количество результатов - обычно 10 или 20 - и дается
какое-либо средство перемещения для просмотра следующей группы результатов.
Хотя обычному путешественнику по Web такое поведение кажется обычным и
ожидаемым, действительная его реализация нетривиальна и требует запоминания
состояния.
Когда
пользователь впервые делает запрос поисковому механизму, тот собирает все
результаты, возможно, ограничиваясь некоторым предустановленным предельным
количеством. Фокус состоит в том, чтобы выдавать эти результаты одновременно
в небольшом количестве, запомнив при этом, что за пользователь запрашивал
эти результаты и какую порцию он ожидает следующей. Оставляя в стороне
сложности самого поискового механизма, мы встаем перед проблемой
последовательного предоставления пользователю некоторой информации по одной
странице. Рассмотрим пример 9-4, в котором показан сценарий CGI, выводящий
десять строк файла и предоставляющий ему возможность просмотреть следующие
или предыдущие десять строк.
Пример 9-4.
Сохранение состояния в сценарии CGI
#!/usr/bin/perl -w
use CGI;
Open(F,"/usr/dict/words") or die("He могу открыть! $!");
#Это файл,
который будет выводиться, может быть любым.
$output =
new CGI;
sub print_range { # Это главная функция программы, my $start = shift;
# Начальная строка файла, my $count = 0;
# Указатель, my $line = "";
# Текущая строка файла, print $output->header,
$output->start_html("Moй словарь");
#
Создает HTML с заголовком "Мой словарь", print "
while
(($count < $start) and ($line =
#
Пропустить все строки перед начальной, while (($count < $start+10) and
($line ?
#
Напечатать очередные 10 строк.
my $newnext
= $start+10; my $newprev = $start-10;
# Установить начальные строки для URL "Next" и "Previous",
print "
";
unless
($start == 0) { # Включить URL "Previous", если только вы
# уже не в
начале.
print qq%Previous%; }
unless
(eof) { # Включить URL "Next", если только вы #
не в конце файла.
print qq%
Next%;
}
print
«HTML; HTML
exit(0); }
# Если данных нет, начать сначала,
if (not
$output->param) {
&print_range(0); }
# Иначе начать со строки, указанной в данных.
&print_range($output->param("start"));
В этом
примере запоминание состояния производится с помощью простейшего метода.
Проблемы с сохранением данных нет, поскольку мы держим их в файле на
сервере. Нам нужно только знать, откуда начать вывод, поэтому сценарий
просто включает в URL начальную точку для следующей или предыдущей группы
строк - все, что необходимо для генерации очередной страницы.
Однако
если вам требуется нечто большее, чем возможность просто листать "файл, то
полагаться на URL бывает обременительно. Облегчить эту трудность можно через
использование формы HTML и включение данных о состоянии в теги типа
HIDDEN. Этот метод с успехом используется на многих сайтах, позволяя делать
ссылки между взаимосвязанными CGI-программами или расширяя возможности
использования одной CGI-программы, как в предыдущем примере. Вместо ссылки
на определенный объект, такой как начальная страница, данные URL могут
указывать на автоматически генерируемый ID пользователя.
Так
работают AltaVista и другие поисковые машины. При первом поиске генерируется
ID пользователя, который скрыто включается в последующие URL. С этим ID
связаны один или несколько файлов, содержащих результаты запроса. В URL
включаются еще две величины: текущее положение в файле результатов и
направление, в котором вы хотите перемещаться в нем дальше. Эти три значения
- все, что нужно для работы мощных систем навигации больших поисковых машин.
Впрочем, не хватает еще кое-чего. Использовавшийся в нашем примере файл
/usr/diet/words
очень велик. Что если на середине чтения мы его бросим,
но захотим вернуться к нему позднее? Если не запомнить URL следующей
страницы, никакого способа вернуться назад нет, даже AltaVista это не
позволит. Если вы перезагрузите свой компьютер или станете работать с
другого, невозможно вернуться к результатам прежнего поиска, не вводя заново
запрос. Однако такое долговременное запоминание состояния лежит в основе
персонализации вебсайтов, о которой мы говорили выше, и стоит посмотреть,
как им можно воспользоваться. Пример 9-5 является модифицированным вариантом
примера 9-4.
Пример 9-5.
Устойчивое запоминание состояния
#!/usr/bin/perl -w
use CGI;
umask 0;
Open(F,"/usr/dict/words") or die("He могу открыть! $!");
Chdir("users") or die("He могу перейти в каталог $!");
#
Это каталог, где будут храниться все данные
# о
пользователе.
Soutput =
new CGI;
if
(not$output->param) {
print $output->header,
$output->start_html("Мой словарь");
print
«HTML;
Вы можете создавать полоски ввода текста, кнопки "radio", окна флажков, и другие средства принятия ввода, используя тег. В данном разделе рассматриваются только поля текстового ввода. Для реализации этого поля, используйте тег со следующими атрибутами:
< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >
NAME - символическое имя переменной, которая содержит значение, введенное пользователем. Если Вы включаете текст в атрибут VALUE, этот текст будет помещен как заданный по умолчанию в поле текстового ввода. Атрибут SIZE позволяет Вам определить горизонтальную длину поля ввода, поскольку он будет появляться в окне браузера. И наконец, MAXLENGTH определяет максимальное число символов которые, пользователь может ввести в поле. Обратите внимание, что атрибуты VALUE, SIZE, MAXLENGTH являются необязательными.
Если Вы имеете только одно текстовое поле в пределах формы, пользователь может представить форму, просто набирая информацию на клавиатуре и нажимая Enter. В противном случае, должен быть какой-то другой способ представления информации пользователем. Пользователь представляет информацию, используя кнопку для представления со следующим тегом:
< Input type=submit >
Этот тег создает внутри вашей формы кнопку Submit. Когда пользователь закончивает заполнение формы, он или она может отправить ее содержание по адресу URL, указанному атрибутом ACTION формы, кликая кнопку Submit.
Выше были даны примеры записи программы CGI, которая посылает информацию с сервера на браузер. В действительности, программа CGI, которая лишь выводит данные, не имеет много приложений (некоторые примеры даны в Главе 4). Более важной способностью CGI является получение информации от браузера - особенность, которая придает Веб интерактивный характер.
Программа CGI получает два вида информации от браузера.
Полезно знать, какие переменные среды являются доступными для программы CGI, как в процессе обучения, так и для отладки. В таблице 2.2 приведены некоторые из доступных переменных среды CGI. Можно также записать программу CGI, которая выводит переменные среды и их значения на браузер Веб.
Таблица 2.2. Некоторые важные переменные среды CGI Переменная среды Цель REMOTE_ADDR Адрес IP машины клиента. REMOTE_HOST Хост хозяина машины клиента. HTTP _ACCEPT Перечисляет типы MIME данных, которые браузер умеет интерпретировать. HTTP _USER_AGENT Информация браузера (тип браузера, номер версии, операционная система, и т.д.). REQUEST_METHOD GET или POST. CONTENT_LENGTH Размер ввода, если он послан через POST. Если не имеется никакого ввода или если используется метод GET, этот параметр не определен. QUERY_STRING Содержит вводимую информацию, когда она передается с помощью метода GET. PATH_INFO Позволяет пользователю определить путь от командной строки CGI (например, http://hostname/cgi-bin/programname/path). PATH_TRANSLATED Транслирует относительный путь в PATH_INFO в фактический путь в системе.
Чтобы записать приложение CGI, которое отображает переменные среды, нужно знать, как выполнить две вещи:
Вы уже знаете, как выполнять последнюю операцию. В Perl переменные среды сохраняются в ассоциативном массиве %ENV, который вводится именем переменной среды. Листинг 2.3 содержит env.cgi, программу Perl, которая служит для достижения нашей цели.
Листинг 2.3. Программа Perl, env.cgi, которая выводит все переменные среды CGI.
#!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "
\n"; print "Подобная программа может быть написана в C; полный код находится в Листинге 2.4.
Листинг 2.4. Env.cgi.c в C.
/* env.cgi.c */
#include CGI Environment
\n");
while(*p != NULL)
printf("%s
\n",*p++);
printf(" \n");
}
Какая разница между методами GET и POST? GET передает закодированную входную строку через переменную среды QUERY_STRING, а POST передает ее через stdin. POST - более предпочтительный метод, особенно для форм с большим количеством данных, потому-что здесь нет каких-либо ограничений в отношении объема посылаемой информации, а при методе GET объем пространства среды ограничен. GET имеет однако определенное полезное свойство; это подробно рассматривается в Главе 5 "Ввод".
Чтобы определить, который метод используется, программа CGI проверяет переменную среду REQUEST_METHOD, которая будет установлена либо в GET, либо в POST. Если она установлена в POST, длина закодированной информации сохранена в переменной среды CONTENT_LENGTH.
Когда пользователь передает форму, браузер сначала кодирует информацию перед посылкой ее на сервер, а затем на приложение CGI. Когда Вы используете тег , каждому полю присваивают символическое имя. Значение, введенное пользователем, представляется как значение переменной.
Чтобы определить это, браузер использует кодирующую спецификацию URL, которая может быть описана следующим образом:
Ваша конечная закодированная строка будет похожа на следующую:
Name1=value1&name2=value2&name3=value3 ...
Примечание: Спецификации для кодирования URL находятся в RFC1738.
Например, предположим, что у вас была форма, которая запросила имя и возраст. Код HTML, который использовался для отображения этой формы, представлен в листинге 2.5.
Листинг 2.5. Код HTML для отображения формы имени и возраста.
Предположим, что пользователь вводит Joe Schmoe в поле имени, и 20 - в поле возраста. Ввод будет закодирован во входной строке.
Name=Joe+Schmoe&age=20
Для того чтобы эта информация была полезной, нужно использовать информацию на что-то такое, что может быть использовано вашими программами CGI. Стратегии синтаксического анализа ввода рассматриваются в Главе 5. Практически, Вам никогда не придется думать о том, как анализировать ввод, потому что несколько специалистов уже написали доступные для всех библиотеки, которые производят синтаксический анализ. Две такие библиотеки представлены в настоящей главе в следующих разделах: cgi -lib.pl для Perl (написаны Стивом Бреннером) и cgihtml для C (написаны мной).
Общая цель большинства библиотек, написанных на различных языках, состоит в том, чтобы анализировать закодированную строку и помещать пары имен и значений в структуру данных. Имеется очевидное преимущество в использовании языка, который имеет встроенные структуры данных типа Perl; однако, большинство библиотек для языков низшего уровня типа C и C++ включает выполнение структуры данных и подпрограммы.
Не обязательно добиваться полного понимания библиотек; гораздо важнее научиться использовать их как инструментальные средства, чтобы упростить работу программиста CGI.
Cgi -lib.pl использует ассоциативные массивы Perl. Функция &ReadParse анализирует входную строку и вводит каждую пару "имя / значение" по имени. Например, соответствующими строками Perl, необходимыми для декодирования только что представленной вводной строки "имя / возраст", были бы
&ReadParse(*input);
Теперь, чтобы увидеть значение, введенное для "имени", можно обращаться к ассоциативному массиву $input {"имя"}. Точно так же, чтобы обратиться к значению "возраста", нужно посмотреть на переменную $input {"возраст"}.
C не имеет никаких встроенных структур данных, так что cgihtml осуществляет свой собственный список связей для использования со своими анализирующими подпрограммами CGI. Это определяет структуру entrytype следующим образом:
Typedef struct { Char *name; Char *value; } Entrytype;
Чтобы проанализировать вводную строку "name / age" ("имя / возраст") в C, используя cgihtml, используется следующее:
/* объявить связанный список, называемый вводом */ Llist input; /* анализировть ввод и место в связанном списке */ read_cgi_input(&input);
Чтобы обратиться к информации о возрасте, можно либо проанализировать список вручную, либо использовать имеющуюся функцию cgi _val ().
#include
Значение "возраста" теперь сохранено в строке age.
Примечание: Вместо использования простого массива (подобно char age ;), я занимаюсь динамическим распределением пространства памяти для строки age. Хотя это усложняет программирование, тем не менее это важно с точки зрения безопасности. Более подробно о этом говорится в Главе 9.
Вы собираетесь записать программу CGI, называемую nameage.cgi, которая обрабатывает форму "имя / возраст". Обработка данных (что я обычно называю "промежуточным материалом") минимальна. Nameage.cgi просто декодирует ввод и отображает имя пользователя и возраст. Хотя не особенно много пользы от такого инструмента, он демонстрирует наиболее критический аспект программирования CGI: ввод и вывод.
Вы используете ту же самую форму, как описано выше, вызывая поля "имя и возраст". Пока не стоит беспокоиться об ошибкоустойчивости и эффективности; решите имеющуюся задачу простейшим образом. Решения в Perl и C показаны соответственно в листингах 2.6 и 2.7.
Листинг 2.6. Nameage.cgi в Perl
#!/usr/local/bin/perl # nameage.cgi require "cgi-lib.pl" &ReadParse(*input); print "Content-Type: text/html\r\n\r\n"; print "
\n"; print "\n"; print " \n";
\n",cgi_val(input,"age")); printf(" \n"); }
Обратите внимание на то, что эти две программы почти эквивалентны. Они обе содержат подпрограммы синтаксического анализа, которые занимают только одну строку и обрабатывают весь ввод (благодаря соответствующим библиотечным подпрограммам). Вывод, по существу, является измененной версией вашей основной программы Hello, World!.
Попытайтесь выполнить программу, заполняя форму и нажимая кнопку Submit.
Вы теперь знаете все основные принципы, необходимые для программирования CGI. Когда Вы понимаете, как CGI получает информацию и как он отсылает ее назад браузеру, фактическое качество вашего конечного продукта зависит от ваших общих способностей к программированию. А именно, когда Вы программируете CGI (или вообще что - нибудь, если уж на то пошло), помните о следующих качествах:
Первые два качества достаточно распространены: старайтесь сделать код как можно более читаемым и эффективным. Универсальность больше относится к программам CGI, чем к другим приложениям. Когда Вы начнете разрабатывать свои собственные программы CGI, Вы узнаете, что имеется несколько основных приложений, которые хочет сделать каждый. Например, одна из наиболее распространенных и очевидных задач программы CGI является обработка формы и посылка по электронной почте результатов определенному получателю. Вы могли бы иметь несколько отдельных обработанных форм, каждая с различным получателем. Вместо записи программы CGI для каждой отдельной формы, Вы можете съэкономить время, написав более общую программу CGI, которая годится для всех форм.
Затронув все основные аспекты CGI, я обеспечил Вас достаточными сведениями, чтобы начать программирование CGI. Однако чтобы стать эффективным разработчиком CGI, нужно иметь более глубокое понимание того, как CGI связывается с сервером и браузером. В оставшейся части настоящей книги подробно рассматриваются те вопросы, о которых вскользь было упомянуто в данной главе, а также вопросы стратегии разработки приложений, преимущества и ограничения протокола.
В настоящей главе вкратце были описаны основы программирования CGI. Вы создаете вывод, правильно форматируя ваши данные и печатая в stdout. Получение ввода CGI является несколько более сложным делом, потому что он должен быть проанализирован до своего использования. К счастью, уже существуют несколько библиотек, которые осуществляют синтаксический анализ.
К данному моменту Вы должны достаточно легко справиться с программированием приложений CGI. Оставшаяся часть настоящей книги посвящена более подробному изложению спецификации, подсказкам и стратегии программирования более продвинутых и сложных приложений.
Владельцам интернет-магазинов не понаслышке знакомо понятие «электронная коммерция», уж они-то точно знают ответ на вопрос «e-commerce - что это такое». Но если разобраться в сути, то всплывает много нюансов и данный термин получает более широкое значение.
Общее понятие звучит следующим образом: под электронной коммерцией понимается определённый подход к ведению бизнеса, предполагающий включение в себя ряда операций, использующих цифровую передачу данных при предоставлении товаров или оказании услуг/работ, в том числе при помощи интернета.
Таким образом, это любая коммерческая сделка, которая совершается с помощью электронного средства связи.
Схема работы устроена следующим образом:
Большое количество людей сейчас увлечены электронной коммерций, в первую очередь по причине желания создать собственный веб-сайт, уникальный интернет-магазин для продажи собственной продукции. Для удовлетворения этого растущего спроса разработчики сконцентрировались на создании e-commerce template (шаблонов электронной коммерции). Что это такое рассмотрим далее.
Одним из таких примеров шаблонов является WordPress e-commerce. Представляет собой плагин корзины покупок для WordPress (одна из самых известных систем управления веб-ресурсом), предназначается в первую очередь для создания и организации блогов). Предоставляется совершенно бесплатно и дает возможность посетителям сайта осуществлять покупки на интернет-странице.
Иными словами, данный плагин позволяет создать интернет-магазин (на базе WordPress). Плагин этой электронной коммерции обладает всеми необходимыми инструментами, настройками и опциями, соответствующими современным потребностям.