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 = <mytag> myJSVar </mytag>
,而不是var request = "<mytag>" + myJSVar + "</mytag>";
;
有关示例,请参见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