python - 如何在 python 中自定义 xmlrpc 响应和请求
问题描述
这是我的 xmlrpc 服务器 python 代码。我想更改响应。
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 标头响应状态代码。
解决方案
如果要从 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 才能成功响应。
推荐阅读
- reactjs - 通过 Provider React 传递对象
- html - 基于复选框的角度禁用输入
- angular - 将捕获的视频上传到服务器
- mysql - Presto SQL 中的 IN 谓词有多昂贵?当子查询产生非常大的结果集时,Presto 是否会在后台进行任何优化?
- pine-script - 如何制作和指标仅在 4 小时时间范围内显示?
- mysql - 继续添加外键
- azure - azure ml - 如何从存储帐户中的文件共享注册训练数据集(表格)
- html - 如何垂直对齐图像和文本?
- json - 未处理的异常:FormatException:在颤振中使用 json.decode 时出现意外字符
- python - 条形图的注释