javascript вызов - Простейший пример SOAP




веб сервиса (12)

Каков самый простой пример SOAP с использованием Javascript?

Ответ должен быть как можно более полезным:

  • Быть функциональным (другими словами, на самом деле работать)
  • Отправляйте хотя бы один параметр, который может быть установлен в другом месте кода.
  • Обработать хотя бы одно значение результата, которое можно прочитать в другом месте кода
  • Работайте с большинством современных версий браузера
  • Будьте предельно ясными и короткими, не используя внешнюю библиотеку

Answers

Вы можете использовать плагин jquery.soap для выполнения вашей работы.

Этот скрипт использует $ .ajax для отправки SOAPEnvelope. В качестве входных данных может использоваться XML DOM, XML-строка или JSON, и ответ может быть возвращен как XML DOM, XML-строка или JSON.

Пример использования с сайта:

$.soap({
    url: 'http://my.server.com/soapservices/',
    method: 'helloWorld',

    data: {
        name: 'Remy Blom',
        msg: 'Hi!'
    },

    success: function (soapResponse) {
        // do stuff with soapResponse
        // if you want to have the response as JSON use soapResponse.toJSON();
        // or soapResponse.toString() to get XML string
        // or soapResponse.toXML() to get XML DOM
    },
    error: function (SOAPResponse) {
        // show error
    }
});

Кто-нибудь пробовал это? https://github.com/doedje/jquery.soap

Кажется, очень легко реализовать.

Пример:

$.soap({
url: 'http://my.server.com/soapservices/',
method: 'helloWorld',

data: {
    name: 'Remy Blom',
    msg: 'Hi!'
},

success: function (soapResponse) {
    // do stuff with soapResponse
    // if you want to have the response as JSON use soapResponse.toJSON();
    // or soapResponse.toString() to get XML string
    // or soapResponse.toXML() to get XML DOM
},
error: function (SOAPResponse) {
    // show error
}
});

приведет к

<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <helloWorld>
        <name>Remy Blom</name>
        <msg>Hi!</msg>
    </helloWorld>
  </soap:Body>
</soap:Envelope>

Томас:

JSON предпочтительнее для использования на передней панели, поскольку это javascript. Поэтому у вас нет XML для решения. Из-за этого SOAP - это боль, не использующая библиотеку. Кто-то упомянул SOAPClient, которая является хорошей библиотекой, мы начали с нее для нашего проекта. Однако у него были некоторые ограничения, и нам пришлось переписать большие куски. Он был выпущен как SOAPjs и поддерживает передачу сложных объектов на сервер и включает в себя некоторый пример прокси-кода для потребления услуг из других доменов.


Некоторые отличные примеры (и готовый JavaScript SOAP-клиент!) Здесь: http://plugins.jquery.com/soap/

Проверьте readme и будьте осторожны с тем же браузером.


Есть много причуд в том, как браузеры обрабатывают XMLHttpRequest, этот JS-код будет работать во всех браузерах:
https://github.com/ilinsky/xmlhttprequest

Этот JS-код преобразует XML в простые в использовании объекты JavaScript:
http://www.terracoder.com/index.php/xml-objectifier

Код JS выше может быть включен в страницу, чтобы удовлетворить ваши требования к внешней библиотеке.

var symbol = "MSFT"; 
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "http://www.webservicex.net/stockquote.asmx?op=GetQuote",true);
xmlhttp.onreadystatechange=function() {
 if (xmlhttp.readyState == 4) {
  alert(xmlhttp.responseText);
  // http://www.terracoder.com convert XML to JSON 
  var json = XMLObjectifier.xmlToJSON(xmlhttp.responseXML);
  var result = json.Body[0].GetQuoteResponse[0].GetQuoteResult[0].Text;
  // Result text is escaped XML string, convert string to XML object then convert to JSON object
  json = XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(result));
  alert(symbol + ' Stock Quote: $' + json.Stock[0].Last[0].Text); 
 }
}
xmlhttp.setRequestHeader("SOAPAction", "http://www.webserviceX.NET/GetQuote");
xmlhttp.setRequestHeader("Content-Type", "text/xml");
var xml = '<?xml version="1.0" encoding="utf-8"?>' +
 '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
                'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + 
   '<soap:Body> ' +
     '<GetQuote xmlns="http://www.webserviceX.NET/"> ' +
       '<symbol>' + symbol + '</symbol> ' +
     '</GetQuote> ' +
   '</soap:Body> ' +
 '</soap:Envelope>';
