javascript - 如何编辑node-soap中的响应字段

标签 javascript node.js soap wsdl node-soap

我有以下 WSDL 定义:

<definitions targetNamespace="http://app.com/app" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:app="http://app.com/app" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   
   <message name="SoapQuery">
      <part name="TransType" type="xsd:string" />
   </message>

   <message name="SoapQueryResult">
      <part name="ResponseCode" type="xsd:string"/>
      <part name="ResultDesc" type="xsd:string" />
   </message>

   <portType name="SoapQuery_PortType">
      <operation name="SoapQuery">
         <input message="SoapQuery" />
         <output message="SoapQueryResult" />
      </operation>
   </portType>

   <binding name="SoapQuery_Binding" type="SoapQuery_PortType">
      <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
      <operation name="SoapQuery" style="document">
         <soap:operation soapAction="SoapQuery" />
         <soap:input>
            <soap:body namespace="app" use="literal" />
         </soap:input>

         <soap:output>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal" />
         </soap:output>
      </operation>
   </binding>

   <service name="SoapQueryService">
      <documentation>WSDL File for SoapQueryService</documentation>
      <port binding="SoapQuery_Binding" name="SoapQuery_Port">
         <soap:address location="http://localhost:8002/api/request" />
      </port>
   </service>
</definitions>

以及以下处理程序定义:

var SoapQueryService = {
  SoapQueryService: {
    SoapQuery_Port: {
      // This is how to define an asynchronous function.
      SoapQuery: function (args, callback) {
        // do some work
        callback({
          'ResultCode': 0,
          'ResultDesc': "sdfds",
        });
      }
    }
  }
};

目前,当收到以下请求时:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <app:SoapQuery xmlns:app="http://app.com/app">
            <TransType>11124</TransType>
        </app:SoapQuery>
    </soapenv:Body>
</soapenv:Envelope>

它返回:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:app="http://app.com/app">
  <soap:Body>
    <app:SoapQueryResponse>
      <app:ResultCode>0</app:ResultCode>
      <app:ResultDesc>sdfds</app:ResultDesc>
    </app:SoapQueryResponse>
  </soap:Body>
</soap:Envelope>

但我希望响应看起来像:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:app="http://app.com/app">
  <soap:Body>
    <app:SoapQueryResult> <!-- not - SoapQueryResponse -->
      <ResultCode>0</ResultCode>  <!-- notice there is no `app:` -->
      <ResultDesc>sdfds</ResultDesc> <!-- notice there is no `app:` -->
    </app:SoapQueryResult>
  </soap:Body>
</soap:Envelope>

我尝试了不同的方法,但似乎都没有对响应类型产生影响。我觉得我在 WSDL 或处理程序中遗漏了一些东西..

最佳答案

省略RPC标记您的 WSDL 定义并将其更改为

<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />

因为您正在使用 RPC作为样式,它添加了 app:到输出消息和部件,忽略您的 outputName并将其替换为 SoapQueryResponse以及。删除RPC标签会给你这个输出

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:app="http://app.com/app">
  <soap:Body>
    <SoapQueryResult> <!-- notice there is no `app:` -->
      <ResultCode>0</ResultCode>  
      <ResultDesc>sdfds</ResultDesc>
    </SoapQueryResult>
  </soap:Body>
</soap:Envelope>

默认node-soap将删除所有 targetNamespace消息和消息部分的前缀(如果未风格化)RPC 。我创建了一个拉取请求 here这将允许用户添加可选的 targetNamespace仅在输出消息上添加前缀,而不是在输出部分上添加前缀。因此,根据建议的拉取请求,您需要添加 targetNamespace给您留言

 <message name="SoapQueryResult" targetNamespace="app">
      <part name="ResponseCode" type="xsd:string"/>
      <part name="ResultDesc" type="xsd:string" />
 </message>

你会得到你想要的输出

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:app="http://app.com/app">
  <soap:Body>
    <app:SoapQueryResult>
      <ResultCode>0</ResultCode>
      <ResultDesc>sdfds</ResultDesc>
    </app:SoapQueryResult>
  </soap:Body>
</soap:Envelope>

关于javascript - 如何编辑node-soap中的响应字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70453937/

相关文章:

javascript - polymer 0.5.5 : conditional template and/or template dynamic reference inside core-list

javascript - Performance & "Better Practice": with statement vs. 带一堆参数的函数

javascript - 无法让 phonegap device.platform 工作

node.js - 返回前更新 mongoose 文档

web-services - 如何使用 GroovyWS 生成 WSDL

javascript - 在 React 中渲染组件 onClick

javascript - 无法在 Mac OS Catalina 上安装 npm 包 (fsevents)

javascript - 在 Node.js 中的变量中插入 ASCII

c# - SOAP和证书授权

java - JAX-WS 和 Joda-Time?