Web Services 如何在NestJS中使用SOAP服务?

zpgglvta  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(260)

我必须为我的一个项目使用NestJs中的SOAP服务。我正在尝试使用来自Web的虚拟SOAP服务。以下是详细信息-
网址-

http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL

方法- POST
标题-

Content-Type: text/xml

请求正文-

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <CapitalCity xmlns="http://www.oorsprong.org/websamples.countryinfo">
            <sCountryISOCode>IN</sCountryISOCode>
        </CapitalCity>
    </Body>
</Envelope>

响应正文-

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <m:CapitalCityResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo">
            <m:CapitalCityResult>New Delhi</m:CapitalCityResult>
        </m:CapitalCityResponse>
    </soap:Body>
</soap:Envelope>

现在我还不知道如何在我的NestJs虚拟应用程序中使用这个服务。

npm install nestjs-soap --save

我的应用模块

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SoapModule } from 'nestjs-soap';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true
    }),
    SoapModule.registerAsync([
      { name: 'MY_DUMMY_CLIENT', uri: `http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL` }
    ])
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我的应用服务

import { Inject, Injectable } from '@nestjs/common';
import { Client } from 'nestjs-soap';

@Injectable()
export class AppService {

  constructor(@Inject('MY_DUMMY_CLIENT') private readonly myDummyClient: Client) {}

  getHello(): string {
    return process.env.APP_MESSAGE;
  }

  getDetails(): string {
    return process.env.APP_DETAILS;
  }

  asyncGetCountryCapital() {
    //this.myDummyClient.
  }
}

由于我参考的文档不详细,我无法弄清楚如何在asyncGetCountryCapital()函数中调用SOAP服务。

zphenhs4

zphenhs41#

今天我需要做同样的事情,结果发现nestjs-soap的文档并不是那么清晰。
在尝试了几件事后,这就是我的工作。

1.使用 * 方法 *

文件在这里。

不发送参数的示例

模块:
SoapModule.register({
    clientName: 'CountryInfoService',
    uri: 'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?wsdl',
})
控制器:
import { Client } from 'nestjs-soap';

constructor(
    @Inject('CountryInfoService') private readonly soapClient: Client,
) {}

@Get('soap')
soap() {
    return new Promise((resolve, reject) => {
        this.soapClient.ListOfContinentsByName(null, (err, res) => {
            if (res) {
                resolve(res);
            } else {
                reject(err);
            }
        });
    });
}

注意第一个参数,我需要传递null(也可以是{}),因为没有它,我无法在第二个参数中声明函数。
此外,我还使用new Promise()封装了它,以便能够将其返回给客户机。

发送参数示例

模块:

让我们使用另一个uri,这是我能找到的唯一一个。

SoapModule.register({
    clientName: 'NumberConversion',
    uri: 'https://www.dataaccess.com/webservicesserver/NumberConversion.wso?wsdl',
})
控制器:
import { Client } from 'nestjs-soap';

constructor(
    @Inject('NumberConversion') private readonly soapClient: Client,
) {}

@Get('soap')
soap() {
    return new Promise((resolve, reject) => {
        this.soapClient.NumberToWords({ ubiNum: 235 }, (err, res) => {
            if (res) {
                resolve(res);
            } else {
                reject(err);
            }
        });
    });
}

注意第一个参数,您需要传递一个具有所需属性的对象。

2.使用 * 方法异步 *

文件在这里。

不发送参数的示例

@Get('soap')
async soap() {
    return await this.soapClient.YourFunctionNameAsync(null);
}

发送参数示例

@Get('soap')
async soap() {
    return await this.soapClient.YourFunctionNameAsync({a: 1, b: 'hi'});
}

这里的关键是在你的函数名后面加上单词Async。例如,取前面的函数ListOfContinentsByName,名字将是ListOfContinentsByNameAsync

我通过仔细研究nodejs soap库得到了这个解决方案。关于如何使用它的第一个例子显示,你需要有一个client函数和一个method函数。
然后,查看GitHub上nestjs-soap库的代码,我发现他们只给了你client函数,而不是两者都给。
您/我们需要提供method函数,例如:

使用 * 方法 *
// The second parameter as a function is the key
this.soapClient.YourFunctionName(null, (err, res) => {
});
使用 * 方法异步 *
// Add the word `Async` at the end of your function name
const result = await this.soapClient.YourFunctionNameAsync({a: 1, b: 'hi'});

希望对你有帮助。

apeeds0o

apeeds0o2#

我找到了如何使用它,并在文档中。你需要打电话
this.soapClient.describe(),并且在响应中包含客户端允许的所有方法。
:)

相关问题