Via XmlHttp quick'n dirty auf MS Webservice (ASMX) zugreifen
Verfasst: 31.08.2011 21:39
Hallo,
nachfolgend eine kleine Anleitung wie man mittels XmlHttp quick 'n dirty
auf einen Microsoft Webservice (ASMX) zugreifen kann.
In diesem Beispiel werden die beiden Funktionen des freien Webservices
unter http://www.kirupafx.com/ aufgerufen. Hier nun die Step-by-Step-Anleitung:
1.) Folgendes Grundgerüst in die IDE kopieren. Der Code benötigt COMatePlus
von srod, welches man hier bekommt. Bitte daran denken, den IncludePath auf
den korrekten Pfad des Includes zu setzen.
2.) Aufrufen der Adresse http://www.kirupafx.com/WebService/TopMovies.asmx
im Webbrowser. Hier sehen wir nun die beiden Funktionen GetMovieAtNumber und
GetTop10. Wir widmen uns zunächst der Funktion GetTop10. Diese liefert uns eine
Liste von 10 Filmtiteln zurück (vermutlich die persönlichen Favoriten des Programmautors).
3.) Mit Klick auf die Funktion GetTop10 gelangen wir zu einer Seite, auf der die
SOAP-Aufrufe der entsprechenden Funktion aufgelistet sind (sowohl in der
Version 1.1 als auch in der Version 1.2). In diesem Fall möchten wir die Funktion
mittels SOAP 1.2 aufrufen.
4.) Den SOAP XML-Abschnitt (Envelop) markieren und in die Zwischenablage
kopieren (Ctrl+C).

5.) Nachdem der Envelop in der Zwischenablage ist, folgenden Schnippsel
ausführen (dieser sorgt dafür, dass der in der Zwischenablage liegende
SOAP-Abschnitt für den nachfolgenden PB-Source aufbereitet wird):
5.) Den nun in der Zwischenablage befindlichen PB-Code in das
Grundgerüst von oben einfügen (dort, wo der Platzhalter
'[Hier den Soap-Envelop eintragen]' steht)).
6.) Die ASMX-Adresse des Webservices (http://www.kirupafx.com/WebService/TopMovies.asmx)
in das Grundgerüst eintragen (dort, wo der Platzhalter '[Hier Deine Asmx-Adresse eintragen]'
steht))
7.) Fertig. Der Code ruft nun die Funktion GetTop10 des Webservices
auf, welcher die Filmtitel-Liste in Form eines XML zurückgibt. Dieses
wiederum lässt sich dann recht einfach parsen.
Hier nochmal der komplette Code:
Die Funktion GetMovieAtNumber wird fast identisch
aufgerufen. Der Unterschied hier liegt im 'input'-Parameter, dem man dem
Envelop mitgeben muss.

Viel Spaß & Grüße ... Kiffi
nachfolgend eine kleine Anleitung wie man mittels XmlHttp quick 'n dirty
auf einen Microsoft Webservice (ASMX) zugreifen kann.
In diesem Beispiel werden die beiden Funktionen des freien Webservices
unter http://www.kirupafx.com/ aufgerufen. Hier nun die Step-by-Step-Anleitung:
1.) Folgendes Grundgerüst in die IDE kopieren. Der Code benötigt COMatePlus
von srod, welches man hier bekommt. Bitte daran denken, den IncludePath auf
den korrekten Pfad des Includes zu setzen.
Code: Alles auswählen
IncludePath #PB_Compiler_Home + "\srod\COMatePLUS\" ; Pfad anpassen
XIncludeFile "COMatePLUS.pbi"
IncludePath ""
EnableExplicit
Procedure.s PostViaXmlHttp(Input.s, AsmxAddress.s)
Protected XmlHttp.COMateObject
Protected ReturnValue.s
XmlHttp = COMate_CreateObject("MSXML2.XmlHttp")
If XmlHttp
XmlHttp\Invoke("Open('POST', '" + AsmxAddress + "', #False)")
XmlHttp\Invoke("setRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8')")
XmlHttp\Invoke("setRequestHeader('Content-Length', " + Str(Len(Input)) + ")")
XmlHttp\Invoke("setRequestHeader('Connection', 'close')")
XmlHttp\Invoke("Send('" + ReplaceString(Input, "'", "$0027") + "')")
ReturnValue = XmlHttp\getStringProperty("responseText")
XmlHttp\Release()
Else
Debug "!XmlHttp"
EndIf
ProcedureReturn ReturnValue
EndProcedure
Procedure.s GetExecuteResult()
Protected XML.s
Protected ExecuteResult.s
[Hier den Soap-Envelop eintragen]
XML = ReplaceString(XML, "''", Chr(34))
ExecuteResult = PostViaXmlHttp(XML, [Hier Deine Asmx-Adresse eintragen])
ProcedureReturn ExecuteResult
EndProcedure
MessageRequester("", GetExecuteResult())
im Webbrowser. Hier sehen wir nun die beiden Funktionen GetMovieAtNumber und
GetTop10. Wir widmen uns zunächst der Funktion GetTop10. Diese liefert uns eine
Liste von 10 Filmtiteln zurück (vermutlich die persönlichen Favoriten des Programmautors).
3.) Mit Klick auf die Funktion GetTop10 gelangen wir zu einer Seite, auf der die
SOAP-Aufrufe der entsprechenden Funktion aufgelistet sind (sowohl in der
Version 1.1 als auch in der Version 1.2). In diesem Fall möchten wir die Funktion
mittels SOAP 1.2 aufrufen.
4.) Den SOAP XML-Abschnitt (Envelop) markieren und in die Zwischenablage
kopieren (Ctrl+C).

