我知道问题出在传递的数组上。
你怎么会知道这事?
序言中不能有内容。
这几乎总是将数据传递给 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);
}
我创建了一个节点服务器(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;
});
当我的后端服务器在序言前面返回带有额外字符的有效负载时,我可以准确地重新创建问题(您可以通过编辑上面的 server.js 代码自行尝试),例如:
somethinghere<?xml version="1.0" encoding="utf-8"?>
或任何非 XML 有效负载,就此而言。