Back to site

CGI-сцэнарыяў

Увядзенне

Вэб-старонак фактычна вы можаце ўбачыць кліенцкай баку злучэння кліент-сервер праз інтэрнэт. Калі Ваш браўзэр (кліент) хоча бачыць вэб-старонкі, напрыклад, ён пасылае запыт у прымаючага вы паказваеце ў URL (Uniform Resource Locator), выкарыстоўваючы ўказаны пратакол (HTTP ў гэтым выпадку, Hyper Text Transfer Protocol). Прыклад URL: http://www.ruppweb.org/default.htm (пратакол:// site.domain/дакумент). Назва сайта не што іншае, імя, прысвоенае IP-адрас з машыны (напрыклад 128.115.150.112) працуе (у Інтэрнэце) сервера. (ЗАЎВАГА: у гэтым кантэксце сервера праграма працуе вэб-сэрвіс на машыне, а не сам кампутар - кампутар хост).

Калі сервер атрымлівае такі запыт, ён адказвае і пасылае назад старонцы, або любы іншы запыт для. Мова, на якім сервер і кліент мець зносіны, HTML (Hyper Text Markup Language). Акрамя статычных запытаў на вэб-старонках, можна жадаеце сервера для выканання пэўных задач (такіх як пошук базы дадзеных або дэкадаваць прастору групы). Там павінен быць механізм для сервера для атрымання інфармацыі аб тым, што рабіць і ў рукі яго да прыкладанняў, які апрацоўвае запыт. Гэты інтэрфейс CGI (Common Gateway Interface). Сервер па сутнасці устанаўлівае пэўныя сістэмныя зменныя асяроддзя, якая называецца Праграма можа счытваць і апрацоўваць. Выхад перадаецца назад на сервер перасылкі праз Інтэрнэт запытваючага браўзэру, які адлюстроўвае вынік. Вы можаце праверыць Microsoft Internet развіцця кампакт-дыск або іншыя спасылкі для атрымання дадатковай інфармацыі па гэтым пытанні.

Прыклад

У гэтай вэб-старонцы я выкарыстаў наступны сцэнар, каб стварыць поле ўводу і вызначыць дзеянні, якія неабходна прыняць:

<form action="/cgi-bin/sexie32.exe" method="GET">
  <p>Enter a spacegroup or spacegroup number 
  <input type="text" size="11" name="spcgrp"> 
  and hit enter</p>

</form>

Гэта мінімальны код стварае вышэй полі ўводу, прысвойвае ўклад у зменнай з імем "spcgrp і выконвае праграму sexie32 які робіць сваю справу. Як я магу атрымаць пераменным прасторы групы ў праграме? Паказаўшы GET як метад, сервер дадае імя зменнай і яе змесціва пасля пытальніка у назве праграмы і захоўвае гэтую радок у зменную QUERY_STRING ў навакольнае асяроддзе. Усё робіць праграма для чытання гэтага радка зменную асяроддзя, расшыфраваць яго, і пасля разліку, запісаць вынік у выглядзе файла HTML ў стандартны вывад (кансолі), якая сервер перанакіроўвае запыт. Большасць моў сцэнарыяў забяспечыць бібліятэкі і не трэба мець справу з дэталямі чытанне сістэмнага асяроддзя.

FORTRAN

Як навукоўцы, мы, магчыма, карысная праграма ў FORTAN, што робіць добрую працу, і было б пажадана, каб зрабіць яго даступным у Інтэрнэце. Відавочным перавагай з'яўляецца тое, што вам не прыходзіцца мець справу з платформы і пытанні рэалізацыі - не неправераных версія распаўсюду, не зьвязвайцеся зыходны код і г.д. - дадатак працуе на вашым кампутары, і браўзэры клапаціцца аб платформе канкрэтнай рэалізацыі. Раптам стары код F66 мае графічны інтэрфейс Windows!

Падпраграма WEBSPC чытае зменныя асяроддзя і вяртае spacegroup радок у асноўнай праграме:

      subroutine webspc (spcgrp,title,igr,ierr)                         WEBS0001
c ----------------------------------------------------------------------WEBS0002
c     returns space group passed from web server through GET method     WEBS0003
c ----------------------------------------------------------------------WEBS0004
      USE MSFLIB                                                        WEBS0005
      integer*4 lstr                                                    WEBS0006
      integer igr(36)                                                   WEBS0007
      character today*24,spcgrp*10,title*60,usradd*15,fname*60,qstr*80  WEBS0008
      character usrnam*80,browsr*80                                     WEBS0009
                                                                        WEBS0010
c --- Set spacegroup blank                                              WEBS0011
      spcgrp='          '                                               WEBS0012
      ierr=0                                                            WEBS0013

