什么是xmlrpc调用的部分

时间:2012-12-09 09:00:07

标签: python xmlrpclib

让我们按照以下代码定义一个简单的xmlrpc服务器:

from SimpleXMLRPCServer import SimpleXMLRPCServer

def add(x,y):
    return x+y

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, 'addthem')
server.register_function(add, 'add.numbers')
server.register_function(add, 'sum.two.numbers')
server.serve_forever()

您可以通过

连接
import xmlrpclib
dev = xmlrpclib.ServerProxy("http://localhost:8000/RPC2")

使用dev对象,您可以在服务器中访问(为简单起见相同)函数add,例如

print dev.addthem(1,2)
print dev.add.numbers(1,2)
print dev.sum.two.numbers(1,2)

我的问题:这些电话有哪些部分?什么是dev(我想是xmlrpclib.ServerProxy的一个实例),sum中的dev.sum是什么(一个函数?一个可调用的?一个类?一个实例?)。 two中的dev.sum.two是什么......

例如,以下语法

print dev.add

导致错误

xmlrpclib.Fault: <Fault 1: '<type \'exceptions.Exception\'>:method "add.__str__" is not supported'>

不应该总是打印一些东西吗?什么是 dev.add和其他部分?

2 个答案:

答案 0 :(得分:1)

为了“记录”请求,您可以(例如)在您的客户端中实现自定义传输。

来自doc(改编):

import xmlrpclib, httplib, gzip

class LogTransport(xmlrpclib.Transport):
    def send_request(self, connection, handler, request_body):
        # log here.
        print handler, request_body
        if (self.accept_gzip_encoding and gzip):
            connection.putrequest("POST", handler, skip_accept_encoding=True)
            connection.putheader("Accept-Encoding", "gzip")
        else:
            connection.putrequest("POST", handler)

p = LogTransport()
server = xmlrpclib.Server('http://time.xmlrpc.com/RPC2', transport=p)
print server.currentTime.getCurrentTime()

输出:

/RPC2 <?xml version='1.0'?>
<methodCall>
<methodName>currentTime.getCurrentTime</methodName>
<params>
</params>
</methodCall>

和服务器错误(因为它不存在)

答案 1 :(得分:0)

在这种情况下,sum.two.numbers只是在服务器上调用的函数。在这一行server.register_function(add, 'sum.two.numbers')上,您将该方法设置为映射到带有2个参数的add函数。您的所有服务器可用方法都映射为当前添加。 dev.add只是告诉客户端在服务器上运行方法add。因为您没有将add映射到服务器上的实际函数,所以不能使用它并且会抛出错误。

查看this example,其中包含自定义SimpleXMLRPCRequestHandler,您可以在其中对其进行自定义以添加日志记录。

如果您仍然遇到日志记录问题,请查看此内容:XML-RPC server logging