myphoto (1)Лес Котрел

Докторот
Нуклеарна физика
Универзитетот Стенфорд

Оригиналната статија: Guide to Writing CGI Scripts in REXX and Perl

Содржина

  • Вовед
  • Прв Влез на сценарио
  • Декодирање форми Влез
  • Испраќање на документ назад до клиентот
  • Известување Грешки
  • Две Едноставни мрежа REXX CGI скрипти
  • Други извори на информации

Вовед

Овој водич е наменет за луѓе кои сакаат да пишуваат свои мрежа извршна скрипта со користење на мрежа е Заеднички портал за интерфејс ( CGI ). Иако главниот акцент е на REXX многу примери исто така се предвидени во Perl.

Постојат некои едноставни софтверски библиотеки за олеснување на пишување CGI скрипти. cgi-lib.rxx е REXX библиотека на функции (достапни во SLAC со користење на REXX
ПОВИК PUTENV "REXXPATH = / AFS / SLAC / www / SLAC / www / алатка / cgi-rexx"
изјава да се вклучат во библиотеката во времето за исполнување) и cgi-lib.pl е слична библиотека во Perl напишани од страна на Стив Бренер (постои извршна копија од оваа libary на SLAC во / AFS / SLAC / g / www / cgi-lib / cgi-lib.pl). NCSA има многу корисни сет на Perl CGI управувачот subroutines кои се достапни преку анонимни FTP .Another сет на Perl CGI страната на серверот скрипти напишани од страна на Брижит Jellinek е достапна под GNU јавната лиценца. Исто така постои и изворниот код за www.stanford.edu скрипти и програми . Исто така, постои индекс за Perl мрежа програмисобрани од Ерл Худ. Конечно се види веб Центарот за развој .

Бидејќи постојат безбедносни и други ризици поврзани со извршување на корисникот скрипти на серверот мрежа, читателот може да посакаат да го видиш првиот документ обезбедување на информации на SLAC за безбедност на омотот за CGI скрипти корисниците. Покрај подобрување на безбедноста, оваа обвивка, исто така, ја олеснува задачата на пишување на CGI-скрипта за почетник.

Пред да се одлучите за пишување на сценариото, можете, исто така, можеби ќе сакате да се провери од некои груби белешки за SLAC Веб комунални услуги се предвидени од страна на CGI скрипти .

На CGI е интерфејс за надворешни работи на програми, или портали, според информации за серверот. Во моментов, поддржан информации сервери се на HTTP (Протокол за транспорт се користи од страна WWW) сервери.

Портал програми се извршни програми (на пример, UNIX, скрипти), која може да биде извршена од страна на самите себе (но вие не сакате да освен за дебагирање цели). Тие се направени извршна да им се овозможи да работат во различни (можеби многу различни) информации сервери наизменично. Портал програми во согласност со оваа спецификација може да бидат напишани на било кој јазик, вклучувајќи REXX или Perl, која произведува извршна датотека

Прв влезот на сценарио

