![]() |
Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Hallo Comunity,
ich bin Neuling im Bereich "Internet-Anwendung" und bekomme es einfach nicht hin, eine XML-Datei für ein Login an einen Server (fehlerfrei) zu schicken. Gesammtanforderung ist, sich mittels einer XML Datei bei einem Server anzumelden und dann in einem 2. Schritt eine andere XML Datei dorthin zu schicken (eine Bestellung). Der Server verlangt "HTTPS" weshalb ich aufs neuste Delphi umgestiegen bin. Da die Installation der Software einfach sein sollte habe ich ich für diese "NET" Komponenten entschieden um nicht openSSL beim User installieren zu müssen. Ich habe mir eine XML Datei gebastelt (vom Type IXMLDOCUMENT), aufs Formular eine TNetHTTPClient und TNetHTTPRequest Komponete gesetzt, dann im Object Inspector beim NetHTTPClient alle SecureProtocols angeklickt und beim NetHTTPRequst bei Client den NetHTTPClient eingetragen. Im Quellcode geht's dann so weiter:
Delphi-Quellcode:
Als Antwort erhalte ich leider (in ServerResponse) Fehler 500: interner Server Error. Er beschwert sich das schon das 1.
var
ServerResponse:IHTTPResponse; LoginXML:IXMLDOCUMENT begin // [Erstelle Inhalt von LoginXML] NetHTTPRequest.URL:='https://www.________________/CmdS.asmx'; NetHTTPRequest.MethodString:='POST'; ServerResponse:=Post(URL,LoginXML.XML, nil, TEncoding.UTF8); end; übergebene Zeichen er nicht versteht (Zeile 1 Position 1). Nun halte ich mich aber genau an die Dokumentation die da lautet:
Code:
Auch ein Übergaben dieses Inhalts mittels einer TStringliste führt zur gleichen Serverrückmeldung.
<r c="1">
<Login>Benutzername</Login> <Pwd>thePasswort</Pwd> <Stamp>theStamp</Stamp> </r> Sowie diverse Änderungen am POST wie z.B.: TEncoding.Default, weglassen des letzten, der letzten 2 Parametern etc. änderte nichts an der Fehlermeldung. Eigentlich sollte vom Server ein XML zurück gegeben werden indem entweder der Login bestätigt wird, oder mitgeteilt wird das der Login abgelehnt wurde. Vermutlich habe ich aber irgendwie ein Grundsätzliches Verständnisproblem oder irgend eine Einstellung stimmt (noch) nicht. Kann mir irgend einer Erklären wie man sich bei einem Server via XML und HTTPS anmeldet und dabei von Ihm eine XML zurück bekommt? Der 2. Schritt ist ja ähnlich, nur das da irgend ein "Session Key" mit übergeben werden muss!? Aber eins nach dem anderen. btw. In Wireshark konnte ich sehen das von Delphi 2 "Application Data"s (natürlich verschlüsselt) direkt hintereinander geschickt werden. Vom Server kommt dann nur ein Application Data zurück. :? ps. Ein Beispiel, ein Link zu einer Doku etc. würde mir eventuell auch schon weiter helfen, konnte aber leider bisher nichts brauchbares finden. Schon mal danke fürs lesen bis hierhin. |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Schau dir mal mit dem
![]() Und das kannst du dann hier mal posten, falls du den Fehler da nicht erkennst. Wenn du eine andere (Fremd-)Anwendung hast, die das erfolgreich kann, dann kannst du mit dem Fiddler auch das mitschneiden und mit deiner Anwendung vergleichen um den Fehler zu finden. |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Hallo Schokohase,
vielen Dank für die Info. Fiddler kannte ich nicht. Wenn ich das richtig gemacht habe dann sende ich aktuell als erste Zeile in der XML-Datei an den Server: %3C%3Fxml+version=%221.0%22+encoding%3D%22utf-8%22%3F%3E&%3Cr+c=%221%22%3E anstelle von <?xml version="1.0" encoding="utf-8"?> Scheint also irgend etwas mit der Codierung nicht zu stimmen. Kann man das noch woanders als direkt beim Post Befehle einstellen? (Post(URL,aTStrings, nil, TEncoding.UTF8);) Oder muss ich das vorher schon in der TStringlist anders "anlegen"? Ich werd' auf jeden Fall noch ein wenig herumprobieren. Jetzt wo ich sehen kann was ich tatsächlich an den Server schicke. |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Hast du das was du sendest wirklich mit dem verglichen, was funktioniert?
Dann hätte dir auch der Header auffallen sollen, der bei dir nämlich folgendes enthält
Code:
aber folgendes enthalten sollte
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Code:
Und das passiert, wenn du die Daten das
Content-Type: text/xml; charset=utf-8
Delphi-Quellcode:
übergibst.
TStrings
Erzeuge einen Stream von den XML Daten und versende den (inkl. der Information zum Content-Type). |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Hallo Schokohase,
danke für die schnelle Rückmeldung was funktioniert weiß ich leider nicht, da ich nur "eine dicke Doku" habe, aber leider keine Ahnung wie das alles so funktioniert. Und leider auch keinen Zugriff auf ein funktionierendes Programm. Die Doku beschreibt im übrigen nur was in welchem Feld stehen muss, aber nicht wie die Übertragung eigentlich funktionieren soll bzw. was sich außerhalb von <Document> zu befinden hat... Ich bin aber fast auf die gleiche Idee gekommen wie du. Man kann ein IXMLDOCUMENT ja speichern und bei POST den Dateinamen angeben. Das hat nämlich dann auch funktioniert. OK, dann werde ich das wie von dir vorgeschlagen über ein Stream versuchen. Aber die habe ich bisher auch noch nie verwendet (bisher meist ganz klassich über FileOpen mit eigener Klasse zum lesen/schreiben von Files gearbeitet; ist zwar schon > 20 Jahre alt funktioniert aber einwandfrei; also warum wechseln...). Aber leider ist damit mein Problem dann noch nicht ganz gelöst, da ich nun vom Server folgendes zurück bekomme: <soap:Fault> <faultcode>soap:VersionMismatch</faultcode> <faultstring>Possible SOAP version mismatch: Envelope namespace was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/.</faultstring> <detail/> Von einem Envelope höre ich da das erste mal. Vielleicht reicht es ja aber das hinzuschicken was auch in der Antwort von Server steht? Mal ausprobieren, über die Feiertage hat der eventuell sowieso nicht soviel zu tun, da kann ich den mit fehlerhaften Anfragen ja etwas beschäftigen :-) |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Du solltest deine Zeit sinnvoller investieren und dich in SOAP generell mal etwas einlesen.
|
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Es gibt viel was ich machen könnte. Leider fehlt mir die Zeit dafür.
Für dieses Projekt hieß es zu beginn "Erstelle eine XML-Datei", von Übertragen der Daten im XML Format über HTTPS mit aktueller Verschlüsselung, sowie vorher ein Login mittels XML und 2 Facher "Verhashung" war nicht die Rede. So Ändern sich die Anforderungen im laufe einer Aufgabe. Bisher, ich programier auf kleinem Profiniveau seit 20 Jahren, sah ich viele Techniken kommen und gehen, und Übertragung übers Internet war bisher kein Thema für mich. Und wenn ich das hinbekomme habe, kann es sein das ich den Quellcode die nächsten 10 Jahre nicht mehr ändern muss. Und bis dahin habe ich den nicht nur vergessen wo ich mich eingelesen habe, sondern das hat sich soweit verändert das ich wieder fast bei 0 anfangen kann. Trotzdem danke an Dich. Du hast mir echt weiter geholfen. |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Es gibt viel was ich machen könnte. Leider fehlt mir die Zeit dafür.
Für dieses Projekt hieß es zu Begin: "Erstelle eine XML-Datei", von Übertragen der Daten im XML Format über HTTPS mit aktueller Verschlüsselung, sowie vorher ein Login mittels XML und 2 Facher "Verhashung" war nicht die Rede. So Ändern sich die Anforderungen im laufe einer Aufgabe. Bisher, ich programiere auf kleinem Profiniveau seit 20 Jahren, sah ich viele Techniken kommen und gehen, und Übertragung übers Internet war bisher kein Thema für mich. Und wenn ich das hinbekomme habe, kann es sein, das ich den Quellcode die nächsten 10 Jahre nicht mehr ändern muss. Und bis dahin habe ich nicht nur vergessen in was ich mich eingelesen habe, sondern das hat sich vermutlich auch soweit verändert das ich wieder fast bei 0 anfangen kann. Das ganze mit HTTPS ist ja auch erst seit ein paar Jahren so massiv geworden. Trotzdem danke an Dich. Du hast mir echt weiter geholfen. Für alle die wissen wollen wie's geht. Es geht wohl so:
Delphi-Quellcode:
Nicht schwer, wenn man weis wie es geht :)
var
aStream:TMemoryStream; aXML:IXMLDOCUMENT; begin // XML Daten in aXML ablegen... with NetHTTPRequest do begin URL:='https://[...]/CmdS.asmx'; MethodString:='POST'; aStream:=TMemoryStream.Create; aXML.XML.SaveToStream(aStream); aStream.Seek(0,soFromBeginning); ServerResponse:=Post(URL,aStream); aStream.Free; end; end |
AW: Bekomme XML-Datei via NetHTTPRequest.Post nicht hin.
Wo ist der Ressourcenschutzblock für den Stream?
Und zu dem with...do sage ich mal nichts. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz