yet another useless homepage

We don't cut. We expand.

Mit Perl einen .Net-Webservice abfragen

| Keine Kommentare

Mit Perl einen Webservice abzufragen, kann eigentlich nicht so schwer sein, dachte ich. Allerdings habe ich dann, als ich mir SOAP::Lite und dessen Dokumentation ansah, schien das Unterfangen schon deutlich komplizierter. So großartig dieses Modul sein mag, die Dokumentation war für meinen Geschmack zu verstreut und ich hätte mir einige Code-Beispiele gewünscht. Vermutlich lag es aber auch nur daran, dass meine Programmierkenntnisse doch sehr beschränkt sind. Nach einigem Hin und her hat es schließlich dann doch noch geklappt. Im Folgenden zeige ich zwei alternative Möglichkeiten, die zwar beide lauffähig, aber vielleicht nicht gerade effizient sind.

Mein erster Versuch war dann zwar funktionstüchtig, aber so weit davon entfernt elegant zu sein, dass ich nicht ganz zufrieden damit sein konnte. Das Programm verbindet sich mit einem Webservice. Dieser Service verlangt eine Authentifizierung via Klartext- oder MD5-Passwort. Die Funktion GetServerVersion() bildet hier eine Ausnahme und wird zu Testzwecken aufgerufen.

Listing 1: soap1.pl
#Code
0001#!/opt/local/bin/perl -w
0002use SOAP::Lite;# alternatively ( +trace => all, maptype => {} );
0003use strict;
0004 
0005# configure server uri
0006my $service_url = 'http://127.0.0.1:8110/config';
0007my $cfg_user = 'stephan.hochhaus';
0008my $cfg_password = 'password';
0009 
0010# test server connection by using a method w/o the need for authentication
0011print "Testing the connection by requesting the method GetServerVersion().\nResult: ";
0012print &send_request("GetServerVersion");
0013 
0014# initialize with login credentials
0015my $username = SOAP::Data->type('string');
0016$username->name('Username');
0017$username->value($cfg_user);
0018my $password = SOAP::Data->type('string');
0019$password->name('Password');
0020$password->value($cfg_password);
0021 
0022# get SessionID - required for most methods
0023my $sessionID = SOAP::Data->type('string');
0024$sessionID->name('SessionID');
0025$sessionID->value(&send_request("Login",$username,$password));
0026 
0027# getList() on ObjectName
0028my $DateTimeNow = SOAP::Data->type('dateTime');
0029$DateTimeNow->name('Now');
0030$DateTimeNow->value(&create_timestamp());
0031my $ByName = SOAP::Data->type('string');
0032$ByName->name('ByName');
0033$ByName->value('ObjectName');
0034print &send_request("GetList",$sessionID,$DateTimeNow,$ByName);
0035 
0036# be nice, shut the door behind you!
0037print &send_request("Logout",$sessionID);
0038 
0039# perfom method calls to the webservice
0040sub send_request{
0041my $method = shift @_;
0042my $client = SOAP::Lite
0043->on_action( sub { return $method;}) ->uri('')
0044->proxy($service_url);
0045my $result = $client->$method(@_);
0046unless ($result->fault) {
0047return $result->result();
0048}
0049else {
0050print join ', ', $result->faultcode, $result->faultstring, $result->faultdetail;
0051}
0052}
0053 
0054# returns current timestamp
0055sub create_timestamp {
0056my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
0057return sprintf "%4d-%02d-%02dT%02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec;
0058}

Code herunterladen
[Downloads: 1116]

Was genau treibt der Code? Insgesamt werden anhand der Funktion send_request drei Funktionen des Webservice aufgerufen:

  • GetServerVersion()
  • Login(Username,Passwort) (alternativ auch als LoginMD5 implementiert)
  • GetList(SessionID,Timestamp,ObjectName)
  • Logout(SessionID)

Da der .Net-Webserver seine WSDL-Datei auf Verlangen anzeigt, geht die Abfrage des Services sogar auch noch deutlich einfacher:

Listing 2: soap2.pl
#Code
0001#!/opt/local/bin/perl -w
0002use SOAP::Lite;# add ' +trace' for verbose output
0003use strict;
0004 
0005# configure server uri
0006my $service_url = 'http://127.0.0.1:8110/config';
0007my $cfg_user = 'stephan.hochhaus';
0008my $cfg_password = 'password';
0009 
0010# stress test!
0011for (my $i = 0; $i<100; $i++){
0012&call_method_args();
0013}
0014 
0015# returns current timestamp
0016sub create_timestamp {
0017my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
0018return sprintf "%4d-%02d-%02dT%02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec;
0019}
0020 
0021# calls methods
0022sub call_method_args {
0023my $service = SOAP::Lite
0024 -> service($service_url . '?wsdl');
0025my $sessionID = $service->LoginMD5($cfg_user, $cfg_password);
0026my $result = $service->Get($sessionID,&create_timestamp,'ObjectName',0,0);
0027$service->Logout($sessionID);
0028}

Code herunterladen
[Downloads: 896]

Links:

Author:

Kommentare

Verfasse einen Kommentar

Pflichtfelder sind markiert *.
Textile Hilfe

*


Keine Kommentare

    Verfasse einen Kommentar

    Pflichtfelder sind markiert *.
    Textile Hilfe

    *