Как отправить запрос xml-rpc в python?
мне просто интересно, как я смогу отправить xml-rpc
запрос в python? Я знаю, что вы можете использовать xmlrpclib
, но как отправить запрос в xml
для доступа к функции?
Я хотел бы увидеть xml
ответ.
поэтому в основном я хотел бы отправить следующий запрос на сервер:
<?xml version="1.0"?>
<methodCall>
<methodName>print</methodName>
<params>
<param>
<value><string>Hello World!</string></value>
</param>
</params>
</methodCall>
и получить ответ
3 ответов
вот простой клиент XML-RPC в Python:
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
класс в документации.
я сократил исходный код в файла xmlrpc.клиент до минимума, необходимого для отправки запроса 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())