javascript - أبسط الأمثلة على SOAP




(9)

ما هو أبسط مثال SOAP باستخدام جافا سكريبت؟

لتكون مفيدة قدر الإمكان ، يجب على الإجابة:

  • كن فعالاً (بعبارة أخرى العمل الفعلي)
  • أرسل معلمة واحدة على الأقل يمكن تعيينها في مكان آخر في التعليمة البرمجية
  • قم بمعالجة قيمة نتيجة واحدة على الأقل يمكن قراءتها في مكان آخر في الكود
  • العمل مع معظم إصدارات المستعرضات الحديثة
  • كن واضحًا وقصيرًا قدر الإمكان ، بدون استخدام مكتبة خارجية

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;

    }

}

أبسط مثال سوف يتكون من:

  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. إرسال رسالة إلى عنوان url webservice باستخدام XHR

  4. تحليل استجابة SOAP XML لخادم الويب مشابهة لهذا

    <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. تقديم النتائج للمستخدم.

لكنه كثير من الازعاج بدون مكتبات جافا سكريبت خارجية.


بعض الأمثلة الرائعة (وعميل SOAP JavaScript جاهز!) هنا: http://plugins.jquery.com/soap/

تحقق من الملف التمهيدي ، واحذر من تقييد المتصفح نفسه.


توماس:

JSON مفضل لاستخدام الواجهة الأمامية لأنه جافا سكريبت. لذلك ليس لديك XML للتعامل معه. SOAP هو ألم دون استخدام مكتبة بسبب هذا. ذكر شخص ما SOAPClient ، وهي مكتبة جيدة ، بدأنا بها لمشروعنا. ومع ذلك كان هناك بعض القيود وكان علينا إعادة كتابة أجزاء كبيرة منه. تم إصداره على أنه SOAPjs ويدعم تمرير الكائنات المعقدة إلى الخادم ، ويتضمن بعض نماذج التعليمات البرمجية للوكيل لاستهلاك الخدمات من المجالات الأخرى.


هل هناك اي احد جرب هذة؟ 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>

هناك الكثير من المراوغات في الطريقة التي تتعامل بها المتصفحات مع XMLHttpRequest ، وسيعمل رمز JS هذا عبر جميع المتصفحات:
https://github.com/ilinsky/xmlhttprequest

يعمل رمز JS هذا على تحويل XML إلى عناصر جافا سكريبت سهلة الاستخدام:
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...

خياران آخران:


استهلك بسهولة خدمات SOAP Web مع 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") ).


لا يمكن إجراء ذلك باستخدام جافا سكريبت مباشرة ما لم تكن خدمة الويب على نفس النطاق مثل صفحتك. تعديل: في عام 2008 وفي IE <10 ، لا يمكن إجراء ذلك باستخدام javascript مستقيم ما لم تكن الخدمة على نفس النطاق مثل صفحتك.

إذا كانت خدمة الويب موجودة على مجال آخر [وكان عليك دعم IE <10] ، فسيتعين عليك استخدام صفحة وكيل على نطاقك الخاص والتي ستقوم باسترداد النتائج وإعادتها إليك. إذا لم تكن بحاجة إلى دعم IE قديم ، فستحتاج إلى إضافة دعم CORS إلى خدمتك. في كلتا الحالتين ، يجب عليك استخدام شيء مثل lib الذي اقترحه timyates لأنك لا تريد أن تضطر إلى تحليل النتائج بنفسك.

إذا كانت خدمة الويب على نطاقك الخاص ، فلا تستخدم SOAP. لا يوجد سبب وجيه للقيام بذلك. إذا كانت خدمة الويب على نطاقك الخاص ، فعدِّلها بحيث يمكنها إرجاع JSON وحفظ نفسك عناء التعامل مع جميع المشكلات التي تصاحب SOAP.

الإجابة المختصرة هي: لا تجعل طلبات SOAP من javascript. استخدم خدمة ويب لطلب بيانات من مجال آخر ، وإذا قمت بذلك ، فقم بتحليل النتائج من جانب الخادم وإعادتها في صيغة js.


function SoapQuery(){
  var namespace = "http://tempuri.org/";
  var site = "http://server.com/Service.asmx";
  var xmlhttp = new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
  xmlhttp.setOption(2,  13056 );  /* if use standard proxy */
  var args,fname =  arguments.callee.caller.toString().match(/ ([^\(]+)/)[1]; /*Имя вызвавшей ф-ции*/
  try { args =   arguments.callee.caller.arguments.callee.toString().match(/\(([^\)]+)/)[1].split(",");  
    } catch (e) { args = Array();};
  xmlhttp.open('POST',site,true);  
  var i, ret = "", q = '<?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><'+fname+ ' xmlns="'+namespace+'">';
  for (i=0;i<args.length;i++) q += "<" + args[i] + ">" + arguments.callee.caller.arguments[i] +  "</" + args[i] + ">";
  q +=   '</'+fname+'></soap:Body></soap:Envelope>';
            // Send the POST request
            xmlhttp.setRequestHeader("MessageType","CALL");
            xmlhttp.setRequestHeader("SOAPAction",namespace + fname);
            xmlhttp.setRequestHeader('Content-Type', 'text/xml');
            //WScript.Echo("Запрос XML:" + q);
            xmlhttp.send(q);
     if  (xmlhttp.waitForResponse(5000)) ret = xmlhttp.responseText;
    return ret;
  };





function GetForm(prefix,post_vars){return SoapQuery();};
function SendOrder2(guid,order,fio,phone,mail){return SoapQuery();};

function SendOrder(guid,post_vars){return SoapQuery();};




soap