another-soap
TypeScript icon, indicating that this package has built-in type declarations

0.0.6 • Public • Published

another-soap

another-soap is another soap package for node js.

Table of Contents

Getting started

Install

another-soap is installed like any other node module:

npm install another-soap -save

Initialize a service

Create a typesscript(.ts) file, and name it as example-service.ts. Then import package like below.

import {
  axiosConfig, axiosConfigForMethod, xmlns,
  envelope, param,
  NsType, SoapService
} from 'another-soap'

Create a class ExampleService, and inherit from SoapService.

class ExampleService extends SoapService {


}

Add namespaces, axios config for the class. For more information about axios, refer to axios. Axios config can be overridden by the definition on each method.

@envelope([
  { ns: "xmlns:soapenv", nsUrl: "http://schemas.xmlsoap.org/soap/envelope/", nsType: NsType.Namespace },
  { ns: "xmlns:xsd", nsUrl: "http://www.w3.org/2001/XMLSchema", nsType: NsType.XMLSchema },
  { ns: "xmlns:xsi", nsUrl: "http://www.w3.org/2001/XMLSchema-instance", nsType: NsType.XMLSchemaInstance }
])
@axiosConfig({
  url: "https://webservicesample.com/sample.svc",
  headers: { "soap-action": "value" }
})
class ExampleService extends SoapService {
}

Define Header section

If request XML contain a section of Header, we need to add a method setHeader inside the class ExampleService.

Let's see below code, RequestHeader is one of the parameters. We can add more paramters. Correspondingly we need to add param on for the method.

class ExampleService extends SoapService {

  /**
   * @param RequestHeader the one of parameters of header section
   */
  @param(
    0, "RequestHeader", [
    { ns: "soapenv:actor", nsUrl: "http://schemas.xmlsoap.org/soap/actor/next" },
    { ns: "soapenv:mustUnderstand", nsUrl: "0" },
    { ns: "xmlns:ns1", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }
  ])
  public setHeader(requestHeader: any) {
    return super.setHeader(requestHeader)
  }
}

The decorator of param contains three parameters.

/**
 * @param index the sequence of the paramters
 * @param name the name of the parameters, it will be compiled into request XML
 * @param nsList the xmlns definition
 */
declare function param(index: number, name: string, nsList?: Ixmlns[]): {
    (target: Function): void;
    (target: Object, propertyKey: string | symbol): void;
};

Add a request method

Add xmlns for the method. If there is no, we inherit namespaces from envelope.

Add axiosConfigForMethod for the method, we will combine axios config with which was defined on the class. Maybe the request headers, url or other other options of the method might be different. We just override it here.

Add param for the method. And it should be matched with actual paramters.

class ExampleService extends SoapService {

  /**
   * @param firstParam the first parameter
   * @param secondParam  the second parameter
   */
  @xmlns([{ ns: "xmlns", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }])
  @axiosConfigForMethod({ method: "GET" })
  @param(0, "firstParam", [
    { ns: "xmlns", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }
  ])
  @param(1, "secondParam")
  public GetAdUnitsByStatement(
    firstParam: any,
    secondParam: any
  ) {
    return super.request("GetAdUnitsByStatement", firstParam, secondParam)
  }
}

Consume the service

Create another typescript file example.ts. and import the created ExampleService

import ExampleService from "./example-service"

New a service newService, and call setHeader to setup a header section. If there is no header section. Just ignore it. If ignoring it. The compiled XML might be like </Header>

const newService = new ExampleService().setHeader({
  networkCode: "networkCode",
  applicationName: "applicationName"
})

Call the one of the method of the service. We can see the first parameter is an object. And the second parameter is empty string.

newService.GetAdUnitsByStatement({
  queries: [
    {
      id: "1",
      name: "san"
    }
  ],
  uuid: "uuid"
}, "").then(res => {
  console.log(res)
})

Example 1

example-service.ts

import {
  axiosConfig, axiosConfigForMethod, xmlns,
  envelope, param, NsType, SoapService
} from "another-soap"


