我目前正在使用AppleScript编辑器。 我在那里运行以下代码:
tell application "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL"
call soap {method name:"CelsiusToFahrenheit", method namespace uri:"http://www.w3schools.com/webservices/", parameters:{Celsius:50 as string}, SOAPAction:"http://www.w3schools.com/webservices/CelsiusToFahrenheit"}
end tell
如果我执行上面的代码,我会收到一个“错误”字符串(这不是我的预期)。 生成的请求如下:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:CelsiusToFahrenheit xmlns:m="http://www.w3schools.com/webservices/">
<Celsius xsi:type="xsd:int">50</Celsius>
</m:CelsiusToFahrenheit>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如果我像这样编辑请求(我使用Fiddler来编辑请求):
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<CelsiusToFahrenheit xmlns="http://www.w3schools.com/webservices/">
<Celsius xsi:type="xsd:int">50</Celsius>
</CelsiusToFahrenheit>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我收到“122”,这是正确的答案。
我的问题是:
答案 0 :(得分:3)
瘦子:
call soap
功能中的错误忽略了命名空间标记正确调用的参数:方法 name 元素的前缀是m:
,但参数元素不是。
解决方法是使用m:
明确地为参数名称添加前缀;在上面的示例中,使用|m:Celsius|
而不是Celsius
- 请注意,需要包含|
个符号,因此您可以使用这样的名称,否则会破坏解析。
警告:如果Apple修复了这个错误,这个解决方法有可能会中断。
将解决方法应用于上面的示例为我们提供了:
tell application "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL"
call soap {method name:"CelsiusToFahrenheit", ¬
method namespace uri:"http://www.w3schools.com/webservices/", ¬
parameters:{|m:Celsius|:50 as string}, ¬
SOAPAction:"http://www.w3schools.com/webservices/CelsiusToFahrenheit"}
end tell
- (...)“call soap”函数使用的SOAP格式是旧格式吗?
醇>
缺点:AppleScript使用SOAP 1.1 架构,虽然引擎盖下的API也支持SOAP 1.2,但您无法从 AppleScript 中选择它((您只能这样做from C using Carbon))
如上所述,SOAP XML构造有一个错误,这就是调用不起作用的原因。 (http://www.w3schools.com/webservices/tempconvert.asmx的网络服务支持1.1,以及1.2)。
以下是有关call soap
和call xml-rpc
功能的重要性和维护状态的一些线索:
documentation separate from the AppleScript Language Guide中描述了这些功能,即使它们似乎是语言本身的一部分(在任何外部词典中找不到它们)
该文档是在2001年编写的(从OSX 10.1开始;并且在2005年只看到了一个小小的修订版;增加了可能过时的Web服务URL的警告:)。
“2。有没有办法解决这个问题(例如,在请求中删除“:m”或“m:”,或者通过在“call soap”方法中设置参数,通过代码使用不同的SOAP格式?
(参见上面的解决方法。)
基于文档状态线索,我不会屏住呼吸来更新或修复Apple - 这很遗憾,因为这些功能看起来非常方便。