xmlhttp.send(xml);
// ...Include Google and Terracoder JS code here...

Два других варианта:


Самый простой пример:

  1. Получение пользовательского ввода.
  2. Составление XML-SOAP-сообщения, похожего на это

    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <GetInfoByZIP xmlns="http://www.webserviceX.NET">
          <USZip>string</USZip>
        </GetInfoByZIP>
      </soap:Body>
    </soap:Envelope>
    
  3. Сообщение POSTing для URL-адреса webservice с использованием XHR

  4. Анализ XML-SOAP-ответа webservice, подобный этому

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <soap:Body>
      <GetInfoByZIPResponse xmlns="http://www.webserviceX.NET">
       <GetInfoByZIPResult>
        <NewDataSet xmlns="">
         <Table>
          <CITY>...</CITY>
          <STATE>...</STATE>
          <ZIP>...</ZIP>
          <AREA_CODE>...</AREA_CODE>
          <TIME_ZONE>...</TIME_ZONE>
         </Table>
        </NewDataSet>
       </GetInfoByZIPResult>
      </GetInfoByZIPResponse>
     </soap:Body>
    </soap:Envelope>
    
  5. Представление результатов пользователю.

Но это много хлопот без внешних библиотек JavaScript.


Это невозможно сделать с помощью прямого JavaScript, если веб-служба не находится в том же домене, что и ваша страница. Изменить: в 2008 году и в IE <10 это невозможно сделать с помощью прямого javascript, если служба не находится в том же домене, что и ваша страница.

Если веб-служба находится в другом домене [и вам необходимо поддерживать IE <10], вам придется использовать прокси-страницу в своем собственном домене, которая будет извлекать результаты и возвращать их вам. Если вам не нужна старая поддержка IE, вам необходимо добавить поддержку CORS для вашей службы. В любом случае вы должны использовать что-то вроде lib, которое предложили timyates, потому что вы не хотите самостоятельно анализировать результаты.

Если веб-служба находится в вашем собственном домене, тогда не используйте SOAP. Для этого нет веских оснований. Если веб-служба находится в вашем собственном домене, измените ее так, чтобы она могла вернуть JSON и избавить себя от проблем со всеми неприятностями, которые возникают с SOAP.

Короткий ответ: Не делайте SOAP-запросы из javascript. Используйте веб-службу для запроса данных из другого домена, и если вы это сделаете, проанализируйте результаты на стороне сервера и верните их в дружественной форме js.


Angularjs $ http wrap base на XMLHttpRequest . Пока в содержимом заголовка будет установлен следующий код.

"Content-Type": "text/xml; charset=utf-8"

Например:

function callSoap(){
var url = "http://www.webservicex.com/stockquote.asmx";
var soapXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://www.webserviceX.NET/\"> "+
         "<soapenv:Header/> "+
         "<soapenv:Body> "+
         "<web:GetQuote> "+
         "<web:symbol></web:symbol> "+
         "</web:GetQuote> "+
         "</soapenv:Body> "+
         "</soapenv:Envelope> ";

    return $http({
          url: url,  
          method: "POST",  
          data: soapXml,  
          headers: {  
              "Content-Type": "text/xml; charset=utf-8"
          }  
      })
      .then(callSoapComplete)
      .catch(function(message){
         return message;
      });

    function callSoapComplete(data, status, headers, config) {
        // Convert to JSON Ojbect from xml
        // var x2js = new X2JS();
        // var str2json = x2js.xml_str2json(data.data);
        // return str2json;
        return data.data;

    }

}

Это самый простой JavaScript-SOAP-клиент, который я могу создать.

<html>
<head>
    <title>SOAP JavaScript Client Test</title>
    <script type="text/javascript">
        function soap() {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'https://somesoapurl.com/', true);

            // build SOAP request
            var sr =
                '<?xml version="1.0" encoding="utf-8"?>' +
                '<soapenv:Envelope ' + 
                    'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                    'xmlns:api="http://127.0.0.1/Integrics/Enswitch/API" ' +
                    'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
                    'xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<soapenv:Body>' +
                        '<api:some_api_call soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">' +
                            '<username xsi:type="xsd:string">login_username</username>' +
                            '<password xsi:type="xsd:string">password</password>' +
                        '</api:some_api_call>' +
                    '</soapenv:Body>' +
                '</soapenv:Envelope>';

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) {
                    if (xmlhttp.status == 200) {
                        alert('done. use firebug/console to see network response');
                    }
                }
            }
            // Send the POST request
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            xmlhttp.send(sr);
            // send request
            // ...
        }
    </script>
