在Worklight HTTP Adapter中使用参数时出错

时间:2014-06-30 13:08:08

标签: ibm-mobilefirst worklight-adapters

使用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中服务描述图片的链接。

enter image description here

2 个答案:

答案 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 过程的示例参数:

enter image description here

您可以复制此示例JSON并通过粘贴样本值并将其设置为所需的值来调用适配器过程:

enter image description here

如果您还需要传递自定义HTTP标头,则应在参数JSON之后添加逗号,并使用自定义标头添加另一个JSON字符串。