Worklight - SOAP 适配器无法解析 <soapenv:Envelope> 请求

Posted

技术标签:

【中文标题】Worklight - SOAP 适配器无法解析 <soapenv:Envelope> 请求【英文标题】:Worklight - SOAP adapter unable to parse <soapenv:Envelope> request 【发布时间】:2013-03-04 11:00:57 【问题描述】:

我正在尝试创建一个使用 soapenv:Envelope 请求的 SOAP 适配器。但是当我调用适配器时,eclipse会产生以下错误- “错误”:[ “Ecma 错误:TypeError: Cannot read property \"Body\" from undefined (C%3A%5Cdevelopment%5Cmywork%5CWorklight%5CWorklightApp lications%5Cadapters%5CSOAPAdapter/SOAPAdapter-impl.js#40)" ], “信息”:[ ], “成功”:假, “警告”:[ ]

这似乎是一个 SAXParser 问题,因此我搜索了它并从 IBM 开发人员论坛 (http://www.ibm.com/developerworks/forums/thread.jspa?threadID=454988) 获得了解决方案 - 在 eclipse.ini 中的 -vmargs 行之后,添加这个 行,然后重新启动 Eclipse: -Dorg.xml.sax.driver=com.sun.org.apache.xerces.internal.parsers.SAXParser

我这样做了,但仍然遇到同样的错误。这是我的 SOAP 请求 -

 "<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"+ 
  "xmlns:xsd="http://www.w3.org/2001/XMLSchema"+ 
  "xmlns:soapenv="http://schemas.xmlsoap.org"+
  "/soap/envelope/" xmlns:soap="http://soap.amazon.com">"+
  "<soapenv:Header/>"+
  "<soapenv:Body>"+
   "<soap:ActorSearchRequest soapenv:encodingStyle="http://schemas.xmlsoap.org"+
      "/soap/encoding/">"+
      "<ActorSearchRequest xsi:type="soap:ActorRequest" xs:type="type:ActorRequest"+ 
         "xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">"+
         "<actor xsi:type="xsd:string" xs:type="type:string">abc</actor>"+
         "<page xsi:type="xsd:string" xs:type="type:string">1</page>"+
         "<mode xsi:type="xsd:string" xs:type="type:string">a</mode>"+
         "<tag xsi:type="xsd:string" xs:type="type:string">a</tag>"+
         "<type xsi:type="xsd:string" xs:type="type:string">a</type>"+
         "<devtag xsi:type="xsd:string" xs:type="type:string">a</devtag>"+            
      "</ActorSearchRequest>"+
      "</soap:ActorSearchRequest>"+
     "</soapenv:Body>"+
    "</soapenv:Envelope>";

更新功能 -

function temperatureConvertor(celsiusTemp) 
    var request = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.amazon.com">'+
           '<soapenv:Header/>'+
           '<soapenv:Body>'+
              '<soap:ActorSearchRequest soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'+
                 '<ActorSearchRequest xsi:type="soap:ActorRequest" xs:type="type:ActorRequest" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">'+
                    '<actor xsi:type="xsd:string" xs:type="type:string">abc</actor>'+
                    '<page xsi:type="xsd:string" xs:type="type:string">1</page>'+
                    '<mode xsi:type="xsd:string" xs:type="type:string">a</mode>'+
                    '<tag xsi:type="xsd:string" xs:type="type:string">a</tag>'+
                    '<type xsi:type="xsd:string" xs:type="type:string">a</type>'+
                    '<devtag xsi:type="xsd:string" xs:type="type:string">a</devtag>'+            
                 '</ActorSearchRequest>'+
              '</soap:ActorSearchRequest>'+
           '</soapenv:Body>'+
        '</soapenv:Envelope>';              
    var input = 
        method : 'post',
        returnedContentType : 'plain',
        path : '/schemas2/AmazonWebServices.wsdl',
        body: 
            content: request.toString(),
            contentType: 'text/xml; charset=utf-8'
        
    ;              
    var result = WL.Server.invokeHttp(input);               
    return result.Envelope.Body;

更新了adapter.xml

            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <wl:adapter xmlns:wl="http://www.worklight.com/integration" xmlns:http="http://www.worklight.com/integration/http" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="SOAPAdapter">

            <displayName>SOAPAdapter</displayName>
            <description>SOAPAdapter</description>
            <connectivity>
                <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
                    <protocol>http</protocol>
                    <domain>soap.amazon.com</domain>
                    <port></port>           
                </connectionPolicy>
                <loadConstraints maxConcurrentConnectionsPerNode="2"/>
            </connectivity>

            <procedure name="temperatureConvertor"/>

        </wl:adapter>

【问题讨论】:

【参考方案1】:

不应将 SOAP 请求创建为字符串,而应将其创建为 XML 文字 (E4X)。

意思是,你应该做var request = &lt;mytag&gt; myJSVar &lt;/mytag&gt;,而不是var request = "&lt;mytag&gt;" + myJSVar + "&lt;/mytag&gt;";

有关示例,请参见Using HTTP adapters with SOAP Services 中的幻灯片 5 和 6

【讨论】:

非常感谢 Aviram 的快速响应,但问题不在于引号。我已经将字符串格式用于一个简单的肥皂请求——soap:Envelop,它工作正常。这里的问题在于soapenv 元素。一些它没有被正确解析。 您在属性中使用了双引号而没有对其进行转义,我相信创建的字符串不是您所期望的。要么尝试我的建议,要么逃避那些引用。此外,记录您创建的字符串,看看它是否符合您的要求。

以上是关于Worklight - SOAP 适配器无法解析 <soapenv:Envelope> 请求的主要内容,如果未能解决你的问题,请参考以下文章

Soap Adpter 问题:无法从未定义读取属性“Body”:WORKLIGHT

IBM MobileFirst/Worklight JSON

无法从 Worklight HTTP Adapter 访问在 TLS1.2 上配置的 WebService

Worklight 适配器找不到证书链

IBM Worklight:无法在 Worklight Console 中上载适配器

无法通过 Android 设备中的 Worklight http 适配器连接到后端