2013-06-04 54 views
0

我試圖在WSO2 AS 5.1.0中創建混搭。我成功地創建了一個簡單的HelloWorld服務,但是當我嘗試將其他服務集成到它中時,出現錯誤。使用具有參數的外部服務的WSO2混搭

這是我的HelloWorld服務:

this.documentation = "This is a test Hello World service"; 
system.include("HelloStub.js"); 

hello.documentation = "say hello" 
hello.inputTypes = {"user": "string"} 
hello.outputType = "string"; 
function hello(user){ 
    try{ 
     var response = services["admin/testmashup"].operations["sayMyName"](user); 
    }catch(e){ 
     return "Danger, Robinson! " + e.toString() 
    } 
    return "Hello, there! " + response; 
} 

function whoAreYou(){ 
    try{ 
     var response = services["admin/testmashup"].operations["toString"](); 
    }catch(e){ 
     return "Danger, Robinson! " + e.toString() 
    } 
    return "Hello! " + response;  
} 

這是admin/testmashup服務

this.serviceName = "testmashup"; 
this.documentation = "Test mashup service" ; 

toString.documentation = "say something" ; 
toString.inputTypes = { /* no arguments */ }; 
toString.outputType = "string"; 
function toString() 
{ 
    return "Hi, my name is testmashup"; 
} 

sayMyName.documentation = "Make me feel happy"; 
sayMyName.inputTypes = {"myName":"string"}; 
sayMyName.outputType = "string"; 
function sayMyName(myName){ 
    return "Your very beautiful name is " + myName; 
} 

我必須指出的是,當我致電admin/testmashup服務,它按預期工作。

文件HelloStub.js是由WSO2 Applicanton服務器生成的Javascript(E4X)存根控件。

當我測試操作whoAreYou,它沒有參數,我得到如下回應:

<ws:whoAreYouResponse xmlns:ws="http://services.mashup.wso2.org/helloWorld?xsd"> 
    <return xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:js="http://www.wso2.org/ns/jstype" js:type="string" xsi:type="xs:string">Hello! &lt;ws:toStringResponse xmlns:ws="http://services.mashup.wso2.org/testmashup?xsd"&gt;&lt;return&gt;Hi, my name is testmashup&lt;/return&gt;&lt;/ws:toStringResponse&gt;</return> 
</ws:whoAreYouResponse> 

我可以看到編碼的響應中的文本Hi, my name is testmashup。但是,當我嘗試調用hello,與下面的XML:

<body> 
    <p:hello xmlns:p="http://services.mashup.wso2.org/helloWorld?xsd"> 
     <!--Exactly 1 occurrence--> 
     <user>John</user> 
    </p:hello> 
</body> 

我收到以下錯誤:

<ws:helloResponse xmlns:ws="http://services.mashup.wso2.org/helloWorld?xsd"> 
    <return>Danger, Robinson! org.wso2.carbon.CarbonException: Invalid input for the payload in WSRequest Hostobject : John</return> 
</ws:helloResponse> 

我試圖讓這項工作的最後幾天,已經找遍了所有在這個地方尋找答案,但我似乎無法找到答案。 official documentation未提供使用具有一個或多個參數的操作的外部Web服務的存根的示例。

另外,如果可能的話,我想知道如何從JavaScript混搭中使用REST-JSON服務。

任何想法?

回答

0

事實證明,在官方文檔中缺少一大串重要的信息。特別是,重新提到我的問題,瞭解內部生成的存根使用BagderFish表示法來執行XML和JSON之間的轉換非常重要。我走進存根,潛了一下,foud這一段代碼,就到我的sayMyName方法:

service.operations['sayMyName'] = function (request) { 
    var isAsync, response, resultValue; 
    var operation = service.operations['sayMyName']; 
    request = typeof request === "string" ? request : utils.bf2xml(request); 
    service.$._options = new Array(); 
    . 
    . 
    . 

功能bf2xml在BadgerFish符號轉換JSON爲XML。該函數稍後在存根中定義,並且也可以找到here。有關BadgerFish記譜法的信息也廣泛可用。

爲了使HelloWorld服務正常工作,您可以傳遞一個帶有XML的字符串(在這種情況下,不會調用bf2xml函數),也可以傳遞帶有正確表示法的JSON對象,即BadgerFish。

這將工作:

var response = services["admin/testmashup"].operations["sayMyName"]({request : {myName:{$:user}}}); 
+0

而且這是我第二次回答我的問題......如果不是第二個問題我張貼,也不會怪在所有... – chechopeefe

相關問題