版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/coderALEX/article/details/84866496
Key words:SoapUI mock SOAP service
最近一个任务有一个环节是用Perl发送SOAP协议包到服务端并收到服务端的确认回复
现在的情况:
- Perl作为client从Linux虚拟机发送Request到本地
- 在本地启用一个Node.js脚本作为服务器返回Response
- service由一个WSDL文件定义
实现:
- Perl使用了SOAP::Lite包发送soap
- Node.js 使用node-soap包
Node.js的实现类似下面
var myService = {
MyService: {
MyPort: {
MyFunction: function(args) {
return {
name: args.name
};
},
// This is how to define an asynchronous function.
MyAsyncFunction: function(args, callback) {
// do some work
callback({
name: args.name
});
},
// This is how to receive incoming headers
HeadersAwareFunction: function(args, cb, headers) {
return {
name: headers.Token
};
},
// You can also inspect the original `req`
reallyDetailedFunction: function(args, cb, headers, req) {
console.log('SOAP `reallyDetailedFunction` request from ' + req.connection.remoteAddress);
return {
name: headers.Token
};
}
}
}
};
var xml = require('fs').readFileSync('myservice.wsdl', 'utf8');
//http server example
var server = http.createServer(function(request,response) {
response.end('404: Not Found: ' + request.url);
});
server.listen(8000);
soap.listen(server, '/wsdl', myService, xml);
//express server example
var app = express();
//body parser middleware are supported (optional)
app.use(bodyParser.raw({type: function(){return true;}, limit: '5mb'}));
app.listen(8001, function(){
//Note: /wsdl route will be handled by soap module
//and all other routes & middleware will continue to work
soap.listen(app, '/wsdl', myService, xml);
});
问题:
WSDL的定义中,SOAP所传输的数据(即body中的内容)使用base64加密,导致Node.js的Response中内容为空,我认为应该是该框架没有将base64解密后解析为对象的功能。我找了很久也没有找到相关信息,尽管我知道通过纯JavaScript应该可以实现我想要的结果,可是那样的话效率太低了。
于是我想看看有没有其他的库可以直接用,结果发现SoapUI这个神器竟然可以模拟server(它称之为mockServcie,所以直接搜索soap server很难搜到他,可见搜索信息的时候关键词的重要性),要是早点知道的话很多时候不管是client还是server的测试,完全不需要自己写。