Как я могу настроить ответ и запрос xmlrpc в python

Вот мой код Python сервера xmlrpc. Я хочу изменить ответ.

from SimpleXMLRPCServer import SimpleXMLRPCServer
import logger
import db_connect

# Set up logging
logger.Logger(name="rpc", address="rpc.log")

server = SimpleXMLRPCServer(('0.0.0.0', 4242), logRequests=True)

# Expose a function
def get_status(extension):
  status=db_connect.get_status(extension)
  logger.logger().info(" extension number  %s Found %s 
   ",extension,status )
    return status

  server.register_function(get_status)

try:
   print ('Use Control-C to exit')
   server.serve_forever()
except KeyboardInterrupt:
   print ('Exiting')

Сервер Xml rpc возвращает следующий ответ клиенту.

<?xml version='1.0'?>
<methodResponse>
  <params>
    <param>
    <value><boolean>0</boolean></value>
    </param>
  </params>
</methodResponse>

Можно ли вернуть индивидуальный ответ, как показано ниже?

<?xml version='1.0'?>
<Status>
<Extension>605</Extension>
<Bite_Status>Operational Fault</Bite_Status>
<Iridium_Channels_Available>0</Iridium_Channels_Available>
<DND_State>Disabled</DND_State>
<DND_Override>Disabled</DND_Override>
<Mute_State>Disabled</Mute_State>
</Status>

Также хотите изменить код состояния ответа заголовка http.


person sharif779    schedule 07.08.2018    source источник


Ответы (1)


Если вы хотите вернуть несколько потенциально вложенных элементов с вашего сервера xmlrpc, ваша функция должна возвращать словарь:

def status(ext):
    status = { 
        'Extension': 605,
        'Bite_Status': 'Operational Fault',
        'Iridium_Channels_Available': 0,
        'DND_State': 'Disabled',
        'DND_Override': 'Disabled',
        'Mute_State': 'Disabled'
    }
    return status

server.register_function(status)

Это вернет xml ниже; это более подробно, чем ваш пример, поскольку он должен соответствовать спецификации xmlrpc. Если вы используете ServerProxy стандартной библиотеки как ваш клиент xml будет преобразован в словарь, такой же, как и созданный функцией сервера.

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><struct>
<member>
<name>Extension</name>
<value><int>605</int></value>
</member>
<member>
<name>Bite_Status</name>
<value><string>Operational Fault</string></value>
</member>
<member>
<name>Iridium_Channels_Available</name>
<value><int>0</int></value>
</member>
<member>
<name>DND_State</name>
<value><string>Disabled</string></value>
</member>
<member>
<name>DND_Override</name>
<value><string>Disabled</string></value>
</member>
<member>
<name>Mute_State</name>
<value><string>Disabled</string></value>
</member>
</struct></value>
</param>
</params>
</methodResponse>

Код состояния жестко запрограммирован на сервере. реализации, поэтому его нельзя изменить, если вы не напишете свой собственный сервер. Также обратите внимание, что спецификация xlmrpc требует код возврата 200 для успешных ответов.

person snakecharmerb    schedule 08.08.2018
comment
Спасибо за ваш ответ. Я нашел решение, создав новый экземпляр обработчика запросов xmlrpc.server.SimpleXMLRPCRequestHandler. - person sharif779; 08.08.2018