Seite 1 von 1

Via XmlHttp quick'n dirty auf MS Webservice (ASMX) zugreifen

Verfasst: 31.08.2011 21:39
von Kiffi
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.

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())
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).

Bild

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")
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:

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())
Die Funktion GetMovieAtNumber wird fast identisch
aufgerufen. Der Unterschied hier liegt im 'input'-Parameter, dem man dem
Envelop mitgeben muss.

Bild

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