在Worklight中的适配器的“参数”内传递数组

时间:2013-06-12 11:45:25

标签: adapter invoke ibm-mobilefirst

代码部分:

function PushRequests(strUser, eClientType, iSectorId, strDeviceId, arrRequests) {

    var input = {
        method : 'post',
        returnedContentType : 'xml',
        path : 'SomeAddress/PushRequests',
        parameters : {
            'strUser' : strUser.toString(),
            'eClientType' : eClientType.toString(),
            'iSectorId' : iSectorId.toString(),
            'strDeviceId' : strDeviceId.toString(),
            'arrRequests' : arrRequests // <- the array
        }
    };

    return WL.Server.invokeHttp(input);
}

回复: 过程调用错误。 prolog中不允许使用内容。无法从后端解析有效负载(过程:HttpRequest)

我试图通过导航方式和JSON来强化数组。这不是解决方案。

我知道问题在于传递的数组。有没有人知道解决方法,或者正确地将数组传递给适配器的方法?

2 个答案:

答案 0 :(得分:2)

  

我知道问题在于传递了数组。

你怎么知道这个?

  

prolog中不允许使用内容。

这几乎总是将数据传递给无效XML的XML解析器,或者在prolog之前有一些字符的症状,这是:

<?xml version="1.0" encoding="utf-8"?>

在您的适配器中,您已经告诉它希望来自您正在调用的后端HTTP服务的XML。通过从后端HTTP服务返回无效的XML,我能够重现您看到的相同消息。事实上,我可以在响应中放入任何无效的XML,我会得到“prolog中不允许使用内容”。信息。我可以返回一个404页面的页面,或者返回Content-Type标题为“text / plain”的页面。适配器被告知期望XML,但给出了别的东西。

请务必检查您的适配器正在调用的后端HTTP服务中是否收到404页,或500或其他内容。

以下是我从适配器转载“prolog中不允许内容”消息的方式:

首先,使用xmltester.xml:

创建一个适配器
<wl:adapter name="xmltester"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:wl="http://www.worklight.com/integration"
xmlns:http="http://www.worklight.com/integration/http">

<displayName>xmltester</displayName>
<description>xmltester</description>
<connectivity>
    <connectionPolicy xsi:type="http:HTTPConnectionPolicyType">
        <protocol>http</protocol>
        <domain>localhost</domain>
        <port>3000</port>   
    </connectionPolicy>
    <loadConstraints maxConcurrentConnectionsPerNode="2" />
</connectivity>

<procedure name="getStuff"/>

</wl:adapter>

和xmltester-impl.js:

function getStuff() {
var input = {
        method : 'get',
        returnedContentType : 'xml',
        path : 'index.xml',
        parameters : {
            'arrRequests' : JSON.stringify(['one', 'two'])
        }
    };

    return WL.Server.invokeHttp(input);
}

我创建了一个node服务器(server.js)作为我的后端:

var express = require('express');
var app = express();
var port = 3000;

app.get('/index.xml', function(req, res){
  var body = '<?xml version="1.0" encoding="utf-8"?><boo/>';
  res.setHeader('Content-Type', 'application/xml');
  res.setHeader('Content-Length', body.length);
  res.end(body);
});

app.listen(port);
console.log('Listening on port %s', port);

启动服务器:

npm install express
node server.js

然后使用按钮创建了一个Worklight应用程序:

<button id="doit">Do it!</button>

并链接了一个单击侦听器,以便在调用适配器时查看从Worklight返回的内容:

$ = WLJQ;
$("#doit").click(function() {
    var invocationData = {
        adapter : 'xmltester',
        procedure : 'getStuff',
        parameters : []
    };
    WL.Client.invokeProcedure(invocationData,{
        onSuccess : function(data) {alert("SUCCESS" + JSON.stringify(data));},
        onFailure : function(data) {alert("FAILURE" + JSON.stringify(data));}
    });
    return false;
});

当我的后端服务器在prolog前面返回带有额外字符的有效负载时(我可以通过编辑上面的server.js代码来尝试自己),我可以准确地重新创建问题,如:

somethinghere<?xml version="1.0" encoding="utf-8"?>

或者任何非XML有效负载。

答案 1 :(得分:1)

returnedContentType : 'xml'
  

无法从后端解析有效负载

返回的内容是否为xml格式?如果没有,你可以将returnedContentType字段伪装成'plain'或'html'或你期望的格式吗?