如何在python中发送xml-rpc请求?

时间:2010-02-11 03:59:09

标签: python xml-rpc

我只是想知道,我怎样才能在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 个答案:

答案 0 :(得分:12)

这是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的内容,即查看原始XML请求等,请在文档中查找xmlrpclib.Transport类。

答案 1 :(得分:3)

我已将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())

答案 2 :(得分:0)

“四处走动”是什么意思? xmlrpclib 在python中编写XML-RPC客户端的正常方法。只要查看the sources(或将它们复制到您自己的模块并添加print语句! - ),如果您想了解事情的详细信息。

相关问题