Вось як чытаць зменныя асяроддзі, былі ўсталяваныя сервер у адпаведнасці з інструкцыямі ў дзеянне фрагмент HTML-код, які ўказаны вышэй. Вы знойдзеце спіс іншых зменных, якія ўстаноўлены ў большасці кніг па вэб-праграмаванні (некаторыя з іх чытаюць webspc а). Ключ QUERY_STRING, якая ўтрымлівае зменную частка URL пабудаваны дзеянняў, пералічаных вышэй:

http://ruppweb.dyndns.org/cgi-bin/sexie32.exe?spcgrp=I+4% 2 ФМ + М + М

QUERY_STRING змяшчае: spcgrp = я +4% 2 ФМ + М + М (Заўвага: калі вы ўводзіце URL вышэй або пстрыкніце па ёй, сцэнар CGI на самай справе будзе выканана). Адзначым таксама, што інтэрфейс CGI заменнікаў нарыхтовак + знакі і спецыяльныя сімвалы з іх шаснаццатковы код папярэднічаць знак% (напрыклад, слэш% 2F). Фактычныя ўваходны радкі ў акне быў "Я 4/mmm ў гэтым выпадку.

                                                                        WEBS0014
c --- get the client name and the query_string from environment         WEBS0015
      ladd = GETENVQQ('REMOTE_ADDR', usradd)                            WEBS0016
      lnam = GETENVQQ('REMOTE_USR', usrnam)                             WEBS0017
      lbrs = GETENVQQ('HTTP_USER_AGENT', browsr)                        WEBS0018
      lstr = GETENVQQ('QUERY_STRING', qstr)                             WEBS0019
                                                                        WEBS0020
c --- read space group - if an integer decode by number                 WEBS0021
      read(qstr,'(7x,i3)',err=0001) ispa                                WEBS0022
c --- if we get here, it was read successfully as a number              WEBS0023

Звярніце ўвагу, што я выкарыстоўваю памылка пры чытанні этыкеткі знак, як цэлае, вызначальным сімвал прасторавай групы або нумар групы прасторы было ўведзена.

      call spsymc (spcgrp,ispa)                                         WEBS0024
c --- ispa returns the symbol now proceed with checks                   WEBS0025
      goto 2002                                                         WEBS0026
                                                                        WEBS0027
c --- parse the input string if not a number                            WEBS0028
0001  continue                                                          WEBS0029
      ilen=lstr-7                                                       WEBS0030
      j=0                                                               WEBS0031
c --- begin loop over query_string                                      WEBS0032

