【问题标题】:Error when using Parameters in Worklight HTTP Adapter在 Worklight HTTP 适配器中使用参数时出错
【发布时间】:2014-06-30 13:08:07
【问题描述】:

使用 Worklight 6.2.0.0。

我正在尝试通过 Worklight 的 HTTP 适配器使用我们的公司 Web 服务之一。我有 Web 服务的 WSDL,我使用“发现后端服务”工具生成适配器 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

如果我删除参数,我不会收到错误消息,并且 Web 服务调用似乎是成功的,但我没有得到任何响应(显然)。

我在论坛上搜索了一下:

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

【问题讨论】:

  • 你能提供 WSDL 吗?
  • 这是一个企业网络服务,所以它有点敏感。我会发布,但会掩盖位置。
  • 您是否尝试过使用适配器?
  • 我已经扩展了服务定义。它只是 2 个字符串输入参数。 HTTP 适配器似乎希望参数在 invocationData 对象中是 JSON 格式的,所以我认为我做对了吗?
  • 是否有一种简单的方法可以在出站 SOAP 消息被传输之前查看它?

标签: ibm-mobilefirst worklight-adapters


【解决方案1】:

通常我们将 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);

【讨论】:

  • 如果是这种情况(如适配器参数作为JSON对象传递),我们如何使用Invoke Worklight Procedure来测试对webservice的调用并查看响应?跨度>
  • 优秀。我用它来获得我需要的 JSON 结构,现在一切正常。我还使用 SoapUI 来确保 SOAP 数据尽可能接近 WSDL 规范。
【解决方案2】:

您目前在项目的“服务”文件夹下有一项服务。
Project Explorer 视图中右键单击您的服务,它应该会显示一个要传递给 messageHandlerService_messageHandler 过程的示例参数:

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

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

【讨论】:

  • 嗯,这太棒了。但是我在服务属性窗口中没有“示例过程参数”区域。其他方面看起来一样,但这个区域完全没有。
  • 请确保您使用的是最新的 Worklight Studio v6.2,因为这是在此版本中引入的。
  • 难以置信!我很确定我已经安装了 6.2,但我有 6.1。呸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多