</head>
<body>
    <form name="Demo" action="" method="post">
        <div>
            <input type="button" value="Soap" onclick="soap();" />
        </div>
    </form>
</body>
</html> <!-- typo -->

Вопрос: «Каков самый простой пример SOAP с использованием Javascript?»

Этот ответ является примером в среде Node.js , а не в браузере. (Назовите скрипт soap-node.js) И мы будем использовать публичный веб-сервис SOAP из Европейского PMC в качестве примера, чтобы получить справочный список статьи.

const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const DOMParser = require('xmldom').DOMParser;

function parseXml(text) {
    let parser = new DOMParser();
    let xmlDoc = parser.parseFromString(text, "text/xml");
    Array.from(xmlDoc.getElementsByTagName("reference")).forEach(function (item) {
        console.log('Title: ', item.childNodes[3].childNodes[0].nodeValue);
    });

}

function soapRequest(url, payload) {
    let xmlhttp = new XMLHttpRequest();
    xmlhttp.open('POST', url, true);

    // build SOAP request
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                parseXml(xmlhttp.responseText);
            }
        }
    }

    // Send the POST request
    xmlhttp.setRequestHeader('Content-Type', 'text/xml');
    xmlhttp.send(payload);
}

soapRequest('https://www.ebi.ac.uk/europepmc/webservices/soap', 
    `<?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Header />
    <S:Body>
        <ns4:getReferences xmlns:ns4="http://webservice.cdb.ebi.ac.uk/"
            xmlns:ns2="http://www.scholix.org"
            xmlns:ns3="https://www.europepmc.org/data">
            <id>C7886</id>
            <source>CTX</source>
            <offSet>0</offSet>
            <pageSize>25</pageSize>
            <email>[email protected]</email>
        </ns4:getReferences>
    </S:Body>
    </S:Envelope>`);

Перед запуском кода вам необходимо установить два пакета:

npm install xmlhttprequest
npm install xmldom

Теперь вы можете запустить код:

node soap-node.js

И вы увидите результат, как показано ниже:

Title:  Perspective: Sustaining the big-data ecosystem.
Title:  Making proteomics data accessible and reusable: current state of proteomics databases and repositories.
Title:  ProteomeXchange provides globally coordinated proteomics data submission and dissemination.
Title:  Toward effective software solutions for big biology.
Title:  The NIH Big Data to Knowledge (BD2K) initiative.
Title:  Database resources of the National Center for Biotechnology Information.
Title:  Europe PMC: a full-text literature database for the life sciences and platform for innovation.
Title:  Bio-ontologies-fast and furious.
Title:  BioPortal: ontologies and integrated data resources at the click of a mouse.
Title:  PubMed related articles: a probabilistic topic-based model for content similarity.
Title:  High-Impact Articles-Citations, Downloads, and Altmetric Score.

Легко использовать веб-службы SOAP с JavaScript -> Листинг B

function fncAddTwoIntegers(a, b)
{
    varoXmlHttp = new XMLHttpRequest();
    oXmlHttp.open("POST",
 "http://localhost/Develop.NET/Home.Develop.WebServices/SimpleService.asmx'",
 false);
    oXmlHttp.setRequestHeader("Content-Type", "text/xml");
    oXmlHttp.setRequestHeader("SOAPAction", "http://tempuri.org/AddTwoIntegers");
    oXmlHttp.send(" \
<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \
xmlns:xsd='http://www.w3.org/2001/XMLSchema' \
 xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> \
  <soap:Body> \
    <AddTwoIntegers xmlns='http://tempuri.org/'> \
      <IntegerOne>" + a + "</IntegerOne> \
      <IntegerTwo>" + b + "</IntegerTwo> \
    </AddTwoIntegers> \
  </soap:Body> \
</soap:Envelope> \
");
    return oXmlHttp.responseXML.selectSingleNode("//AddTwoIntegersResult").text;
}

Это может не соответствовать всем вашим требованиям, но это на самом деле отвечает на ваш вопрос. (Я переключил XMLHttpRequest () для ActiveXObject ("MSXML2.XMLHTTP") ).


dummyElem.focus () где dummyElem - скрытый объект (например, имеет отрицательный zIndex)?





javascript soap