首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用node-soap服务器返回XML?

如何使用node-soap服务器返回XML?
EN

Stack Overflow用户
提问于 2020-07-21 04:18:19
回答 2查看 580关注 0票数 0

我正在用NodeJS制作一个包含API REST和SOAP方法(Im使用https://www.npmjs.com/package/soap)的Express服务。使用API REST我没有任何问题,但是对于SOAP我有一个不方便的地方,当我尝试使用来自测试C#应用程序的SOAP方法时,我可以看到参数运行良好,但是在响应中,我在C#中有下一个错误(响应不是正确的XML代码)

当我通过node-soap从NodeJS客户端使用该方法时,响应也可以正常工作。

我的NodeJS代码的一部分:

代码语言:javascript
复制
const express = require('express');
const bodyParser = require('body-parser');
const soap = require('soap');
const fs = require('fs');

const xml = fs.readFileSync('src/templates/ws_soap.wsdl', 'utf8');

const app = express();

app.use(bodyParser.urlencoded({
  extended: false
}));

app.use(bodyParser.json());

const soap_service = {
  integrations: {
    pull: {
      getSnapshotGIGA: function(args) {
        return {
          res: "HOLA"
        };
      },
    }
  }
};

app.listen(port, ip, function() {

  soap.listen(app, '/integrations_service', soap_service, xml, function() {
    console.log('SOAP web service started on ' + ip + ':' + port);
  });

  console.log('API REST started on ' + ip + ':' + port);
});

我的WSDL文件是next (作为响应,我有一个string类型,因为我想看看它是如何运行的,但我需要返回一个对象XML):

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="integrations_service" targetNamespace="http://localhost:4205/integrations_service" xmlns="http://localhost:4205/integrations_service" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <wsdl:message name="getSnapshotGIGARequest">
    <wsdl:part name="User" type="xs:string"/>
    <wsdl:part name="Password" type="xs:string"/>
  </wsdl:message>
  <wsdl:message name="getSnapshotGIGAResponse">
    <wsdl:part name="res" type="xs:string"/>
  </wsdl:message>
  <wsdl:portType name="pull_integrations">
    <wsdl:operation name="getSnapshotGIGA">
      <wsdl:input message="getSnapshotGIGARequest"/>
      <wsdl:output message="getSnapshotGIGAResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="pull_integrations_binding" type="pull_integrations">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getSnapshotGIGA">
      <soap:operation soapAction="getSnapshotGIGA"/>
      <wsdl:input>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="integrations">
    <wsdl:port binding="pull_integrations_binding" name="pull">
      <soap:address location="http://localhost:4205/integrations_service"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

在C#中,我有一个控制台应用程序,并且我已经将SOAP服务注册为web引用。

我使用SOAP方法的方式是(当我使用C#制作SOAP服务时,我也是通过这种方式测试方法的,因为这是客户端的工作方式):

代码语言:javascript
复制
Console.WriteLine("Consume NodeJS SOAP service");
Thread.Sleep(500);
integrations_service.integrations integrations = new integrations_service.integrations();
integrations.Url = "http://localhost:4205/integrations_service?wsdl";
var some_response = integrations.getSnapshotGIGA("myuser", "123456");
Console.WriteLine("Press enter to out...");

我想要在XmlNode中获得响应,如本例所示:

代码语言:javascript
复制
Console.WriteLine("Consume C# SOAP service");
Thread.Sleep(500);
serviceSOAP sSOAP = new serviceSOAP ();
sSOAP.Url = "http://my.domain.com.mx/";
XmlNode xmlNode = sSOAP .anyMethodSoap("yomero", "123456");
Console.WriteLine(XElement.Parse(xmlNode.OuterXml).ToString());
Thread.Sleep(500);

如果您知道如何从NodeJS返回XML,并在C#或任何想法中正确获取它,我将不胜感激。雷加兹。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-26 13:14:29

回答我的问题时,问题出在WSDL配置上。通过这个配置,我让它与C# web reference一起工作。主要的问题是样式,我将其从"rpc“改为"document”,并为响应正确配置了元素。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
  name="devices_service"
  targetNamespace="http://localhost:4205/devices_service"
  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
  xmlns:s="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns="http://localhost:4205/devices_service">
  <wsdl:types>
    <xs:schema targetNamespace="http://localhost:4205/devices_service" xmlns="http://localhost:4205/devices_service" attributeFormDefault="qualified" elementFormDefault="qualified">
      <xs:element name="GetDevicesRequest">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="User" type="xs:string"/>
            <xs:element minOccurs="0" maxOccurs="1" name="Password" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="GetDevicesResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:any/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </wsdl:types>
  <wsdl:message name="GetDevicesSoapIn">
    <wsdl:part name="parameters" element="GetDevicesRequest"/>
  </wsdl:message>
  <wsdl:message name="GetDevicesSoapOut">
    <wsdl:part name="parameters" element="GetDevicesResponse"/>
  </wsdl:message>
  <wsdl:portType name="user_devices">
    <wsdl:operation name="GetDevices">
      <wsdl:input message="GetDevicesSoapIn"/>
      <wsdl:output message="GetDevicesSoapOut"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="user_devices_binding" type="user_devices">
    <s:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
    <wsdl:operation name="GetDevices">
      <s:operation soapAction="http://localhost:4205/devices_services/GetDevices"/>
      <wsdl:input>
        <s:body use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:input>
      <wsdl:output>
        <s:body use="literal" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="devices">
    <wsdl:port binding="user_devices_binding" name="user">
      <s:address location="http://localhost:4205/devices_service"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>**
票数 0
EN

Stack Overflow用户

发布于 2020-07-26 13:16:27

您可能想要使用以下选项之一:

node-soap强soap(重写node-soap) easysoap

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63003195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档