- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个设备,可以定期向我计算机中运行的 HTTP 服务器发送 SOAP 通知。通知如下所示:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<Notify>
<DeviceNotification message= "
<NotificationEvent NotificationType="Location">
<ComputerLocation changedOn="1369757031051">
</ComputerLocation>
</NotificationEvent>
"/>
</Notify>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
它是一个 SOAP 信封,其中包含 DeviceNotification 类型实例的 XML 表示形式。
我真的不知道如何处理这些通知(好像我的程序是服务器?客户端?)。该通知看起来更像是对命令的响应,但实际上我没有调用任何远程服务(发送通知的计算机有一个 Web 界面,我在其中输入“通知的目的地:此 IP、此端口”,然后它开始发送它们)我也不确定通知中的 SOAP 是否完全正确。
我已经尝试了几个 SOAP 库等等...我认为我能够实现的最接近的事情是使用 spyne (或者也许只是一个海市蜃楼,我认为这是因为它比其他库输出更多的东西)
class DeviceNotification(ComplexModel):
___namespace__ = ""
pass
class HelloWorldService(ServiceBase):
@rpc(DeviceNotification, _returns=Iterable(Unicode))
def Notify(message):
logging.warn("CHECKPOINT")
print "message: %s" % message
return ["foobarbaz"]
if __name__=='__main__':
from wsgiref.simple_server import make_server
PORT=7171
application = Application([HelloWorldService],
tns="",
in_protocol=HttpRpc(validator='soft'),
out_protocol=JsonDocument()
)
wsgi_application = WsgiApplication(application)
server = make_server('', PORT, wsgi_application)
server.serve_forever()
但是Notify函数永远不会被调用。我得到:
192.168.1.33 - - [28/May/2013 21:16:52] "POST / HTTP/1.1" 404 130
DEBUG:spyne.server.wsgi:Method name: '{}'
DEBUG:spyne.protocol.http: header : {'soapaction': ['Notify'], 'host': ['niuyorker.jome:7171'], 'user_agent': ['Jakarta Commons-HttpClient/3.1']
这是我得到的最接近的东西。该 SOAP 消息正确吗?如果是,是否应将其视为对服务器(我的服务器)的请求或响应(因此,我的应用程序将是客户端)。如果有人知道在哪里可以找到比添加两个数字或多次说“Hello”更复杂的 Python 和 SOAP 示例,这也会有所帮助?
我想我总是可以使用 lxml解析整个 SOAP 消息,但如果可能的话,我想做得更“专业”一点。以防万一您没有注意到:我是 SOAP 服务的新手! :)
提前谢谢您!
更新:
看起来消息部分实际上应该是转义的 XML,这......好吧......这就是我从一开始实际上得到的,但是(因为我是新手)我转义了它,所以它在问题中看起来更漂亮。真实情况是:
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:body>
<notify>
<notification message='<NotificationEvent NotificationType="Location"><DeviceLocation changedOn="1369074622065"></DeviceLocation></NotificationEvent>'>
</notification>
</notify>
</soap-env:body>
</soap-env:envelope>
我有 WSDL。使用suds我已经能够创建“ComputerLocation”类型的实例,例如:
>>> from suds.client import Client
>>> url="file:///tmp/service.wsdl"
>>> c=Client(url)
>>> c.factory.create('DeviceLocation')
(DeviceLocation){
_changedOn = ""
}
但这几乎就是我能做的一切。
说实话,我还是不知道我需要服务器还是客户端......
最佳答案
您使用的是 in_protocol=HttpRpc
而不是 in_protocol=Soap11
。
HttpRpc
protocol简单地定义为:
The so-called ReST-ish HttpRpc protocol implementation.
虽然还不完全清楚这意味着什么,但可以肯定的是,它不会尝试解析 SOAP 1.1 消息来查找命令,因为这与 REST-ish 相差并不远。有可能。
<小时/>已经克服了这一点,并给出了您更新的(正确的)示例:
它被解析为有效的 XML,并且位于有效的 SOAP 1.1 信封中。
但它仍然不是好的 SOAP。正文的内容没有命名空间,也不是带有参数的结构化对象。事实上,整个内容是一个通用 XML 树,而实际内容是另一个通用 XML 树,它以转义形式存储为外部树中节点的属性。
从您的一个示例来看,我猜测 URL 路径始终为 /
,并且 SOAP 结构始终只是直接位于 SOAP 信封。当然,如果您与框架的斗争足够多,您可能可以让它在 Notify
上分派(dispatch),但无论如何您的所有消息最终都会出现在同一个地方,所以......为什么还要麻烦呢?您可能想要分派(dispatch)的内容(如果有的话)是嵌入 XML 内的内容,例如 NotificationType
。
如果这些猜测是正确的,请使用您知道如何使用的最熟悉的 Web 服务器 — 您甚至不需要 WSGI;您可以使用 WSGI。如果需要,只需为 http.server.HTTPServer
编写一个简单的处理程序,并将每条消息路由到相同的代码,该代码执行足够的解析以获取 NotificationEvent
对象,并且从那里 dispatch 。像这样的事情:
from xml.etree import ElementTree as ET
def handle_location(nevent):
clocation = nevent.find('ComputerLocation')
changed_on = clocation.attrib['changedOn']
location = clocation.text
# do something with this info
def handle_other_thing(nevent):
# whatever
handlers = {'Location': handle_location,
'OtherThing': handle_other_thing }
et = ET.fromstring(body)
for notification in et.iter('notification'):
message = ET.fromstring(notification.attrib['message'])
for nevent in message.iter('NotificationEvent'):
ntype = nevent.attrib['NotificationType']
handlers[ntype](nevent)
听起来您可能拥有 NotificationEvent
中最低级别字段的 WSDL,因此您可以使用 suds
来代替手动解析 etree。那个级别,如果它使您的生活更轻松或使您的代码更灵活。
当然,您需要添加一些错误处理。
关于python - 解析 SOAP 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16802366/
我一直在使用 AJAX 从我正在创建的网络服务中解析 JSON 数组时遇到问题。我的前端是一个简单的 ajax 和 jquery 组合,用于显示从我正在创建的网络服务返回的结果。 尽管知道我的数据库查
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我在尝试运行 Android 应用程序时遇到问题并收到以下错误 java.lang.NoClassDefFoundError: com.parse.Parse 当我尝试运行该应用时。 最佳答案 在这
有什么办法可以防止etree在解析HTML内容时解析HTML实体吗? html = etree.HTML('&') html.find('.//body').text 这给了我 '&' 但我想
我有一个有点疯狂的例子,但对于那些 JavaScript 函数作用域专家来说,它看起来是一个很好的练习: (function (global) { // our module number one
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我需要编写一个脚本来获取链接并解析链接页面的 HTML 以提取标题和其他一些数据,例如可能是简短的描述,就像您链接到 Facebook 上的内容一样。 当用户向站点添加链接时将调用它,因此在客户端启动
在 VS Code 中本地开发时,包解析为 C:/Users//AppData/Local/Microsoft/TypeScript/3.5/node_modules/@types//index而不是
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我在将 json 从 php 解析为 javascript 时遇到问题 这是我的示例代码: //function MethodAjax = function (wsFile, param) {
我被赋予了将一种语言“翻译”成另一种语言的工作。对于使用正则表达式的简单逐行方法来说,源代码过于灵活(复杂)。我在哪里可以了解更多关于词法分析和解析器的信息? 最佳答案 如果你想对这个主题产生“情绪化
您好,我在解析此文本时遇到问题 { { { {[system1];1;1;0.612509325}; {[system2];1;
我正在为 adobe after effects 在 extendscript 中编写一些代码,最终变成了 javascript。 我有一个数组,我想只搜索单词“assemble”并返回整个 jc3_
我有这段代码: $(document).ready(function() { // }); 问题:FB_RequireFeatures block 外部的代码先于其内部的代码执行。因此 who
背景: netcore项目中有些服务是在通过中间件来通信的,比如orleans组件。它里面服务和客户端会指定网关和端口,我们只需要开放客户端给外界,服务端关闭端口。相当于去掉host,这样省掉了些
1.首先贴上我试验成功的代码 复制代码 代码如下: protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 X
【PHP代码】 复制代码 代码如下: $stmt = mssql_init('P__Global_Test', $conn) or die("initialize sto
在SQL查询分析器执行以下代码就可以了。 复制代码代码如下: declare @t varchar(255),@c varchar(255) declare table_cursor curs
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习🤭 题目 题目一: 二维数组中的
我是一名优秀的程序员,十分优秀!