如何使AppleScript SOAP与现有的SOAP Web服务一起工作(例如W3Schools的Celsius To Fahrenheit示例)?

时间:2014-03-10 09:34:36

标签: macos web-services soap applescript

我目前正在使用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>
  1. 将“m:CelsiusToFarenheit”更改为“CelsiusToFarenheit”
  2. 将“xmlns:m”更改为“xmlns”
  3. 我收到“122”,这是正确的答案。

    我的问题是:

    1. 为什么会这样? “call soap”函数使用的SOAP格式是旧格式吗?
    2. 有没有办法解决这个问题(例如在请求中删除“:m”或“m:”,或者通过在“call soap”方法中设置参数来通过代码使用不同的SOAP格式[我不知道是否这是可能的])?

1 个答案:

答案 0 :(得分:3)

瘦子:

  • call soap功能中的错误忽略了命名空间标记正确调用的参数:方法 name 元素的前缀是m:,但参数元素不是。

  • 解决方法是使用m: 明确地为参数名称添加前缀;在上面的示例中,使用|m:Celsius|而不是Celsius - 请注意,需要包含|个符号,因此您可以使用这样的名称,否则会破坏解析。

    < / LI>

警告:如果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

背景

  
      
  1. (...)“call soap”函数使用的SOAP格式是旧格式吗?
  2.   

缺点: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 soapcall xml-rpc功能的重要性和维护状态的一些线索:

  • documentation separate from the AppleScript Language Guide中描述了这些功能,即使它们似乎是语言本身的一部分(在任何外部词典中找不到它们)

  • 该文档是在2001年编写的(从OSX 10.1开始;并且在2005年只看到了一个小小的修订版;增加了可能过时的Web服务URL的警告:)。

  

“2。有没有办法解决这个问题(例如,在请求中删除“:m”或“m:”,或者通过在“call soap”方法中设置参数,通过代码使用不同的SOAP格式?

(参见上面的解决方法。)

基于文档状态线索,我不会屏住呼吸来更新或修复Apple - 这很遗憾,因为这些功能看起来非常方便。