SOAP

This handler allows you to consume SOAP WSDL files and generate a remote executable schema for those services.

How to use?

To get started, install the handler library:

npm i @omnigraph/soap

Then you can import the library in your configuration file, and define your SOAP source;

mesh.config.ts
import { defineConfig } from '@graphql-mesh/compose-cli'
import { loadSOAPSubgraph } from '@omnigraph/soap'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadSOAPSubgraph('CountryInfo', {
        source:
          'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL'
      })
    }
  ]
})

Headers

If you want to add SOAP headers to the request body like below;

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:header="http://foo.com/">
   <soap:Header>
      <header:MyHeader>
         <header:UserName>user</header:UserName>
         <header:Password>password</header:Password>
      </header:MyHeader>
   </soap:Header>

You can add the headers to the configuration like below;

mesh.config.ts
import { defineConfig } from '@graphql-mesh/compose-cli'
import { loadSOAPSubgraph } from '@omnigraph/soap'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadSOAPSubgraph('CountryInfo', {
        source:
          'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL',
        soapHeaders: {
          // The name of the alias to be used in the envelope for header components
          alias: 'header',
          namespace: 'http://foo.com',
          headers: {
            MyHeader: {
              UserName: 'user',
              Password: 'password'
              // You can also use environment variables, so it will get the value on runtime
              Password: '{env.SOAP_PASSWORD}'
            }
          }
        }
      })
    }
  ]
})

Custom Body Alias

You can now choose the name of the alias you want to use for SOAP body;

mesh.config.ts
import { defineConfig } from '@graphql-mesh/compose-cli'
import { loadSOAPSubgraph } from '@omnigraph/soap'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadSOAPSubgraph('CountryInfo', {
        source:
          'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL',
        bodyAlias: 'my-body'
      })
    }
  ]
})

Then it will generate a body like below by using the alias;

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:my-body="http://foo.com/">
   <soap:Body>
      <my-body:Foo>
          <my-body:Bar>baz</my-body:Bar>
      </my-body:Foo>
   </soap:Body>
</soap:Envelope>