Was wird in diesem Perl-Skript an den Webservice geschickt?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Was wird in diesem Perl-Skript an den Webservice geschickt?

    Hallo,

    ich ahbe mit Webservices so gut, wie keine Erfahrung. Nun beschäftigt mich gerade die Sipgate API, und hier speziell das versenden von SMS. Dazu hat Sipgate ein Perl Beispiel veröffentlicht, aber um ehrlich zu sein, verstehe ich das nicht ganz:

    Perl-Quellcode

    1. #!/usr/bin/perl -w
    2. #
    3. # Sam Buca, indigo networks GmbH, 08/2007
    4. #
    5. # This script is a very basic perl-client to the SAMURAI service
    6. # provided by sipgate (indigo networks GmbH) without any claim to
    7. # completeness and without any warranty!
    8. #
    9. # The following code shows how to use the service to send messages
    10. # via SMS using a sipgate account.
    11. #
    12. use strict;
    13. use Frontier::Client; # needed for XMLRPC
    14. # declare some variables for later use:
    15. my $VERSION = "1.0";
    16. my $NAME = "sipgateAPI-sms.pl";
    17. my $VENDOR = "indigo networks GmbH";
    18. my $url;
    19. my $xmlrpc_client;
    20. my $xmlrpc_result;
    21. my $args_identify;
    22. my $args;
    23. # check the count of commandline parameters and show usage information
    24. # if not matching:
    25. unless (@ARGV == 4) {
    26. print "\n";
    27. print "This script needs 4 parameters supplied on the commandline:\n";
    28. print "\n";
    29. print "parameter 1 -> the username (not SIPID) used to login to sipgate\n";
    30. print "parameter 2 -> the password associated with the username\n";
    31. print "parameter 3 -> the number to send the message to\n";
    32. print " (with national prefix, e.g. 4917xxxxxxxxx)\n";
    33. print "parameter 4 -> the message to send quoted in \" or \'\n";
    34. print "\n";
    35. exit 0;
    36. }
    37. # define URL for XMLRPC:
    38. $url = "https://$ARGV[0]:$ARGV[1]\@samurai.sipgate.net/RPC2";
    39. # create an instance of the XMLRPC-Client:
    40. $xmlrpc_client = Frontier::Client->new( 'url' => $url );
    41. # identify the script to the server calling XMLRPC-method "samurai.ClientIdentify"
    42. # providing client-name, -version and -vendor:
    43. $args_identify = { ClientName => $NAME, ClientVersion => $VERSION, ClientVendor => $VENDOR };
    44. $xmlrpc_result = $xmlrpc_client->call( "samurai.ClientIdentify", $args_identify );
    45. # the check for success is not necessary in this case since the Frontier::Client module
    46. # dies with an exception in case of a fault, but we do it for completeness:
    47. if ($xmlrpc_result->{'StatusCode'} == 200) {
    48. print "Successfully identified to the server!\n";
    49. } else {
    50. # we should never get here!
    51. print "There was an error during identification to the server!\n";
    52. }
    53. # create the input argument set for XMLRPC:
    54. $args = { RemoteUri => "sip:$ARGV[2]\@sipgate.net", TOS => "text", Content => $ARGV[3] };
    55. # do the call and store the result / answer to $xmlrpc_result:
    56. $xmlrpc_result = $xmlrpc_client->call( "samurai.SessionInitiate", $args );
    57. # again we do the check on success for completeness:
    58. if ($xmlrpc_result->{'StatusCode'} == 200) {
    59. print "Your request was successfully send to the server!\n";
    60. } else {
    61. # we should never get here!
    62. print "There was an error!\n";
    63. }
    Alles anzeigen


    Kann mir jemand erklären was hier genau passiert? Es wird zuerst eine URL zusammengebaut "https://$ARGV[0]:$ARGV[1]\@samurai.sipgate.net/RPC2", wird diese im weiteren verlauf noch erweitert und dann diese eine URL abgeschickt? Bedeutet das, wenn ich diesen gesamten URL String im Browser eingebe könnte ich ne SMS verschicken?! Falls nicht, könnte mir jemand kurz den Weg beschreiben, der hier gegangen wird?
    Ich hab noch nie mit Webservices gearbeitet und möchte mir eine kleine App machen, mit der ich eine SMS versenden kann.

    Vielen Dank

    dragi
  • RE: Was wird in diesem Perl-Skript an den Webservice geschickt?

    Du kannst WebServices im Gegensatz zu REST nicht über den Browser aufrufen, weil der Request-Body XML enthält. Hierzu gibt es aber sehr nette Clients, z. B.: SOPA Client oder Oxygen (kostenpflichtig).

    Das Programm macht zwei Anfragen (Zeilen: 56 & 74), wobei die erste anscheinend zur Identifikation dient.

    In welcher Programmiersprache möchtest Du den WebService-Client implementieren?
    „Meine Komplikation hatte eine Komplikation.“
  • Original von Objcler
    SOAP (...) ist doch sowas von over engineered. Was wollt ihr alle bloß damit?

    Schaut euch mal in aller Ruhe REST an. Da kommt ihr mit einfachsten Mitteln zum Ziel...

    Da hast Du Recht. Für so eine einfache Sache sind WebServices absolut oversized. Ich wollte auch schon einen ähnlichen Kommentar schreiben ;)

    Wahrscheinlich hat dragi aber keine andere Wahl. Wenn mensch auf eine viel zu komplizierte, anscheinend kommerzielle Schnittstelle zugreifen will, geschieht das meist im Auftrag des Kunden :(

    @dragi: Falls Du doch die Wahl haben solltest. Es gibt SMS-Versandanbieter wie Sand am Meer. Wahrscheinlich haben viele eine einfachere REST-Schnittstelle.
    „Meine Komplikation hatte eine Komplikation.“
  • Hallo,

    ist mir Problem. mein Problem gemeint? Mein Problem ist, das ich gerade versuche Webservices zu verstehen!

    Ich habe nun folgendes versucht:

    Quellcode

    1. //
    2. // smsTest.m
    3. // SMSTest
    4. //
    5. // Created by Thomas Wickl on 20.08.09.
    6. // Copyright 2009 __MyCompanyName__. All rights reserved.
    7. //
    8. #import "smsTest.h"
    9. @implementation smsTest
    10. - (IBAction)identify:(id)sender
    11. {
    12. NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://xxxx:xxxx@samurai.sipgate.net/RPC2"]];
    13. [theRequest setHTTPMethod:@"POST"];
    14. [theRequest setCachePolicy:NSURLCacheStorageNotAllowed];
    15. [theRequest setTimeoutInterval:5.0];
    16. NSString* pStr = [[NSString alloc] initWithString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall><methodName>samurai.ClientIdentify<methodName><params><param><value><struct><member><name>ClientName</name><value><string>Tester</string></value></member><member><name>ClientVersion</name><value><string>1.0</string></value></member><member><name>ClientVendor</name><value><string>XXXX</string></value></member></struct></value></param></params></methodCall>"];
    17. NSData* pBody = [pStr dataUsingEncoding:NSStringEncodingConversionAllowLossy];
    18. [theRequest setHTTPBody:pBody];
    19. NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    20. }
    21. - (IBAction)send:(id)sender
    22. {
    23. NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://xxxx:xxxx@samurai.sipgate.net/RPC2"]];
    24. [theRequest setHTTPMethod:@"POST"];
    25. [theRequest setCachePolicy:NSURLCacheStorageNotAllowed];
    26. [theRequest setTimeoutInterval:5.0];
    27. NSString* pStr = [[NSString alloc] initWithString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall><methodName>samurai.SessionInitiate<methodName><params><param><value><struct><member><name>RemoteUri</name><value><string>sip:4915XXXXXXX@sipgate.net</string></value></member><member><name>TOS</name><value><string>text</string></value></member><member><name>Content</name><value><string>Test</string></value></member></struct></value></param></params></methodCall>"];
    28. NSData* pBody = [pStr dataUsingEncoding:NSStringEncodingConversionAllowLossy];
    29. [theRequest setHTTPBody:pBody];
    30. NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    31. }
    32. @end
    Alles anzeigen


    Ist es richtig im HTTPBody das XML zu übergeben? Auf jeden Fall tut ich nichts wenn ich die Methoden abfeuer...kommt keine SMS an ;)
    Hat jemand vielleicht noch einen Tip was falsch ist?

    Vielen Dank

    dragi
  • Ah ok. Ich hab XML-RPC noch nie "händisch" gemacht. Warum nimmst Du nicht einfach eine von den vielen (klitzekleinen) Libraries? z.B. divisiblebyzero.com/

    Ansonsten sieht Dein Code aber auch ganz in Ordnung aus. Vielleicht ist das Format deiner Parameter nicht korrekt. Evtl. einfach mal Perl-Skript starten und XML mitschreiben?

    Übrigends: In Deinem Quelltext-Ausschnitt steht noch Deine Telefon-nummer, die solltest Du mal ..uhm.. "schwärzen" ;)

    EDIT: Mhh, vllt muss auch der Content-type oder soetwas gesetzt werden. Keine Ahnung, was XML-RPC fordert und was die Apple-Klassen da standardmässig machen...
    C++
  • Hi! Du warst das also ;)

    Implementier doch mal eine delegate Methode in Deinem Objekt, in der Du die Antwort des Servers ausgiebst:

    Quellcode

    1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)theResponse {
    2. NSLog(@"%@", theResponse);
    3. }


    Viele Grüße
    Christian
  • Haha, ja, das war ich dann wohl...Stackoverflow ist ja auch eine tolle Seite :)

    Danke für den hinweis mit dem validen XML, aber es kommt trotzdem nichts an. Das mit dem Delegate habe ich nicht ganz verstanden. Dazu muss ich daoch eigentlich immer in der .h Datei angeben, welches Interface ich in meiner Klasse implementieren möchte, aber zu welchem gehört diese Methode?

    @zermelo

    Danke für den Tip, habe ich mir auch angesehen, aber noch nicht verstanden wie ich meine Parameter übergeben soll. Im Beispiel macht er

    Quellcode

    1. NSURL *URL = [NSURL URLWithString: @"http://127.0.0.1:8080/"];
    2. XMLRPCRequest *request = [[XMLRPCRequest alloc] initWithURL: URL];
    3. XMLRPCConnectionManager *manager = [XMLRPCConnectionManager sharedManager];
    4. [request setMethod: @"Echo.echo" withParameter: @"Hello World!"];
    5. NSLog(@"Request body: %@", [request body]);
    6. [manager spawnConnectionWithXMLRPCRequest: request delegate: self];
    7. [request release];
    Alles anzeigen


    Aber bei [request setMethod: @"Echo.echo" withParameter: @"Hello World!"]; müsste ich vor "Hello World" noch angeben welcher Parameter das ist, zumindest erwartet das der Webservice so, wenn ich es richtig verstanden habe.

    [Blockierte Grafik: http://img38.imageshack.us/img38/6103/bild1m.png]

    Aber am liebsten würde ich es, für das verständnis, nur mit Boardmitteln versuchen, ohne fremde Frameworks...


    Gruß

    dragi
  • Hi :)

    Implementieren soll die Delegate Methoden Deine Klasse "smsTest", sie wird ja auch von Dir als delegate in der NSURLConnection angegeben (delegate:self). Deine Klasse muss also als Helfer für die NSURLConnection herhalten und darf die ein oder andere Aufgabe übernehmen. Sie kann einzelne Methoden implementieren, sie muss aber nicht. Das ist der Unterschied zu Java Interfaces.

    Der Ansatz dieses Herausforderung mit Bordmitteln zu lösen ist gut, vor allem muss man sich dann mal damit beschäftigen, wie HTTP und so ein Service funktioniert. Danach ist man immer schlauer :)

    Den HTTP Body kannst Du auch mit UTF-8 encoding erzeugen (so wie es im im xml encoding steht):

    Quellcode

    1. [xmlString dataUsingEncoding:NSUTF8StringEncoding]

    Eventuell musst Du im HTTP Header noch ein paar Werte setzen. Hast Du mal das Debugging im Frontier Client benutzt?

    Quellcode

    1. $xmlrpc_client = Frontier::Client->new( 'url' => $url, 'debug' => 'true');


    Viele Grüße
    Christian
  • Servus,

    ich bins wieder :D

    Also, ich habe nun folgendes NSLog wenn ich meine Methoden ausführe, aber vertsehen tu ich nix, da steht nur eine Speicheradresse:

    [Session started at 2009-08-21 16:42:17 +0200.]
    2009-08-21 16:42:24.429 SMSTest[5622:10b] <NSHTTPURLResponse: 0x1f1a40>
    2009-08-21 16:42:26.560 SMSTest[5622:10b] <NSHTTPURLResponse: 0x1e8b40>

    Ich habe das Encoding umgestellt:

    Quellcode

    1. NSData* pBody = [pStr dataUsingEncoding:NSUTF8StringEncoding];


    Aber alles in allem funktioniert noch nix und bin absolut ratlos...

    Gruß und Dank

    dragi
  • Moin, Moin!

    Wie doof, NSHTTPURLResponse hat also keine eigene description Methode :-/ Dann lass Dir doch mal die einzelnen Werte ausgeben:

    Quellcode

    1. NSLog(@"%d, %@", [response statusCode], [response allHeaderFields]);
    Damit soltle das Ergebnis besser lesbar sein ;)
    Viele Grüße
    Christian
  • Die Kommunikation mit dem Sipgate System ist SSL verschlüsselt, da hilft der Wireshark leider wenig. Alternativ kann man bei einer nicht verschlüsselten Verbindung auch tcpdump bemühen um zu schauen, was über das Netzwerk geschickt wird:

    Quellcode

    1. sudo tcpdump -As 1514 port 80