6

SOAP のみをサポートする Web サービスを扱っています。また、ソープ コールを通じてこのサービスを使用することになっている NodeJS アプリケーションがあります。

最大の問題は、Web サービスに WSDL API の記述がどこにもないことです。私の質問は、どのように NodeJS を使用して、WSDL なしで Soap を使用できるかということです。これまで NodeJS を確認したすべてのライブラリでは、WSDL の URL を指定する必要があります。ここで、必要のない C# 用のものを見つけました: C#-soap-without-wsdl

4

1 に答える 1

11

私も過去にこの問題に遭遇しました。ほとんどの RESTful API を使用した経験を持つ開発者にとって、妥当な時間内に SOAP の基礎を理解することは特に困難であり、SOAP の問題をデバッグできることは言うまでもありません。覚えておくべきことは、SOAP はおそらく使い慣れた RESTful API とまったく同じアプリケーション層プロトコル (HTTP) を使用するということです。ヘッダー、URI、慣れ親しんだメソッドがあり、これらのフィールドをフォーマットする方法だけが特別です

これに気付いた後、私が最終的にたどり着いた解決策は、 SoapUIのようなデスクトップ SOAP ツールを使用して必要ないくつかの SOAP リクエスト (2 つだったと考えてください) を生成し、ノードの非 SOAP HTTP リクエスト ライブラリを使用してこれらの生成されたリクエストを単純に送信することでした。

一貫して私のために働いた例を次に示します。

// SOAP
var requestBody =
  '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ' +
  'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ><soap:Header>' +
  '<SOAPAction>addRoom' +
  '</SOAPAction></soap:Header><soap:Body><AddRoomRequest ' +
  'xmlns="http://portal.vidyo.com/admin/v1_1"><room><name>' +
  params.conferenceName + '</name><RoomType>Public</RoomType><ownerName>' +
  vidyoApiUsername  + '</ownerName>' + '<extension>' +
  params.conferenceExtension  +
  '</extension><groupName>Default</groupName><RoomMode><isLocked>' +
  'false</isLocked><hasPIN>false</hasPIN><hasModeratorPIN>false' +
  '</hasModeratorPIN></RoomMode></room></AddRoomRequest></soap:Body>' +
  '</soap:Envelope>';

var requestHeaders = {
  'cache-control': 'no-cache',
  'soapaction': 'addRoom',
  'content-type': 'text/xml;charset=UTF-8'
};

var requestOptions = {
  'method': 'POST',
  'url': vidyoApiEndpoint,
  'qs': { 'wsdl': ''},
  'headers': requestHeaders,
  'body': requestBody,
  'timeout': 5000
};

request(requestOptions, function (error, response, body) {
  if (error) {
    // handle error
  } else {
    try {
      var parsingOptions = {
        'object': true,
        'sanitize': false
      };
      var jsonResult = parser.toJson(body, parsingOptions); // from xml
      if(jsonResult['soapenv:Envelope']
        ['soapenv:Body']
        ['ns1:AddRoomResponse']
        ['ns1:OK'] === 'OK') {
          conferenceInfo(req, res, next, params);
      } else {
       // handle error
      }
    } catch (e) {
      // handle error
    }
   }
}).auth(vidyoApiUsername, vidyoApiPassword); 
// you can remove this .auth if your api has no authentication

更新: 要点は、これは他のリクエストと比較して SOAP がどのように機能するかを初心者に説明するのに役立つ回避策であるということです。これは、ベスト プラクティスとしての推奨事項ではなく、開発者が目前の問題を理解するのに役立つ情報です。

于 2016-09-08T17:51:08.437 に答える