【问题标题】:Soap server using node js使用节点 js 的肥皂服务器
【发布时间】:2018-04-12 17:07:06
【问题描述】:

我正在尝试使用节点 js 创建一个肥皂服务。似乎最常见的做法是使用这个库:https://www.npmjs.com/package/soap

他们有这个sn-p:

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 链接?

谢谢

【问题讨论】:

    标签: node.js soap node-soap


    【解决方案1】:

    是的,您需要自己创建 WSDL 文件。我相信任何可用的 npm SOAP 模块都需要这个。有多种工具可以帮助您生成 WSDL,但最简单的方法之一是从简单的 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(),这非常有用,并且会返回一个显示服务器支持的所有方法的对象。

    【讨论】:

    • 我可以让soap服务器运行,wsdl位置可以访问。 client.describe() 也获取了响应。但是,当我使用客户端代码时,我总是得到一个 statusCode: 404,以及一个带有 unicode 字符的正文。不知道出了什么问题!任何帮助将不胜感激。
    • 是在创建客户端还是调用客户端函数时出现这种情况?谢谢!
    • 我犯的错误是为 WSDL 设置了错误的位置。准确地说,我错过了更新
      标记的“位置”属性。把它指向我的就行了。感谢您的关注!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多