代码部分:
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来强化数组。这不是解决方案。
我知道问题在于传递的数组。有没有人知道解决方法,或者正确地将数组传递给适配器的方法?
答案 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'或你期望的格式吗?