我正在尝试在wso2as 5.1.0中创建mashup。我已经成功地创建了一个简单的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
是一个Javascript (E4X)存根,由WSO2 Applicanton Server生成。
当我测试没有参数的操作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! <ws:toStringResponse xmlns:ws="http://services.mashup.wso2.org/testmashup?xsd"><return>Hi, my name is testmashup</return></ws:toStringResponse></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 mashup中消费REST-JSON服务。
任何想法?
原来在官方文档中遗漏了一堆重要的信息。特别是,关于我的问题,重要的是要知道,在内部生成的存根使用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}}});