0

我正在尝试在 WSO2 AS 5.1.0 中创建混搭。我已经成功地创建了一个简单的 HelloWorld 服务,但是当我尝试将其他服务集成到其中时,我得到了一个错误。

这是我的 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 申请者服务器生成的 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>

在过去的几天里,我试图完成这项工作,并在整个地方搜索了一个答案,但我似乎找不到它。官方文档没有提供使用具有一个或多个参数的操作的外部 Web 服务存根的示例。

另外,如果可能的话,我想知道如何从 javascript 混搭中使用 REST-JSON 服务。

有任何想法吗?

4

1 回答 1

0

事实证明,官方文档中缺少大量重要信息。特别是,考虑到我的问题,重要的是要知道在内部生成的存根使用 BagderFish 表示法来执行 XML 和 JSON 之间的转换。我进入存根并深入研究并找到了这段代码,关于我的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。该函数稍后在存根中定义,也可以在此处找到。有关 BadgerFish 符号的信息也广泛可用。

为了使HelloWorld服务正常工作,您可以传递带有 XML 的字符串(在这种情况下,bf2xml不会调用该函数),或带有正确符号的 JSON 对象,即 BadgerFish。

这将起作用:

var response = services["admin/testmashup"].operations["sayMyName"]({request : {myName:{$:user}}});
于 2013-06-05T05:42:18.700 回答