Author Topic: XML-RPCing  (Read 624 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
XML-RPCing
« on: January 11, 2009, 03:12:53 PM »
XML-RPC



اذا لم تكن مهتما ب XML-RPC فكن حرا للإنتقال للفصل القادم
فى ابسط الصور XML-RPC هو بروتوكول Remote Procedure Call عبر بروتوكول HTTP
للمزيد http://en.wikipedia.org/wiki/XML-RPC




نوضح الموضوع بمثال بسيط


Code: [Select]
#!bin/python 


from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from SocketServer import ThreadingMixIn

class Greeter(object):

    def hi(self):
        """Returns hi message"""
        return "Hi"

    def bye(self):
        """Returns bye message"""
        return "Bye"

    def say(self, what):
        """Returns Simone says message"""
        return "Simone says: "+ what

class MyServer(ThreadingMixIn, SimpleXMLRPCServer):

    pass

def test():
    addr=('', 40002)
    srvr=MyServer(addr, SimpleXMLRPCRequestHandler)
    srvr.register_instance(Greeter())
    srvr.register_introspection_functions()
    srvr.serve_forever()
    #print "Started..."

if __name__=="__main__":
    test()
 


للوهلة الأولى سيتبادر لذهنك اننا ننشئ سرفر متعدد الخيوط (ThreadingMixIn واستخدمنا بدل ال SocketServer  صف مشابة وهو SimpleXMLRPCServer ؟
نعم بالفعل

ولدينا صف عادى جدا
Code: [Select]
 class Greeter(object): 

    def hi(self):
        """Returns hi message"""
        return "Hi"

    def bye(self):
        """Returns bye message"""
        return "Bye"

    def say(self, what):
        """Returns Simone says message"""
        return "Simone says: "+ what


كل ماهنالك اننا نريد ان نتيح امكانية استخدام طرق ذلك الصف عبر ال HTTP
لكائن SimpleXMLRPCServer بعض الطرق مثل register_instance اللتى تقوم بتسجيل ذلك الكائن على السرفر
وregister_introspection_functions تقوم بتسجيل بعض الدوال لمعرفة مايتعلق بذلك الكائن مثل system.listMethods (للحصول على الطرق الخاصة به ) و system.methodSignature للحصول على توقيع الطريقة (اسمها والمعاملات وال retrun ) و methodHelp للحصول على نص المساعدة الخاص بالطريقة وذلك بوضع اسمها كمعامل لهذه الطريقة
Code: [Select]
     srvr.register_instance(Greeter()) 
    srvr.register_introspection_functions()


قم بتشغيل ال سرفر ونأتى للعميل
Code: [Select]
import xmlrpclib 

s = xmlrpclib.ServerProxy('http://localhost:40002')
print s.system.listMethods()
print s.hi()
print s.bye() 
print s.say("Something") 


print s.system.methodHelp('say')
 

1- ننشئ كائن ServerProxy نحدد فيه عنوان السرفر ورقم البورت اللذى ينصت اليه
Code: [Select]
 s = xmlrpclib.ServerProxy('http://localhost:40002') 

2- للحصول على قائمة الطرق المتاحة على السرفر نستخدم system.listMethods
3- استغلال الطرق المتاحة مثل استدعاء الطرق hi اوbye
Code: [Select]
 print s.hi() 
print s.bye() 

4- ايضا استغلال الطرق اللتى قد تأخذ معاملات ما مثل say
Code: [Select]
print s.say("Something")  

سيكون الناتج
Code: [Select]
 striky@striky-desktop:~/workspace/pytut/src$ python xmlrpcclient1.py 
['bye', 'hi', 'say', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
Hi
Bye
Simone says: Something
Returns Simone says message



يوجد صف اخر وهو المفضل استخدامه DocXMLRPCServer وذلك للمساعدة فى عرض ال documentation ايضا



DocXMLRPCServer



مثل سابقه ولكن له بعض الطرق الإضافية مثل set_server_title لوضع العنوان و set_server_name لوضع اسمه فى اعلى الصفحة و set_server_documenation لوضع وثيقة خاصة به



Code: [Select]
 from DocXMLRPCServer import DocXMLRPCServer, DocXMLRPCRequestHandler 
from SocketServer import ThreadingMixIn

class Greeter(object):

    def hi(self):
        """Returns hi message"""
        return "Hi"

    def bye(self):
        """Returns bye message"""
        return "Bye"

    def say(self, what):
        """Returns Simone says message"""
        return "Simone says: "+ what

class MyServer(ThreadingMixIn, DocXMLRPCServer):

    pass

def test():
    addr=('', 40002)
    srvr=MyServer(addr, DocXMLRPCRequestHandler)
    ##server methods...
    srvr.set_server_title("My First DocXMLRPC Server")
    srvr.set_server_name("Greeter DocXMLRPC Server")
    srvr.set_server_documentation("Greeter DocXMLRPC Server is used for learning XML-RPC")
    srvr.register_instance(Greeter())
    srvr.register_introspection_functions()
    srvr.serve_forever()
    #print "Started..."

if __name__=="__main__":
    test()





تستطيع الإستفادة من هذا السرفر فى لغات اخرى مثل روبى مثلا
Code: [Select]
 ##Ruby 
striky@striky-desktop:~$ irb
irb(main):001:0> require "xmlrpc/client"
=> true
irb(main):002:0> require "pp"
=> true
irb(main):004:0> s=XMLRPC::Client.new2("http://localhost:40002")
=> #<XMLRPC::Client:0xb7aa2a50 @user=nil, @proxy_port=nil, @auth=nil, @cookie=nil, @create=nil, @port=40002, @http=#<Net::HTTP localhost:40002 open=false>, @proxy_host=nil, @http_last_response=nil, @parser=nil, @timeout=30, @path="/RPC2", @password=nil, @http_header_extra=nil, @use_ssl=false, @host="localhost">
irb(main):005:0> s
=> #<XMLRPC::Client:0xb7aa2a50 @user=nil, @proxy_port=nil, @auth=nil, @cookie=nil, @create=nil, @port=40002, @http=#<Net::HTTP localhost:40002 open=false>, @proxy_host=nil, @http_last_response=nil, @parser=nil, @timeout=30, @path="/RPC2", @password=nil, @http_header_extra=nil, @use_ssl=false, @host="localhost">
irb(main):006:0> s.call('hi')
=> "Hi"
irb(main):007:0> s.call('bye')
=> "Bye"
irb(main):008:0> s.call('say', "Hello, World!")
=> "Simone says: Hello, World!"



« Last Edit: January 11, 2009, 04:00:44 PM by Ahmed Youssef »
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/