使用Worklight 6.2.0.0。
我试图通过Worklight的HTTP适配器使用我们的企业Web服务。我有Web服务的WSDL,我使用了#34;发现后端服务"用于生成适配器JavaScript和XML的工具。
Web服务有2个输入参数和3个输出参数,所有字符串。
当我来调用客户端的程序时,我这样做:
var invocationData = {
adapter : 'messageHandlerAdapter',
procedure : 'messageHandlerService_messageHandler',
parameters : ['a','b']
};
var invocationOptions = {
onSuccess : messageHandlerSuccess,
onFailure : messageHandlerFailure
};
WL.Client.invokeProcedure(invocationData,invocationOptions);
您可以在invocationData数组中看到虚拟参数。运行此会导致以下错误:
java.lang.String无法强制转换为org.mozilla.javascript.Scriptable
如果删除参数,我就不会收到错误,并且网络服务电话似乎成功,但我没有得到任何回复(显然)。
在论坛上搜索引导我:
http://stackoverflow.com/questions/23192346/class-cast-java-lang-string-cannot-be-cast-to-org-mozilla-javascript-scriptable 这是相同的,响应是某处可能存在无效的JSON对象。但是,我所做的就是使用自动生成的适配器代码并调用它。
我对Worklight很新,所以感谢任何建议!
WSDL:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="messageHandler" targetNamespace="urn:messageHandler" xmlns:tns="urn:messageHandler" xmlns:S2="urn:messageHandler:messageHandler" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:S1="urn:soap-fault:details" xmlns="http://schemas.xmlsoap.org/wsdl/">
<wsdl:documentation>EncodingType=DOC_LITERAL, WSA_Product=10.1A - N/A</wsdl:documentation>
<wsdl:types>
<schema elementFormDefault="unqualified" targetNamespace="urn:soap-fault:details" xmlns="http://www.w3.org/2001/XMLSchema"><element name="FaultDetail"><complexType><sequence><element name="errorMessage" type="xsd:string"/><element name="requestID" type="xsd:string"/></sequence></complexType></element></schema>
<schema elementFormDefault="qualified" targetNamespace="urn:messageHandler:messageHandler" xmlns="http://www.w3.org/2001/XMLSchema"><element name="messageHandler"><complexType><sequence><element name="ipMessageParams" nillable="true" type="xsd:string"/><element name="ipMessageData" nillable="true" type="xsd:string"/></sequence></complexType></element><element name="messageHandlerResponse"><complexType><sequence><element name="result" nillable="true" type="xsd:string"/><element name="opMessageResponse" nillable="true" type="xsd:string"/><element name="opMessageData" nillable="true" type="xsd:string"/></sequence></complexType></element></schema>
</wsdl:types>
<wsdl:message name="messageHandler_messageHandlerResponse">
<wsdl:part name="parameters" element="S2:messageHandlerResponse"/>
</wsdl:message>
<wsdl:message name="FaultDetailMessage">
<wsdl:part name="FaultDetail" element="S1:FaultDetail"/>
</wsdl:message>
<wsdl:message name="messageHandler_messageHandler">
<wsdl:part name="parameters" element="S2:messageHandler"/>
</wsdl:message>
<wsdl:portType name="messageHandlerObj">
<wsdl:operation name="messageHandler">
<wsdl:input message="tns:messageHandler_messageHandler"/>
<wsdl:output message="tns:messageHandler_messageHandlerResponse"/>
<wsdl:fault name="messageHandlerFault" message="tns:FaultDetailMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="messageHandlerObj" type="tns:messageHandlerObj">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="messageHandler">
<soap:operation soapAction="" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="messageHandlerFault">
<soap:fault name="messageHandlerFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="messageHandlerService">
<wsdl:port name="messageHandlerObj" binding="tns:messageHandlerObj">
<documentation></documentation>
<soap:address location="redacted"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
这是Project Explorer中服务描述图片的链接。
答案 0 :(得分:2)
通常我们将XML传递给基于SOAP的Web服务。在使用worklight的情况下,我们必须将XML转换为JSON并将其传递给适配器。考虑您的输入SOAP就像
<a>
<b>value1</b>
<c>value2</c>
</a>
您的上述XML的JSON将是
params= {
a:{
b:value1,
c:value2
}
}
所以你必须将JSON作为参数传递给上面
headers={
"SOAPAction": "YOUR ACTION NAME"
}
所以你的适配器调用看起来像这样,
var invocationData = {
adapter : 'messageHandlerAdapter',
procedure : 'messageHandlerService_messageHandler',
parameters : [params,headers]
};
var invocationOptions = {
onSuccess : messageHandlerSuccess,
onFailure : messageHandlerFailure
};
WL.Client.invokeProcedure(invocationData,invocationOptions);
答案 1 :(得分:0)
您目前在项目的“服务”文件夹下有一项服务 在 Project Explorer 视图中右键单击您的服务,它应该显示一个要传递给 messageHandlerService_messageHandler 过程的示例参数:
您可以复制此示例JSON并通过粘贴样本值并将其设置为所需的值来调用适配器过程:
如果您还需要传递自定义HTTP标头,则应在参数JSON之后添加逗号,并使用自定义标头添加另一个JSON字符串。