@envelope([
  { ns: "xmlns:soapenv", nsUrl: "http://schemas.xmlsoap.org/soap/envelope/", nsType: NsType.Namespace },
  { ns: "xmlns:xsd", nsUrl: "http://www.w3.org/2001/XMLSchema", nsType: NsType.XMLSchema },
  { ns: "xmlns:xsi", nsUrl: "http://www.w3.org/2001/XMLSchema-instance", nsType: NsType.XMLSchemaInstance }
])
@axiosConfig({
  url: "https://webservicesample.com/sample.svc",
  headers: { "soap-action": "value" }
})
class ExampleService extends SoapService {

  /**
   * Set a Header
   * @param RequestHeader the one of parameters of header section
   */
  @param(
    0, "RequestHeader", [
    { ns: "soapenv:actor", nsUrl: "http://schemas.xmlsoap.org/soap/actor/next" },
    { ns: "soapenv:mustUnderstand", nsUrl: "0" },
    { ns: "xmlns:ns1", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }
  ])
  public setHeader(requestHeader: any) {
    return super.setHeader(requestHeader)
  }

  /**
   * 
   * @param firstParam the first parameter
   * @param secondParam  the second parameter
   */
  @xmlns([{ ns: "xmlns", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }])
  @axiosConfigForMethod({ method: "GET" })
  @param(0, "firstParam", [
    { ns: "xmlns", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }
  ])
  @param(1, "secondParam")
  public GetAdUnitsByStatement(
    firstParam: any,
    secondParam: any
  ) {
    return super.request("GetAdUnitsByStatement", firstParam, secondParam)
  }


  @xmlns([{ ns: "xmlns", nsUrl: "https://www.google.com/apis/ads/publisher/v202011", nsType: NsType.Namespace }])
  @axiosConfigForMethod({ method: "POST", url: "https://webservicesample.com/sample.svc/getAnother" })
  public GetAnother() {
    return super.request("GetAnother")
  }
}

export default ExampleService

example.ts

import ExampleService from "./example-service"

const newService = new ExampleService().setHeader({
  networkCode: "networkCode",
  applicationName: "applicationName"
})

newService.GetAdUnitsByStatement({
  queries: [
    {
      id: "1",
      name: "san"
    }
  ],
  uuid: "uuid"
}, "").then(res => {
  console.log(res)
})

newService.GetAnother().then(res => {
  console.log(res)
})

Example 2

weather-service.ts

import {
  axiosConfig, axiosConfigForMethod, envelope,
 xmlns, NsType, SoapService
} from "another-soap"

@envelope([
  { ns: "xmlns:soap", nsUrl: "http://schemas.xmlsoap.org/soap/envelope/", nsType: NsType.Namespace },
  { ns: "xmlns:xsd", nsUrl: "http://www.w3.org/2001/XMLSchema", nsType: NsType.XMLSchema },
  { ns: "xmlns:xsi", nsUrl: "http://www.w3.org/2001/XMLSchema-instance", nsType: NsType.XMLSchemaInstance }
])
@axiosConfig({
  headers: {
    "Host": "www.webxml.com.cn",
  },
  method: "POST"
})
class WeatherService extends SoapService {


  @axiosConfigForMethod({
    url: "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionCountry",
    headers: {
      "SOAPAction": "http://ws.webxml.com.cn/getRegionCountry",
    }
  })
  @xmlns([{ ns: "xmlns", nsUrl: "http://ws.webxml.com.cn/" }])
  public getRegionCountry() {
    return super.request("getRegionCountry")
  }


  @axiosConfigForMethod({
    url: "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx/getRegionDataset",
    headers: {
      "SOAPAction": "http://ws.webxml.com.cn/getRegionDataset",
    }
  })
  @xmlns([{ ns: "xmlns", nsUrl: "http://ws.webxml.com.cn/" }])
  public getRegionDataset() {
    return super.request("getRegionDataset")
  }

}

export default WeatherService

weather.ts

import WeatherService from "./weather-service"

const weatherService = new WeatherService()
weatherService.getRegionCountry().then(res => {
  console.log(res.data)
})


weatherService.getRegionDataset().then(res => {
  console.log(res.data)
})

Check the request XML

We can check the compiled xml after calling the method console.log(weatherService.requestXml)

MIT License

Copyright (c) 2020 Stony Chen

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Package Sidebar

Install

npm i another-soap

Weekly Downloads

0

Version

0.0.6

License

MIT

Unpacked Size

44.1 kB

Total Files

14

Last publish

Collaborators

  • stonychen