Announcement

Collapse
No announcement yet.

HTTP Post mit HTTPSendRequest?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • HTTP Post mit HTTPSendRequest?

    Ich möchte gerne in meiner Delphi-Applikation den Zugriff auf den Online-Shop eines Großhändlers über die IDS-Schnittstelle anbieten.

    Den Zugriff auf die Artikeldaten im Shop erhalte ich dabei über HTTP-POST mit den Parametern kndnr (Kundennummer im Shop), pw_kunde (Passwort im Shop), ghnummer (Artikelnummer) und die action=ADL (Artikel Deep Link). Die Antwort des Shops würde ich gerne im Standard-Browser anzeigen.

    Edit:
    Wenn ich diesen HTML-Code an den Shop schicke, dann bekomme ich die Daten wie gewünscht angezeigt:

    Code:
    <HTML>
    <BODY>
    <FORM
     ACTION="http://www.shop.de/ids.php"
     CONTENT="text/html"
     ENCTYPE="multipart/form-data"
     METHOD="POST">
    
    <input type=hidden name="kndnr" value="12345">
    <input type=hidden name="pw_kunde" value="geheim">
    <input type=hidden name="version" value="1.3">
    <input type=hidden name="action" value="ADL">
    <input type=hidden name="ghnummer" value="4711">
    
    <input type="submit" value="Abschicken">
    
    </FORM>
    </BODY>
    </HTML>
    Wie schaffe ich es, diese Informationen aus meiner Anwendung heraus an den Server zu schicken?

    Derzeit versuche ich es mit dem weiter unten angegebenen Konstrukt. Als Antwort vom Shop-Server erhalte ich allerdings die Fehlermeldung, dass der Parameter kndnr nicht übergeben wurde.

    Meine Fragen:

    - wie kann ich die Daten, die in dem HTML-Code oben aufgeführt sind, sinnvoll aus einer Delphi-Anwendung an den Shop-Server schicken?

    - Gibt es bei HTTP-Post etwas zu beachten, das ich übersehen habe?

    - Ist das Zusammenfügen der einzelnen POST-Parameter mit dem &-Zeichen korrekt?

    - Wie kann ich die Antwort des Servers ohne das Erstellen einer temporären HTML-Datei im Standard-Browser anzeigen?

    - Ist der Ansatz, die Antwort des Servers mit InternetReadFile zu lesen sinnvoll? Oder sollte ich eher die lokale HTML-Datei mit den POST-Daten erstellen und diese dann über den lokalen Browser an den Shop-Server schicken?

    Ich würde nur ungern Fremdkomponenten verwenden und habe nur Delphi4 im Einsatz...

    Code:
        // ***************************************
        // HTTP-Session vorbereiten
        // ***************************************
        hSession := InternetOpen(PChar('MyAppName'),
                                 INTERNET_OPEN_TYPE_DIRECT,
                                 NIL,
                                 NIL,
                                 0);
    
        if not Assigned(hSession) then
        begin
          MessageDlg('Fehler beim Aufbau der HTTP-Session', mtError, [mbOK], 0);
          Exit;
        end;
    
        // ***************************************
        // HTTP-Verbindung aufbauen
        // ***************************************
        hConnection := InternetConnect(hSession,
                                       PChar('www.shop.de'),
                                       INTERNET_DEFAULT_HTTP_PORT,
                                       NIL,
                                       NIL,
                                       INTERNET_SERVICE_HTTP,
                                       0,
                                       1);
    
        if not Assigned(hConnection) then
        begin
          InternetCloseHandle(hSession);
          MessageDlg('Verbindung mit dem Shop fehlgeschlagen', mtError, [mbOK], 0);
          Exit;
        end;
    
        // ***************************************
        // Anmeldedaten
        // ***************************************
        cHTMLSend := 'kndnr=12345&pw_kunde=geheim&action=ADL&ghnummer=';
        cHTMLSend := cHTMLSend + Trim(ArtikelNr);
    
        // ***************************************
        // HTTP-Request erstellen und senden
        // ***************************************
        hRequest := HttpOpenRequest(hConnection,
                                    PChar('POST'),
                                    PChar('/ids.php'),
                                    HTTP_VERSION,
                                    NIL,
                                    NIL,
                                    INTERNET_FLAG_NO_AUTH,
                                    1);
    
        cContentType := 'Content-Type: text/html';
    
        HttpSendRequest(hRequest,
                        PChar(cContentType),
                        Length(cContentType),
                        PChar(cHTMLSend),
                        Length(cHTMLSend) - 1);
    
        // ***************************************
        // HTTP-Quelltext des Shops abholen
        // ***************************************
        if not InternetQueryDataAvailable(hRequest, nBytes, 0, 0) then
          MessageDlg('Der Shop liefert keine Daten zurück.', mtError, [mbOK], 0)
        else
        begin
          cHTMLReceive := '';
          repeat
            InternetReadFile(hRequest, @aBuffer, SizeOf(aBuffer), nBytes);
            cHTMLReceive := cHTMLReceive + aBuffer;
          until nBytes = 0;
        end;
    
        // ***************************************
        // HTTP-Session freigeben
        // ***************************************
        InternetCloseHandle(hRequest);
        InternetCloseHandle(hConnection);
        InternetCloseHandle(hSession);
    
        // ***************************************
        // HTML-Datei erzeugen (muss das sein?)
        // ***************************************
        cDateiname := 'Pfad\zu\temp.html';
    
        AssignFile(F, cDateiname);
        Rewrite(F);
        Write(F, cHTMLReceive);
        CloseFile(F);
    
        // ***************************************
        // Onlineshop im Browser aufrufen
        // ***************************************
        RSStartBrowser(cDateiname);
    Danke für jede Hilfe.

    Ralph
    Zuletzt editiert von Ralph Staudte; 14.12.2010, 12:49.

  • #2
    Update:

    Nach einer kurzen Analyse mit Wireshark habe ich herausgefunden, dass noch ein paar Header-Angaben gefehlt haben.

    Damit scheint der POST-Aufruf nun zu klappen:

    Code:
        cHeaderInfo := 'Accept: */*' + GB_EOL;
        cHeaderInfo := cHeaderInfo + 'Accept-Charset: UTF-8' + GB_EOL;
        cHeaderInfo := cHeaderInfo + 'Keep-Alive: 115' + GB_EOL;
        cHeaderInfo := cHeaderInfo + 'Connection: keep-alive' + GB_EOL;
        cHeaderInfo := cHeaderInfo + 'Content-Type: application/x-www-form-urlencoded' + GB_EOL;
    
        HttpAddRequestHeaders(hRequest,
                              PChar(cHeaderInfo),
                              Length(cHeaderInfo),
                              HTTP_ADDREQ_FLAG_REPLACE or HTTP_ADDREQ_FLAG_ADD);
    Ein großes Problem bleibt aber noch:

    Wie zeige ich den HTML-Code, den ich mit InternetReadFile vom Server gelesen habe, im Standardbrowser an? (Ohne den Umweg über die temporäre Datei gehen zu müssen...)

    Mein Delphi 4 kennt keinen TWebBrowser und es wäre schön, wenn das auch mit Firefox klappen würde.

    Ralph

    Comment


    • #3
      Hallo Ralph,

      bin zufällig auf Deinen Thread gestoßen. Habe selbst eine Anfrage im VB.NET Forum erstellt - "WebRequest mit POST zeigt unterschiedliches Ergebnis".

      Habe dazu den Großhändler befragt, jedoch kann dieser zu dem Thema nichts sagen und beruft sich auf die Dokumentation der IDS-Schnittstelle. Bist Du hier weitergekommen?

      In meinem Programm entsprechen die zurück gegebenen Daten nicht der "realen Welt".

      Gruß
      Hans

      Comment

      Working...
      X