На влез може да се испрати на сценариото на неколку начини во зависност од универзален Ресурсен Локатор на клиентот ( URL ) или HyperText Markup Language ( HTML ) Образец :

  • QUERY_STRING променлива на околината QUERY_STRING се дефинира како нешто кое го следи првиот? во URL-то се користи за да пристапите до вашиот портал. Оваа информација може да се додаде со документот HTML ISINDEX или некоја форма HTML (со GET акција). Исто така, може да биде рачно вграден во HTML хипертекст линк, или котва, која референци вашата порта. Оваа низа обично ќе биде барање дополнителни информации, на пример, она што корисникот сака да барате во базите на податоци, или можеби кодирани резултатите од вашите повратни информации форма. Тоа може да се пристапи во REXX со користење на String=GETENV('QUERY_STRING')
    или во Perl со користење $string=$ENV('QUERY_STRING');Оваа низа е кодиран во стандардот URL формат кој се менува простори до +, и кодирање специјални карактери% xx хексадецимален кодирање. Ќе треба да го декодираат, со цел да го користам. Можете да ги видиш cgi-lib.rxx ПОСТАПКА REXX DeWeb или Perl код фрагмент даваат примери за тоа како да се декодира специјални знаци.Ако вашиот сервер не декодирање резултати од формата, исто така ќе добие барањето декодира за вас врз командната линија. Ова значи дека барањето ќе биде достапен во REXX преку PARSE ARG команда, или во Perl $ARGV[n] низа.На пример, ако имате URL http://www.slac.stanford.edu/cgi-bin/foo?hello+world и да го користите REXX команда PARSE ARG Arg1 Arg2 тогаш Arg1 ќе содржи "hello" и Arg2 ќе содржи "world" (т.е. знакот + се заменува со празно место).
    Во Perl $ARGV[1] содржи "hello" и $ARGV[2] содржи "world" . Ако одберете да ги користите командната линија за да пристапите на влез, што треба да направите помалку обработка на податоците пред да го користите.
  • PATH_INFO променлива на околинатаГолем дел од времето, ќе сакате да испрати податоци на вашиот портали кои клиентот не треба нешто гадно со. Таквите информации може да биде името на формата која генерирани од резултатите што ги испраќаат.CGI овозможува дополнителни информации за да бидат вградени во URL-то на вашиот портал кој може да се користи за пренос на дополнителни контекст специфични информации за скрипти. Оваа информација обично се ставени на располагање како „екстра“ информации по патот на Вашиот портал во URL-то. Оваа информација не е кодиран од страна на серверот на кој било начин. Тоа може да се пристапи во REXX со користење на String=GETENV('PATH_INFO') , или во Perl со користење $string=$ENV('PATH_INFO');За да го илустрираме ова, ајде да речеме дека имам CGI-скрипта која е достапна на мојот сервер со име foo . Кога ќе пристапите foo од одреден документ, сакам да им кажам на foo дека јас сум моментално во англискиот јазик директориум, а не на прасе латински директориум. Во овој случај, би можел да пристапам до мојата скрипта во HTML документ како што се:<A HREF="http://www/cgi-bin/foo/language=english">foo</A>Кога серверот се извршува на foo, тој ќе ми даде PATH_INFO на /language=english , и мојата програма може да го декодира ова и да дејствуваат соодветно.На PATH_INFO и QUERY_STRING може да се комбинираат. На пример, URL:
    http://www/cgi-bin/htimage/usr/www/img/map?404,451
    ќе предизвика серверот за да се кандидира на сценариото наречен htimage . Тоа ќе помине преостанатиот патот информации “ /usr/www/img/map „за да htimage во PATH_INFO променлива на околината, и да го положат“ 405,451 „во QUERY_STRING променлива. Во овој случај, htimage е скрипта за спроведување на активни мапи испорачуваат со CERN HTTPD.
  • Standard Input Ако вашиот формулар метод = „пост“ во форма таг, вашите CGI-програмата ќе ја прими кодирана форма влез на стандарден влез ( stdin во Unix). Серверот не ќе ви испратиме преведување на крајот на податоци, наместо тоа треба да го користите на животната средина променливи CONTENT_LENGTH за да се утврди колку податоци треба да го прочитате од stdin. Можете да се постигне ова во REXX со користење In=CHARIN(,1,GETENV('CONTENT_LENGTH')) , или во Perl со користење read(STDIN,$in,$ENV{'CONTENT_LENGTH'});Ако сакате да ја помине стандарден влез кон друг опис што ќе се јавам подоцна, тогаш можеби ќе сакате да се разгледа cgi-lib.rxx REXX ПОСТАПКА ReadPost .

Можете да ги видиш REXX кодот фрагмент кој дава пример за како да ги прочитате разни форма на влез во Вашата скрипта.

На REXX процедури ReadForm заедно со MethGet и MethPost , сите достапни во cgi-lib.rxx, може да се користи за да се поедностави задачата на читање на влез од формата.

Декодирање форми Влез

Кога пишувате форма, секој од вашите влезни точки има име таг. Кога корисникот места податоци во овие ставки во форма, дека оваа информација се кодирани во форма на податоци. Вредноста на секој од влез предмети се дадени од страна на корисникот се нарекува вредност.

