ノードjsでSOAPサービスを作成しようとしています。これを行うのに最も一般的なのは、このlibを使用することのようです: https://www.npmjs.com/package/soap
彼らはこのスニペットを持っています:
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);
});
私の質問はです。このファイルmyservice.wsdlを手動で生成し、後で構造体MyServiceにリンクする必要がありますか?
ありがとう
はい、WSDLファイルを自分で作成する必要があります。利用可能なnpm SOAPモジュールのいずれかがこれを必要とすると思います。WSDLの生成に役立つさまざまなツールがありますが、最も簡単な方法の1つは、単純なWSDLファイルから始めることです。上記のコードのように、MyFunction呼び出しに対応するファイル:
<definitions name = "MyService"
targetNamespace = "http://www.examples.com/wsdl/MyService.wsdl"
xmlns = "http://schemas.xmlsoap.org/wsdl/"
xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns = "http://www.examples.com/wsdl/MyService.wsdl"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<message name = "MyFunctionRequest">
<part name = "testParam" type = "xsd:string"/>
</message>
<message name = "MyFunctionResponse">
<part name = "status" type = "xsd:string"/>
</message>
<portType name = "MyPort">
<operation name = "MyFunction">
<input message = "tns:MyFunctionRequest"/>
<output message = "tns:MyFunctionResponse"/>
</operation>
</portType>
<binding name = "MyFunction_Binding" type = "tns:MyPort">
<soap:binding style = "rpc"
transport = "http://schemas.xmlsoap.org/soap/http"/>
<operation name = "MyFunction">
<soap:operation soapAction = "MyFunction"/>
<input>
<soap:body encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/" namespace = "urn:examples:MyService" use = "encoded"/>
</input>
<output>
<soap:body encodingStyle = "http://schemas.xmlsoap.org/soap/encoding/" namespace = "urn:examples:MyService" use = "encoded"/>
</output>
</operation>
</binding>
<service name = "MyService">
<documentation>WSDL File for MyService</documentation>
<port binding = "tns:MyFunction_Binding" name = "MyPort">
<soap:address
location = "http://www.examples.com/MyFunction/" />
</port>
</service>
</definitions>
次のようなクライアントコードを使用して呼び出します。
var soap = require('soap');
var url = 'http://localhost/wsdl?wsdl';
var args = {name: 'value'};
soap.createClient(url, function(err, client) {
client.MyFunction(args, function(err, result) {
console.log(result);
});
});
Client.describe()も見てください。これは非常に便利で、サーバーがサポートするすべてのメソッドを示すオブジェクトを返します。