5.) Nachdem der Envelop in der Zwischenablage ist, folgenden Schnippsel
ausführen (dieser sorgt dafür, dass der in der Zwischenablage liegende
SOAP-Abschnitt für den nachfolgenden PB-Source aufbereitet wird):
Code: Alles auswählen
Define Soap.s
Define SoapLine.s
CreateFile(0, GetTemporaryDirectory() + "soap.tmp")
WriteString(0, GetClipboardText())
CloseFile(0)
ReadFile(0, GetTemporaryDirectory() + "soap.tmp")
While Eof(0) = 0
SoapLine = ReadString(0)
SoapLine = ReplaceString(SoapLine, Chr(34), "''")
SoapLine = "XML + " + Chr(34) + SoapLine + Chr(34)
Soap + SoapLine + #CRLF$
Wend
CloseFile(0)
SetClipboardText(Soap)
DeleteFile(GetTemporaryDirectory() + "soap.tmp")
Grundgerüst von oben einfügen (dort, wo der Platzhalter
'[Hier den Soap-Envelop eintragen]' steht)).
6.) Die ASMX-Adresse des Webservices (http://www.kirupafx.com/WebService/TopMovies.asmx)
in das Grundgerüst eintragen (dort, wo der Platzhalter '[Hier Deine Asmx-Adresse eintragen]'
steht))
7.) Fertig. Der Code ruft nun die Funktion GetTop10 des Webservices
auf, welcher die Filmtitel-Liste in Form eines XML zurückgibt. Dieses
wiederum lässt sich dann recht einfach parsen.
Hier nochmal der komplette Code:
Code: Alles auswählen
IncludePath #PB_Compiler_Home + "\srod\COMatePLUS\"
XIncludeFile "COMatePLUS.pbi"
IncludePath ""
EnableExplicit
Procedure.s PostViaXmlHttp(Input.s, AsmxAddress.s)
Protected XmlHttp.COMateObject
Protected ReturnValue.s
XmlHttp = COMate_CreateObject("MSXML2.XmlHttp")
If XmlHttp
XmlHttp\Invoke("Open('POST', '" + AsmxAddress + "', #False)")
XmlHttp\Invoke("setRequestHeader('Content-Type', 'application/soap+xml; charset=utf-8')")
XmlHttp\Invoke("setRequestHeader('Content-Length', " + Str(Len(Input)) + ")")
XmlHttp\Invoke("setRequestHeader('Connection', 'close')")
XmlHttp\Invoke("Send('" + ReplaceString(Input, "'", "$0027") + "')")
ReturnValue = XmlHttp\getStringProperty("responseText")
XmlHttp\Release()
Else
Debug "!XmlHttp"
EndIf
ProcedureReturn ReturnValue
EndProcedure
Procedure.s GetExecuteResult()
Protected XML.s
Protected ExecuteResult.s
XML + "<?xml version=''1.0'' encoding=''utf-8''?>"
XML + "<soap12:Envelope xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xmlns:xsd=''http://www.w3.org/2001/XMLSchema'' xmlns:soap12=''http://www.w3.org/2003/05/soap-envelope''>"
XML + " <soap12:Body>"
XML + " <GetTop10 xmlns=''http://www.kirupafx.com'' />"
XML + " </soap12:Body>"
XML + "</soap12:Envelope>"
XML = ReplaceString(XML, "''", Chr(34))
ExecuteResult = PostViaXmlHttp(XML, "http://www.kirupafx.com/WebService/TopMovies.asmx")
ProcedureReturn ExecuteResult
EndProcedure
MessageRequester("", GetExecuteResult())
aufgerufen. Der Unterschied hier liegt im 'input'-Parameter, dem man dem
Envelop mitgeben muss.

Viel Spaß & Grüße ... Kiffi