Звярніце ўвагу, што інтэрфейс CGI заменнікаў нарыхтовак + знакі і спецыяльныя сімвалы з шаснаццатковы код папярэднічаць знак% (напрыклад,/з'яўляецца% 2F), так што мы павінны разабраць гэтую радок:

      i=8                                                               WEBS0033
1000  continue                                                          WEBS0034
c ---    replace + with blank                                           WEBS0035
         if (qstr(i:i).eq.'+') then                                     WEBS0036
            j=j+1                                                       WEBS0037
            spcgrp(j:j)=' '                                             WEBS0038
            i=i+1                                                       WEBS0039
c ---    replace special character hex code with character              WEBS0040
         else if (qstr(i:i).eq.'%') then                                WEBS0041
c ---       %2F is slash                                                WEBS0042
            if (qstr(i+1:i+2).eq.'2F') then                             WEBS0043
               j=j+1                                                    WEBS0044
               spcgrp(j:j)='/'                                          WEBS0045
               i=i+3                                                    WEBS0046
            end if                                                      WEBS0047
         else                                                           WEBS0048
            j=j+1                                                       WEBS0049
            spcgrp(j:j)=qstr(i:i)                                       WEBS0050
            i=i+1                                                       WEBS0051
         end if                                                         WEBS0052
c --- repeat until finished with string                                 WEBS0053
      if (i.lt.(ilen+8)) goto 1000                                      WEBS0054
                                                                        WEBS0055
c --- now check if a valid space group symbol                           WEBS0056
 2002 call upstrg(spcgrp,10)                                            WEBS0057
      read(spcgrp,'(10a1)') (igr(i), i=1,10)                            WEBS0058
      ispa=0                                                            WEBS0059
      call spsymc (spcgrp,ispa)                                         WEBS0060
                                                                        WEBS0061
c --- get a date string, format is :Wed Nov 20 15:33:29 1996            WEBS0062
      call fdate (today)                                                WEBS0063
      title='Webjob on '//today(1:10)//today(20:24)//' at'//            WEBS0064
     & today(11:19) //' from '//usradd                                  WEBS0065

Праграма таксама вядзе часопіс карыстальнікаў.

c --- log the job                                                       WEBS0066
      fname='C:\inetsrv\wwwroot\webjobs.html'                           WEBS0067
      open (66,file=fname,access='append',position='append')            WEBS0068
c --- overwrite old </body> tag                                         WEBS0069
      backspace (66)                                                    WEBS0070
      write(66,'(a,a,a)')' <p>Date   : '//today//'<br>'                 WEBS0071
      write(66,'(a,a,a)')' Client : '//usradd(1:ladd)//'<br>'           WEBS0072
      write(66,'(a,a,a)')' Browser : '//browsr(1:lbrs)//'<br>'          WEBS0073
      write(66,'(a,a,a)')' Spacegr: '//spcgrp//'<br>'                   WEBS0074
      if (ispa.lt.0) then                                               WEBS0075
         write(66,'(a)')' Status : failed!</p>'                         WEBS0076
      else                                                              WEBS0077
         write(66,'(a)')' Status : ok</p>'                              WEBS0078
      end if                                                            WEBS0079
      write(66,'(a)')    ' <hr>'                                        WEBS0080
      write(66,'(a)')    ' </BODY>'                                     WEBS0081
      close(66)                                                         WEBS0082
c --- if something went wrong, return message and termination signal    WEBS0083
      if (ispa.lt.0) then                                               WEBS0084
         call webtxt (1,spcgrp)                                         WEBS0085
         ierr=1                                                         WEBS0086
         close(5)                                                       WEBS0087
         return                                                         WEBS0088
      else                                                              WEBS0089
         close(5)                                                       WEBS0090
         return                                                         WEBS0091
      end if                                                            WEBS0092
      return                                                            WEBS0093
      end                                                               WEBS0094

Пераменная spcgrp атрымлівае вярнуўся ў асноўнай праграме, які дэкадуе прасторы групы. Выхадныя дадзеныя запісваюцца ў файл, і ўсё што трэба, гэта малюсенькія руціны, каб напісаць гэты выснова ў выглядзе файла HTML ў стандартны вывад (кансоль).

      subroutine htmake                                                 HTMA0001
                                                                        HTMA0002
      character*80 line                                                 HTMA0003
                                                                        HTMA0004
      open(6,file='sexie.out')                                          HTMA0005
      write(*,*)'Content-type: text/html'                               HTMA0006
      write(*,*)                                                        HTMA0007
      write(*,*)'<BODY bgcolor="#FFFDE6" TEXT="#0000FF">'               HTMA0008
      write(*,*)'<TITLE>Space group decoding</TITLE>'                   HTMA0009
      write(*,*)'<pre>'                                                 HTMA0010
      do i=1,100000                                                     HTMA0011
         read(6,'(1x,a)',end=9999) line                                 HTMA0012
         write(*,'(1x,a)') line                                         HTMA0013
      end do                                                            HTMA0014
9999  close(6)                                                          HTMA0015
      open(6,file='xyz.txt')                                            HTMA0016
      write(*,'(//a//)')                                                HTMA0017
     &  ' Alternate listing of symmetry operators follows'              HTMA0018
      do i=1,100000                                                     HTMA0019
         read(6,'(1x,a)',end=9990) line                                 HTMA0020
         write(*,'(1x,a)') line                                         HTMA0021
      end do                                                            HTMA0022
9990  close(6)                                                          HTMA0023
      write(*,*) '</pre>'						HTMA0024
      write(*,*) '</BODY>'                                              HTMA0025
      return                                                            HTMA0026
      end                                                               HTMA0027

Такім чынам, вось і ўсё, што да асноўных сцэнарыяў CGI. Проста ісці наперад, напісаць невялікі фрагмент кода сабе і пагуляць трохі. Я выкарыстаў Microsoft Frontpage [2], каб стварыць свой сайт і формы, і Microsoft FORTRAN прафесійнае выданне для F90 праграмавання. Ваш Fortran Compiler можа выкарыстаць іншы спосаб атрымаць зменныя асяроддзя, але вы павінны быць у стане знайсці гэта ў вашай дакументацыі. Вядома, гэта не заахвочванне, каб напісаць CGI-скрыпты ў Fortran. Выкананыя файлы з'яўляюцца вялікімі і поўны з галавой, і для вырашэння многіх задач, C, Пэрл, J + + і г.д. хутчэй. Але калі ў вас ёсць цвёрдае свету кода, эй, чаму б не зрабіць яго можна было выкарыстоўваць па сеткі!


Спіс літаратуры

[1] CGI Developer's Guide, EEKim, SamsNet Выдавецкі (1996)
[2] http://www.microsoft.com/frontpage/documents/technical11/default.htm
[3] Асваенне Развіцця Інтэрнэт, Micosoft CD-ROM

Popular Links
Published (Last edited): Mar 29 , source: http://www.ruppweb.org/xray/comp/cgi_prog.htm