2013-06-12 86 views
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)

我試圖通過navite方式和通過JSON來壓縮數組。這不是解決方案。

我知道問題是通過數組。有沒有人知道一種解決方法,或者一種將數組正確傳遞給適配器的方法?

+0

你嘗試傳遞一個字符串?例如:。'VAR arrRequests = [ '[' 「 '你好'」, ']']加入( '')'應該返回「 」[ '你好']「'。 – cnandreu

回答

1
returnedContentType : 'xml' 

無法從後端

解析有效載荷是XML格式返回的內容?如果沒有,你可以將returnedContentType字段換成'plain'或者'html'或者你期待它的格式嗎?

+0

已經嘗試過。沒有效果。 –

2

我知道問題是與數組傳遞。

你怎麼知道這個?

prolog中不允許有內容。

這幾乎總是將數據傳遞到一個XML解析器是無效的XML,或有序言之前的一些人物,這是一個徵兆:

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

在您的適配器,你告訴它希望來自您所調用的後端HTTP服務的XML。我能夠通過從後端HTTP服務返回無效的XML來重現您看到的相同消息。實際上,我可以在響應中放入任何無效的XML,並且我會得到「內容在prolog中不被允許」。信息。我可以返回一個404頁的頁面,或者帶有「text/plain」的Content-Type標頭。告訴適配器期望XML,但給了別的東西。

請務必檢查您沒有收到404頁面或500或您的適配器正在調用的後端HTTP服務中的其他內容。

以下是我轉載的消息 「的內容是不是在序言中不允許」 從我的適配器:

首先,創建一個適配器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-implement執行。 js:

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

    return WL.Server.invokeHttp(input); 
} 

我創建了node服務器(服務器。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 

然後創建工作燈應用程序的一個按鈕:

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

,並被鏈接點擊監聽器,看看有什麼我從工作燈找回適配器被調用時:

$ = 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負載,就此而言。

+0

1.我知道問題出在陣列上,因爲沒有它,適配器就可以工作。 2. XML有效。消息「的內容是不是在序言中不允許」似乎是由服務器的響應類型和預期之一,因爲一個錯誤的請求構建之間的不匹配造成的。 3.解決方案是使用SOAP。 –

+0

無論如何,感謝您的調查! –