如何在 Worklight 服务器适配器上执行 XMLHttpRequest?

Posted

技术标签:

【中文标题】如何在 Worklight 服务器适配器上执行 XMLHttpRequest?【英文标题】:How to perform a XMLHttpRequest on a Worklight Server Adapter? 【发布时间】:2014-06-05 21:33:07 【问题描述】:

这是我的适配器代码

var fetchCommand = WL.Server.createSQLStatement("select * from basis_customers WHERE ID = ?");
function fetchData(param) 
      var xmlhttp = new XMLHttpRequest();
      xmlhttp.open('POST', 'http://ectest556ws1:9081/teamworks/webservices/POCODM/MobilityWS.tws', true);
      // build SOAP request
      var sr = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mob="http://POCODM/MobilityWS.tws">'+
'<soapenv:Header/>'+
'<soapenv:Body>'+
'<mob:startProcess>'+
   '<mob:nombre>1111</mob:nombre>'+
   '<mob:cedula>2222</mob:cedula>'+
'</mob:startProcess>'+
'</soapenv:Body>'+
'</soapenv:Envelope>' ;

      xmlhttp.onreadystatechange = function () 
          if (xmlhttp.readyState == 4) 
              jq(xmlhttp.responseText).find("startProcessResponse").each(function () 
                var el = jq(this);
                alert(el.find("outputMessage").text());
              );
          
      ;

      // Send the POST request
      xmlhttp.setRequestHeader('Content-Type', 'text/xml');
      xmlhttp.send(sr);
    return WL.Server.invokeSQLStatement(
        preparedStatement : fetchCommand,
        parameters : [param]
    );

我的 SOAP WS 工作正常,但我不明白如何在我的 Worklight 适配器上调用 XMLHttpRequest 实例。但是当我调用它时,我得到了这个错误:

Procedure invocation error. Ecma Error: ReferenceError: "XMLHttpRequest" is not defined. (C%3A%5CUsers%5Csasahoo%5Cworkspace%5Cback%5Cadapters%5CPerson/Person-impl.js#33) worklight.js:4556
WL.Logger.__log worklight.js:4556
PUBLIC_API.(anonymous function) worklight.js:4643
onInvokeProcedureSuccess worklight.js:7112
window.WLJSX.Ajax.WLRequest.WLJSX.Class.create.onSuccess worklight.js:3225
window.WLJSX.Ajax.WLRequest.WLJSX.Class.create.onWlSuccess worklight.js:3197
(anonymous function) worklight.js:947
window.WLJSX.Ajax.Request.WLJSX.Class.create.respondToReadyState worklight.js:1156
window.WLJSX.Ajax.Request.WLJSX.Class.create.onStateChange worklight.js:1094
(anonymous function)

【问题讨论】:

【参考方案1】:

您正尝试在 Worklight Adapater 环境中使用浏览器样式的代码,而您需要使用 WL.Server 功能。

您将需要两个适配器:一个 SQL 适配器和一个 HTTP 适配器。您可以从一个呼叫另一个

 SQLAdapter ---> HttpAdapter ---SOAP Reuqest---->  Your service

首先让 Http 适配器运行。创建一个 HTTP 适配器,在其 XML 文件中指定您的域和端口,即 ectest556ws1 和 9081。在适配器实现文件 .js 中,使用

    var input = 
    method : 'get',
    returnedContentType : 'xml',
    path : "teamworks/webservices/POCODM/MobilityWS.tws",

;


return WL.Server.invokeHttp(input);

请注意,这是一个同步调用,您不使用回调方法。您可以使用 Studio 中的 invokeProcedure 功能对此进行测试。

然后在您的数据库适配器中,您可以调用 HTTP 适配器:

  var invocationData = 
        adapter : "myHttpAdapter",
        procedure : "myCallSoapMethod",
        parameters : [ may, be, some, parameters ]
    ;

var soapResult =  WL.Server.invokeProcedure(invocationData);

【讨论】:

以上是关于如何在 Worklight 服务器适配器上执行 XMLHttpRequest?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Worklight 6.2 中链接来自移动客户端的适配器调用?

如何调试 IBM Worklight 适配器

在 Worklight 适配器上获取客户端 IP 地址

如何通过 Web Worker 中的 Worklight 适配器调用 Web 服务

Worklight 适配器性能

Worklight - 使用 URL 从非 Worklight 应用程序调用推送通知适配器