2012-10-09 23 views
13

Chciałbym wywołać SOAP WebService bezpośrednio z JavaScript. Rozglądałem się dookoła, ale wciąż nie mogę mieć czegoś działającego. Zakładałem, że muszę zbudować otoczkę SOAP (patrz poniżej). Korzystam również z jQuery.Jak wywołać SOAP WS z Javascript/jQuery

Po pierwsze, byłbym pewien, że mogę zadzwonić do usługi sieciowej SOAP zlokalizowanej gdzieś indziej? to jest nie ma ograniczeń, takich jak ograniczenie domeny.

Również nie jestem pewien, jaki jest właściwy URL, którego potrzebuję użyć, usługa SOAP jest ujawniona przy użyciu Ladon, dla celów debugowania Sprawdziłem, czy WS działa dobrze z soapUI, a oto adresy URL, które mogę znaleźć:

  • WSDL URL: http://192.168.1.5/ws/MyWS/soap/description // z mojego zrozumienia, że ​​nie może być to jeden
  • usługowe punkty końcowe: http://192.168.1.5/ws/MyWS/soap
  • SoapAction: http://192.168.1.5/ws/MyWS/soap/myOperation

Myślę, że powinienem używać punktu końcowego lub SOAPAction, ale to nie zadziałało. Mogę tęsknić coś tutaj lub później JavaScript jest tak wadliwy, że nie mogę być tego pewien.

Teraz tutaj jest mój rzeczywisty JS robi rozmowę (istnieją pewne pytania wewnątrz komentarzy):

<html> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<head> 

<script type="text/javascript" src="ressources/jquery-1.7.1.min.js"></script> 

<script type="text/javascript"> 

// inspired by http://openlandscape.net/2009/09/25/call-soap-xm-web-services-with-jquery-ajax/ 

var soapServiceURL = 'http://192.168.1.5/ws/MyWS/soap/myOperation; // not sure what to put here from a LADON point of view 

function callSOAPWS(myParameter) 
{ 
    var soapMessage = 
    '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:LDetector"> \ 
    <soapenv:Header/> \ 
    <soapenv:Body> \ 
     <urn:myOperation soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> \ 
      <myParameter xsi:type="xsd:string">' + myParameter + '</myParameter > \ 
     </urn:myOperation > \ 
    </soapenv:Body> \ 
    </soapenv:Envelope>'; 

    alert("Check SOAP: [" + soapMessage + "]"); 

    jQuery.ajax({ 
      url: soapServiceURL, 
      type: "POST", 
      dataType: "xml", 
      data: soapMessage, 
      contentType: "text/xml; charset=\"utf-8\"", 

      //processData: false, // what is it for? may be should be true when using 'complete:' ? 
      //timeout: 5000, 

      // below I first try to have only 'complete:' then I tried to have 'success:' + 'error:', then the 3. Nothing seems to be ok. I do not find which one i should use. 
      complete: myCallback, 

      success: function(response){ 
       document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + 'success!' + '\n'; 
       alert("success!!!"); 
      }, 

      error: function(XMLHttpRequest,textStatus, errorThrown){ 
       document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + 'error : ' + textStatus + '\n'; 
       alert("error : " + textStatus); 
      } 

    }); 

    alert('if we reach this line, is it a fail?!'); 
    return false; 
} 

function myCallback(xmlHttpRequest, status) 
{ 
    jQuery(xmlHttpRequest.responseXML) 
     .find('detected') 
     .each(function() 
    { 
    var result = jQuery(this).find('result').text(); 
    document.getElementById('debug').innerHTML = document.getElementById('debug').innerHTML + '\n' + result + '\n'; 
    alert('ok : [' + result + ']'); 
    }); 
} 

// https://stackoverflow.com/questions/11916780/changing-getjson-to-jsonp?rq=1 

jQuery(document).ready(function() { 
    callSOAPWS('this is a test'); 
}); 

</script> 

<body> 

<div id="debug" style="background-color:#EEEEEE; height:250px; width:600px; overflow:auto;">&nbsp;</div> 

</body> 
</html> 

pozdrawiam

EDIT: kontynuując jednocześnie próbować i szukać odpowiedzi, mam przeczytałem, że =>Simplest SOAP example gdzie Prestaul mówi "Nie można tego zrobić z prostym JavaScriptem, chyba że usługa internetowa jest w tej samej domenie co twoja strona." więc może próbuję zrobić coś niemożliwego? czy to jest powód, dla którego nie może działać?

Odpowiedz

20

Nie można wysyłać żądań AJAX między domenami z powodu ograniczenia same origin policy wbudowanego w przeglądarki. Aby to działało, strona HTML zawierająca kod jQuery musi być hostowana w tej samej domenie, co usługa sieci Web (http://192.168.1.5/ws/MyWS/).

Istnieje obejście, które wymaga użycia na serwerze JSONP, ale ponieważ twoja usługa sieciowa to SOAP, to nie działa.

Jedynym niezawodnym sposobem, aby to zadziałało, jeśli nie możesz przenieść skryptu javascript na tę samą domenę co usługa sieciowa, jest zbudowanie skryptu po stronie serwera, który będzie hostowany w tej samej domenie co kod javascript i który będzie działał jako most między 2 domenami. Tak więc wyślesz żądanie AJAX do skryptu po stronie serwera, który z kolei wywoła zdalną usługę WWW i zwróci wynik.

+0

dziękuję, więc myliłem się myśleć, że za pomocą SOAP z pełnym klientem JS było obejść. I tak, testowałem kod, który umieściłem powyżej, działa on, gdy jest używany z tego samego serwera. BTW będę potrzebował, aby inne serwery mogły to zrobić ... zamierzam przyjrzeć się temu, co sugerujesz. – user1340802

1

poniższy kod działa poprawnie. może być to może ci pomóc.

var SoaMessage = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >' 
       + '<soapenv:Header/>' 
        + '<soapenv:Body>' 
        + '<myoperation soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://MyService/"> ' 
        + ' <AgencyId xsi:type="xsd:string">ADBC</AgencyId >' 
        + '</myoperation >' 
       + '</soapenv:Body>' 
      + '</soapenv:Envelope>'; 
    var url = "http://XXXXXXX/XXX/XXXXX?wsdl"; 
    $.support.cors = true; 
    $.ajax({ 
     type: "POST", 
     url: url, 
     jsonpCallback: "MyCallbackDED", 
     dataType: "xml", 
     processData: false, 
     contentType: "text/xml; charset=\"utf-8\"", 
     success: function (msg) { 
      alert("suc: " + msg.tradeLicenseData.master[0].arabicAddress + ": " + msg.tradeLicenseData.master[0].arabicAddress); 

     }, 
     error: function (msg) { 
      alert("Failed: " + msg.status + ": " + msg.statusText); 
     } 

    }); 
+2

To nie działa – Mukus

+0

Nie działa. –

8

Co powiesz na to? https://github.com/doedje/jquery.soap

Wydaje się dość łatwe. Może ci to pomoże.

Przykład:

$.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 
} 
}); 

spowoduje

<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> 
+0

z plikiem svc, takim jak https: // localhost: 1303/BbsService.svc, w jaki sposób możemy go użyć? – arslanaybars

Powiązane problemy