0

让我们定义一个简单的 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),什么是sumdev.sum一个函数?一个可调用的?一个类?一个实例?)。two里面有什么dev.sum.two...

例如,以下语法

print dev.add

导致错误

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

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

4

2 回答 2

1

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

文档(改编):

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>

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

于 2012-12-09T09:29:48.100 回答
0

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

查看包含自定义SimpleXMLRPCRequestHandler的示例,您可以在其中自定义它以添加日志记录。

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

于 2012-12-09T09:48:10.250 回答