Form data е поток на име = вредност парови одделени со симболот (&) карактер. Секој име = вредност пар е URL кодирани, односно простори се променети во плус знаци, а некои знаци се кодирани во хексадецимален. За да се декодира Form data мора прво да се интерпретира на Формуларот за податоци блок во одделно име = вредност парови истурам надвор од ampersands. Потоа мора да се интерпретира секое име = вредност пар во одделно име и вредност. Користете го првиот знак за еднаквост ќе се сретнете за да се подели на податоците. Ако има повеќе од еден, тогаш нешто не е во ред со податоци. Повторно се фрли од еднаквите знаци. Конечно го вратите на URL-то кодирање на секое име и вредност.

Можете да ги видиш REXX или Perl код фрагмент давајќи примери за декодирање на Формуларот за влез.

При користење на името и вредноста информации во сценариото, што треба да бидат свесни дека:

  • ништо диктира редоследот по кој име = вредност ќе се concatenated во;
  • не секој името и вредноста што е дефинирано во форма мора да е испратена од страна на клиентот, на пример, ако ништо не е избрано во листа на скролување тогаш ниту името, ниту на вредност ќе се испраќаат;
  • повеќе од една вредност може да биде испратена за некое име, на пример ако листа на скролување овозможува избор на неколку опции.

Испраќање на документ назад до клиентот

CGI програми можат да се вратат голем број на типови документи. Тие може да испрати назад на сликата на клиентот, HTML документ, чист текст документ, Големина на документи или можеби дури и аудио клип на телесните функции. Тие, исто така може да се врати референци на други документи (да се зачува простор ние ќе ги игнорира овој вториот случај тука, повеќе информации може да се најде во NCSA е CGI Primer ). На клиентот мора да се знае каков вид на документ го праќаш така што може да го презентира тоа. Со цел за клиентот да го знаеме и ова, вашиот CGI-програмата мора да му кажете на серверот кој тип на документ се враќа.

Со цел да им кажам на серверот каков вид на документот што го испрати назад, CGI бара од тебе да се одржи краток удар на вашиот резултат. Ова заглавие е ASCII текст, кој се состои од линии одделени со било linefeeds или превоз се враќа по linefeeds. Вашата скрипта мора излез најмалку две такви линии пред неговите податоци ќе биде испратен директно назад до клиентот. Овие линии се користи за означување на MIME-тип на следните документи

Некои општи MIME типови релевантни за мрежа се:

  • А "text" Content-Type, кој се користи за да ги претставуваат текстуални информации во голем број на кодни системи и форматирана текст опис јазици во стандардизиран начин. Двете најверојатно подтипови се:
    • text/plain : текст без форматирање барања.
    • text/html : текст со вграден HTML команди
  • Еден "application" Content-Type, кој се користи за пренос на податоци на апликациите или бинарни податоци. Две често се користат подтипови се:
    • application/postscript : Податоците се во PostScript, и треба да се вратат во PostScript-interptreter.
    • application/binary : на податоците е во некоја непозната бинарен формат, како што се резултатите на пренос на датотека.
  • Се "image" Content-Type за пренос на мирна слика (слика) податоци. Постојат многу можни подтипови, но оние кои најчесто се користат за мрежа се:
    • image/gif : слика во GIF формат.
    • image/xbm : една слика во X Bitmap формат.
    • image/jpeg : слика во JPEG формат.

Со цел да им кажам на серверот типот на содржина на вашиот излез, првата линија на излезот треба да се прочита:
Content-type: type/subtype
каде type/subtype е MIME-тип и подтипот за вашиот излез.

Следно, ќе треба да се испрати на втора линија. Со сегашната спецификација, втората линија треба да биде празна. Ова значи дека треба да има ништо на неа, освен еден linefeed. Откако серверот вади оваа линија, таа знае дека ќе завршиш кажува на серверот за вашиот излез и сега ќе почнат вистински излез. Ако го прескокнете овој линија, серверот ќе се обиде да го анализира вашиот излез се обидува да најде повеќе информации во врска со вашето барање и ќе стане многу несреќни.

Можете да ги видиш REXX кодот фрагмент кој дава пример за справување со Content-type информации.

