Avatar billede the_bma_man Nybegynder
24. oktober 2002 - 08:17 Der er 2 kommentarer og
1 løsning

Indput - CGI-programmering

Hejsa - lige et spørgsmål.
Når jeg i et cgi-program skal læse data, der kommer fra en form med metoden GET, så læses de bare fra std-input.
Hvordan læser jeg dem, når formen er POST'et?
Avatar billede mbulow Nybegynder
24. oktober 2002 - 10:43 #1
Lidt forvirret lige nu :) Mener du virkelig at GET leverer data via std-input? Det skulle da ellers være POST der gør det...

Men OK... Det her er i hvert fald hvad jeg har fundet ud af:



POST:
-----
Data aflæses via 'stdin', og mængden af data finden i "environment"-variablen CONTENT_LENGTH



GET:
----
Data finden i "environment"-variablen QUERY_STRING



Et par links du eventuelt kan kigge lidt nærmere på:
----------------------------------------------------
http://www.cs.tut.fi/~jkorpela/forms/cgic.html
http://www.openroad.org/cgihelp/cgi.html
Avatar billede the_bma_man Nybegynder
24. oktober 2002 - 11:20 #2
Hmm - følgende c-kode, jeg har lavet engang for laaaaang tid siden virker upåklageligt. Smider lige en kommentar ind, for at vise, hvad jeg mener:

int main(int argc, char **argv)
{
    register int iCharPos;                        // Loop control for reading stdio
    int iContentLen;                                    // stdio length
    int iBufPos = 0;                                    // Where we are in the stdio bucket
    int iErr = 0;                                            // Scrap
    char *szpMethod, *szpContent;            // HTTP info
    char ch;                                                    // stdio char
    char szFormData[MAX_INPUT_SIZE + 1]; // stdio bucket
    orderdisp2siteDataRec siteData;                                    // Customer data record
    orderdetailDataRec orderData;                                // Order data record
    ErrorRec errRec;                                            // Error record
    int numItems;

    szpMethod = getenv("REQUEST_METHOD");
    if(strcmp(szpMethod, "POST"))
    {
        prnFrmErr(CGI_POST_ERR, szpMethod);
        exit(NOK);
    }
[ Her checkes netop for POST - og fejler, hvis det ER en post.
Ergo - kommer vi videre, er det ikke post -> det er GET]

    // Get the content type.
    szpContent = getenv("CONTENT_TYPE");

    // Check if this is our mime type.
    if(strcmp(szpContent,"application/x-www-form-urlencoded"))
    {
        prnFrmErr(MIME_TYPE_ERR, szpContent);
        exit(NOK);
    }

    // How many characters in stdin.
    iContentLen = atoi(getenv("CONTENT_LENGTH"));

    // Get everything from stdin.
    for(iCharPos = 0; iCharPos < iContentLen; iCharPos++)
    {
        // Get a char from stdio.
        ch = (char) fgetc(stdin);
        // Add it to the data buffer.
        szFormData[iCharPos] = ch;
    }

    szFormData[iCharPos] = '\0'; // Null terminate it.

[Og så kommer der noget mere.

Men ovenstående virker i hvert fald på en GET.
Mener du, jeg bare skal lave det samme på en POST?

Mener ellers at have fået forklaringen, at det IKKE er std-in, da dene buffer er begrænset (til ca. 4000 bytes) og det også er derfor, en GET ikke kan forventes at virke hvis den er større.
Er jeg fuldstændig galt på dne her?
Avatar billede the_bma_man Nybegynder
24. oktober 2002 - 12:49 #3
Dette er jo det rene sludder, jeg skriver her:
  szpMethod = getenv("REQUEST_METHOD");
    if(strcmp(szpMethod, "POST"))
    {
        prnFrmErr(CGI_POST_ERR, szpMethod);
        exit(NOK);
    }
[ Her checkes netop for POST - og fejler, hvis det ER en post.
Ergo - kommer vi videre, er det ikke post -> det er GET]

Det er jo lige modsat - mit oldgamle program kan åbentbart KUN håndtere POSTs - der kan man bare se :-)

Men i hvert fald - det var nogen super links du lige kom frem med der - de er alle pointene værd!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester