0

代码部分:

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);
}

响应: 过程调用错误。序言中不允许内容。,无法从后端解析有效负载(过程:HttpRequest)

我试图通过导航方式和 JSON 对数组进行 strignify。这不是解决方案。

我知道问题出在传递的数组上。有人知道一种解决方法,或者一种将数组正确传递给适配器的方法吗?

4

2 回答 2

2

我知道问题出在传递的数组上。

你怎么会知道这事?

序言中不能有内容。

这几乎总是将数据传递给 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 有效负载,就此而言。

于 2013-06-13T04:28:36.473 回答
1
returnedContentType : 'xml'

无法从后端解析有效负载

返回的内容是xml格式吗?如果没有,您可以将返回的ContentType 字段更改为“plain”或“html”或您期望的任何格式吗?

于 2013-06-12T15:30:02.457 回答