По овие две линии се емитираат, секој излез stdout (на пр REXX команда мислење) ќе бидат вклучени во документот испратен до клиентот. Овој резултат мора да биде во согласност со Content-type заглавието. На пример, ако насловот наведени Content-type text/html тогаш следните излез мора да содржи HTML форматирање како што се користење или IDIVIDI: <P> за започнување на нови линии или <pre> за отстранување на автоматско форматирање HTML е.

Дијагностика и известување грешки

Од stdout е вклучена во документот испратен до, дијагностика дијагностика емитираат со командата мислење ќе се појави во документот. Можете да ги видиш REXX кодот фрагмент кој дава пример за дијагностички извештаи.

Ако грешки се сретнал (на пример, нема влез предвидени, невалидни карактери се најде, премногу аргументи наведени, побара неважечка команда за да биде извршена, неправилен синтакса или недефинирана променлива среќаваат во REXX скрипта) сценариото треба да обезбеди детални информации за она што не е во ред итн Тоа може да биде многу корисно да се обезбедат информации за поставките на различни мрежа животна средина променливи кои се поставени.

На CGIerror , CGIdie и MyURL REXX процедури во cgi-lib.rxx се обезбедат некои помош за грешка за известување. Покрај видиш REXX кодот фрагменти користење CGIerror и користење CGIdie и исто така типични CGIerror производство и CGIdie излез .

Две едноставни REXX мрежа CGI скрипти

Да ја добиете вашата веб сервер за да се изврши скрипта CGI вие треба:

  • За да пишувам. За да се поедностави ова, можеби ќе сакате да ги искористат предностите на CGI-lib.rxx библиотека на функции, вклучувајќи и некои воведе претходно на оваа страница. А неколку едноставни, но заврши примери можат да помогнат:
    1. извор на скриптата да им се овозможи на UNIX прст функција.
    2. извор на минимални HTTP форма и сценарио .
  • Направете извршна скрипта од страна на вашиот веб сервер. Во SLAC на Unix ова е направено со помош на chmod команда, на пример,
    • chmod o+x /u/sf/cottrell/bin/cgi1.rxx
      chmod u+x /u/sf/cottrell/bin/cgi1.rxx
  • Земете ја вашата веб-мајстор да додадете правило на правилата на датотеки на веб серверот е да им овозможи на веб серверот да се изврши Вашата скрипта. Повеќе информации за правилата на датотеки на серверот на W3C може да се најде од страна гледајќи воконфигурациската датотека на W3C httpd , како и еден едноставен пример на некои од мапирање изјави употребливи во правилата на датотека.

Веб-мајстор ќе сакате да се осигура дека безбедносните аспекти на вашата скрипта се обрати пред да додадете на вашата скрипта на Правилникот датотека.

Други извори на интереси

  • Печатена форма:
    • Книгата HTML и CGI Unleashed има многу корисни информации за пишување CGI скрипти во C, Perl и REXX.
    • Книгата Вовед во CGI / Perl од страна на Стив Бренер и Едвин Аоки е корисен вовед во пишување CGI скрипти во Perl.
  • Пишување светска Wide Web CGI скрипти во REXX презентиран на пролет 1996 АКЦИЈА техничка конференција, на 7 март, 1996, Anaheim Калифорнија.
  • На NetRexx јазик Страна дава информации за експериментален проект од страна на Мајк Cowlishaw (на авторот на REXX) да се создаде Rexx пред крајот на Јава.
  • Исто така се вклучите во група за вести comp.infosystems.www.authoring.cgi кој го покрива дискусија за развој на Заеднички портал за интерфејс (CGI) скрипти, како тие се однесуваат на веб-страница пишувањето. Можни теми вклучуваат дискусија како да се справи со резултатите од форми, како да се генерира сликите на мува, и како да се стави заедно други интерактивни веб придонеси.
  • На World Wide Web (Често Поставувани Прашања со одговори) одговори на многу, многу прашања за World Wide Web, во целина.
  • Ако сте Користејќи perl и имаш општи Perl прашање што не е навистина на CGI-конкретно прашање, проверете на Perl ЧПП .
  • Ако, ќе биде пишување скрипти за Windows NT потоа да видиме Somarsoft – Windows NT безбедносни прашања