Преобразовать php мыльный вызов в узел - PullRequest
0 голосов
/ 22 февраля 2019

Обратите внимание: я использую заполнители для URL-адреса и метода

Попытка создать приложение, которое будет использовать мыльный поток с использованием node-soap.

Я могу генерировать ожидаемый результат, используя PHP (язык, с которым я более знаком):

$client = new SOAPClient('https://soap.wsdl', array('trace' => 1, 'cache_wsdl' => WSDL_CACHE_NONE));
$soap_var = "<ns1:DS_REQ class='R'><ns1:YEAR>2018</ns1:YEAR></ns1:DS_REQ>";
$request = array('DS_REQ' => array('DS_REQ' => new SoapVar($soap_var, XSD_ANYXML)));
$getMethod = $client->__soapCall('get_method', array('parameters' => $request));
var_dump($getMethod);

Однако, когда я использую мыло узла:

"use strict";

const soap = require('soap');
let url = 'https://soap.wsdl';
let args = {
    _xml: "<ns1:DS_REQ class='R'><ns1:YEAR>2018</ns1:YEAR></ns1:DS_REQ>"
};

soap.createClient(url, function(err, client){
    console.log(client.describe());
    client.GET_METHOD(args, function(err, result, rawResponse, soapHeader, rawRequest) {
        console.log(rawResponse);
    })
});

Я правильно подключаюсь, так как client.describe возвращает ожидаемый результат.

client.describe()
{ UDS_ACAD:
   { DS_ACAD_Port:
      { GET_ATTR_DEFS: [Object],
        GET_METHOD: [Object],
        GET_METHOD2: [Object] } } }

НО rawResponse возвращает ошибку "... Null Response Пустое представление было получено HTTPBridge, его нельзя преобразовать в подходящийHTTP response ... "и результат и ошибка равны нулю.

Я почти уверен, что правильно передаю аргументы, но я очень плохо знаком с нодом и пытаюсь понять его по ходу.



ОБНОВЛЕНИЕ: Былв состоянии заставить это работать, используя сильное мыло и большую помощь от коллеги

Вот рабочий код ...

"use strict";

let soap = require('strong-soap').soap;
let WSDL = soap.WSDL;
let url = 'https://soap.wsdl';

function constructArguments(year) {
  let variables = {
    UDS_ACAD: {
      DS_REQ: {
        $attributes: {
          class: 'R'
        },
      }
    }
  };

  if (year != null ) {
    variables.UDS_ACAD.DS_REQ.YEAR = year;
  }
  return variables;
}

// Pass in WSDL options if any
let options = {};
WSDL.open(url,options, function(err, wsdl) {
  // You should be able to get to any information of this WSDL from this object. Traverse
  // the WSDL tree to get  bindings, operations, services, portTypes, messages,
  // parts, and XSD elements/Attributes.

  // Set the wsdl object in the cache. The key (e.g. 'stockquotewsdl')
  // can be anything, but needs to match the parameter passed into soap.createClient()
  let clientOptions = {
    WSDL_CACHE : {
      mywsdl: wsdl
    }
  };

  soap.createClient('mywsdl', clientOptions, function(err, client) {
    let year = '2018';
    let requestArguments = constructArguments(year);

    const myRequestMethod = async () => {
      try {
        const {result, envelope, soapHeader} = await client.GET_METHOD(requestArguments);
      return result;
      } catch(err) {
        // handle error
       console.log(err);
      }
    };

    const processData = async () => {
      const myRequest = await myRequestMethod();
      console.log(myRequest);
    }; 

    processData();

  });
});
...