如何在Python中发送XML-RPC请求?

7 投票
3 回答
26351 浏览
提问于 2025-04-15 19:08

我在想,我该怎么用Python发送一个xml-rpc请求呢?我知道可以用xmlrpclib这个库,但我该怎么发送一个xml格式的请求来调用某个函数呢?

我想看看xml格式的响应。

简单来说,我想把下面的内容作为请求发送给服务器:

<?xml version="1.0"?>
<methodCall>
  <methodName>print</methodName>
  <params>
    <param>
        <value><string>Hello World!</string></value>
    </param>
  </params>
</methodCall>

然后获取响应。

3 个回答

1

你说的“get around”是什么意思?xmlrpclib 是在Python中写XML-RPC客户端的标准方法。如果你想了解具体是怎么做的,可以看看源代码(或者把它复制到你自己的模块里,加上print语句来调试!)。

5

我把 xmlrpc.client 的源代码简化到了发送 XML RPC 请求所需的最基本部分(因为我想尝试移植这个功能)。它会返回响应的 XML。

服务器:

from xmlrpc.server import SimpleXMLRPCServer

def is_even(n):
    return n%2 == 0

server = SimpleXMLRPCServer(("localhost", 8000))
print("Listening on port 8000...")
server.register_function(is_even, "is_even")
server.serve_forever() 

客户端:

import http.client

request_body = b"<?xml version='1.0'?>\n<methodCall>\n<methodName>is_even</methodName>\n<params>\n<param>\n<value><int>2</int></value>\n</param>\n</params>\n</methodCall>\n"

connection = http.client.HTTPConnection('localhost:8000')
connection.putrequest('POST', '/')
connection.putheader('Content-Type', 'text/xml')
connection.putheader('User-Agent', 'Python-xmlrpc/3.5')
connection.putheader("Content-Length", str(len(request_body)))
connection.endheaders(request_body)

print(connection.getresponse().read())
13

这是一个用Python写的简单XML-RPC客户端:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.myfunction(2, 4)

它可以和这个服务器一起工作:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)

def myfunction(x, y):
    status = 1
    result = [5, 6, [4, 5]]
    return (status, result)
server.register_function(myfunction)

# Run the server's main loop
server.serve_forever()

如果你想深入了解xmlrpclib的内部 workings,比如查看原始的XML请求等等,可以查阅文档中的xmlrpclib.Transport类。

撰写回答