C++ webprogrammering
Wat is CGI?
-
De Common Gateway Interface, of CGI, is een reeks standaarden die bepalen hoe informatie wordt uitgewisseld tussen de webserver en een aangepast script.
-
De CGI-specificaties worden momenteel onderhouden door de NCSA en NCSA definieert CGI als volgt −
-
De Common Gateway Interface, of CGI, is een standaard voor externe gateway-programma's om te communiceren met informatieservers zoals HTTP-servers.
-
De huidige versie is CGI/1.1 en CGI/1.2 is in ontwikkeling.
Browsen op het web
Laten we, om het concept van CGI te begrijpen, eens kijken wat er gebeurt als we op een hyperlink klikken om door een bepaalde webpagina of URL te bladeren.
-
Uw browser neemt contact op met de HTTP-webserver en vraagt om de URL, dwz. bestandsnaam.
-
Web Server zal de URL ontleden en naar de bestandsnaam zoeken. Als het het gevraagde bestand vindt, stuurt de webserver dat bestand terug naar de browser, anders stuurt het een foutmelding om aan te geven dat je een verkeerd bestand hebt aangevraagd.
-
Webbrowser neemt reactie van de webserver en geeft het ontvangen bestand of foutbericht weer op basis van de ontvangen reactie.
Het is echter mogelijk om de HTTP-server zo in te stellen dat wanneer een bestand in een bepaalde directory wordt opgevraagd, dat bestand niet wordt teruggestuurd; in plaats daarvan wordt het uitgevoerd als een programma en wordt de geproduceerde uitvoer van het programma teruggestuurd naar uw browser om weer te geven.
De Common Gateway Interface (CGI) is een standaardprotocol waarmee toepassingen (CGI-programma's of CGI-scripts) kunnen communiceren met webservers en met clients. Deze CGI-programma's kunnen zijn geschreven in Python, PERL, Shell, C of C++ enz.
CGI-architectuurdiagram
Het volgende eenvoudige programma toont een eenvoudige architectuur van CGI −
Webserverconfiguratie
Voordat u doorgaat met CGI-programmering, moet u ervoor zorgen dat uw webserver CGI ondersteunt en is geconfigureerd om CGI-programma's te verwerken. Alle CGI-programma's die door de HTTP-server moeten worden uitgevoerd, worden bewaard in een vooraf geconfigureerde map. Deze map wordt CGI-map genoemd en volgens afspraak wordt deze /var/www/cgi-bin genoemd. Volgens afspraak hebben CGI-bestanden de extensie .cgi , hoewel ze uitvoerbaar zijn in C++.
Standaard is Apache Web Server geconfigureerd om CGI-programma's uit te voeren in /var/www/cgi-bin. Als u een andere map wilt specificeren om uw CGI-scripts uit te voeren, kunt u de volgende sectie in het httpd.conf-bestand wijzigen −
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Hier ga ik ervan uit dat u de webserver succesvol hebt geïnstalleerd en dat u elk ander CGI-programma zoals Perl of Shell enz. kunt uitvoeren.
Eerste CGI-programma
Overweeg de volgende inhoud van het C++-programma −
#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hello World - First CGI Program</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! This is my first CGI program</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
Compileer bovenstaande code en noem het uitvoerbare bestand cplusplus.cgi. Dit bestand wordt bewaard in de map /var/www/cgi-bin en heeft de volgende inhoud. Voordat u uw CGI-programma uitvoert, moet u ervoor zorgen dat u de bestandsmodus wijzigt met chmod 755 cplusplus.cgi UNIX-opdracht om het bestand uitvoerbaar te maken.
Mijn eerste CGI-programma
Het bovenstaande C ++ -programma is een eenvoudig programma dat de uitvoer naar het STDOUT-bestand, d.w.z. het scherm, schrijft. Er is een belangrijke en extra functie beschikbaar, namelijk afdrukken op de eerste regel Content-type:text/html\r\n\r\n . Deze regel wordt teruggestuurd naar de browser en specificeert het inhoudstype dat op het browserscherm moet worden weergegeven. Nu moet je het basisconcept van CGI hebben begrepen en kun je veel gecompliceerde CGI-programma's schrijven met Python. Een C++ CGI-programma kan communiceren met elk ander extern systeem, zoals RDBMS, om informatie uit te wisselen.
HTTP-koptekst
De regel Content-type:text/html\r\n\r\n is een onderdeel van de HTTP-header, die naar de browser wordt gestuurd om de inhoud te begrijpen. Alle HTTP-headers hebben de volgende vorm −
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
Er zijn weinig andere belangrijke HTTP-headers die u vaak zult gebruiken in uw CGI-programmering.
Zr.Nee | Koptekst en beschrijving |
---|---|
1 | Inhoudstype: Een MIME-tekenreeks die de indeling definieert van het bestand dat wordt geretourneerd. Voorbeeld is Content-type:text/html. |
2 | Verloopt:datum De datum waarop de informatie ongeldig wordt. Dit moet door de browser worden gebruikt om te beslissen wanneer een pagina moet worden vernieuwd. Een geldige datumreeks moet de indeling hebben 01 Jan 1998 12:00:00 GMT. |
3 | Locatie:URL De URL die moet worden geretourneerd in plaats van de aangevraagde URL. Je kunt dit bestand gebruiken om een verzoek om te leiden naar een willekeurig bestand. |
4 | Laatst gewijzigd:datum De datum van de laatste wijziging van de bron. |
5 | Inhoudslengte:N De lengte, in bytes, van de gegevens die worden geretourneerd. De browser gebruikt deze waarde om de geschatte downloadtijd voor een bestand te rapporteren. |
6 | Set-Cookie:String Stel de cookie in die door de string gaat . |
CGI-omgevingsvariabelen
Alle CGI-programma's hebben toegang tot de volgende omgevingsvariabelen. Deze variabelen spelen een belangrijke rol bij het schrijven van een CGI-programma.
Zr.Nee | Naam en beschrijving van variabele |
---|---|
1 | CONTENT_TYPE Het gegevenstype van de inhoud dat wordt gebruikt wanneer de client bijgevoegde inhoud naar de server verzendt. Bijvoorbeeld bestandsupload etc. |
2 | CONTENT_LENGTH De lengte van de query-informatie die alleen beschikbaar is voor POST-verzoeken. |
3 | HTTP_COOKIE Retourneert de ingestelde cookies in de vorm van een sleutel- en waardepaar. |
4 | HTTP_USER_AGENT Het veld User-Agent-aanvraagheader bevat informatie over de user-agent die de aanvraag heeft ingediend. Het is een naam van de webbrowser. |
5 | PATH_INFO Het pad voor het CGI-script. |
6 | QUERY_STRING De URL-gecodeerde informatie die wordt verzonden met het verzoek van de GET-methode. |
7 | REMOTE_ADDR Het IP-adres van de externe host die het verzoek doet. Dit kan handig zijn voor loggen of voor authenticatiedoeleinden. |
8 | REMOTE_HOST De volledig gekwalificeerde naam van de host die het verzoek doet. Als deze informatie niet beschikbaar is, kan REMOTE_ADDR worden gebruikt om een IR-adres te krijgen. |
9 | REQUEST_METHOD De methode die is gebruikt om het verzoek in te dienen. De meest gebruikelijke methoden zijn GET en POST. |
10 | SCRIPT_FILENAME Het volledige pad naar het CGI-script. |
11 | SCRIPT_NAME De naam van het CGI-script. |
12 | SERVER_NAME De hostnaam of het IP-adres van de server. |
13 | SERVER_SOFTWARE De naam en versie van de software waarop de server draait. |
Hier is een klein CGI-programma om alle CGI-variabelen op een rij te zetten.
#include <iostream> #include <stdlib.h> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI Environment Variables</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // attempt to retrieve value of environment variable char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ) { cout << value; } else { cout << "Environment variable does not exist."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
C++ CGI-bibliotheek
Voor echte voorbeelden zou u veel bewerkingen moeten uitvoeren door uw CGI-programma. Er is een CGI-bibliotheek geschreven voor het C++-programma die u kunt downloaden van ftp://ftp.gnu.org/gnu/cgicc/ en volg de stappen om de bibliotheek te installeren −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
U kunt gerelateerde documentatie raadplegen die beschikbaar is op 'C++ CGI Lib Documentation.
GET- en POST-methoden
U bent vast veel situaties tegengekomen waarin u wat informatie van uw browser naar de webserver en uiteindelijk naar uw CGI-programma moet doorgeven. Meestal gebruikt de browser twee methoden om deze informatie door te geven aan de webserver. Deze methoden zijn GET-methode en POST-methode.
Informatie doorgeven met GET-methode
De GET-methode verzendt de gecodeerde gebruikersinformatie die aan het paginaverzoek is toegevoegd. De pagina en de gecodeerde informatie worden gescheiden door de ? teken als volgt −
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
De GET-methode is de standaardmethode om informatie van browser naar webserver door te geven en produceert een lange reeks die in het vak Location:box van uw browser verschijnt. Gebruik nooit de GET-methode als u een wachtwoord of andere gevoelige informatie aan de server moet doorgeven. De GET-methode heeft een maximale grootte en u kunt tot 1024 tekens in een verzoekreeks doorgeven.
Wanneer u de GET-methode gebruikt, wordt informatie doorgegeven met behulp van de QUERY_STRING http-header en is deze toegankelijk in uw CGI-programma via de omgevingsvariabele QUERY_STRING.
U kunt informatie doorgeven door eenvoudig sleutel- en waardeparen samen te voegen met elke URL of u kunt HTML
C Taal