Как отправить запрос xml-rpc в python? - PullRequest
6 голосов
/ 11 февраля 2010

Мне было просто интересно, как я смогу отправить запрос 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 ]

12 голосов
/ 11 февраля 2010

Вот простой 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 в документации.

3 голосов
/ 16 июня 2016

Я сократил исходный код в 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())
0 голосов
/ 11 февраля 2010

Что вы подразумеваете под "обойти"? xmlrpclib - это нормальный способ написания XML-RPC-клиента на python. Просто посмотрите на источники (или скопируйте их в свой собственный модуль и добавьте print операторов! -), если вы хотите узнать подробности того, как все делается.

...