17

Javascriptから直接SOAPWebServiceを呼び出したいと思います。私は周りを見回していますが、それでも何かが機能することができません。私はSOAPエンベロープを作成する必要があると想定しました(以下を参照)。私もjQueryを使用しています。

まず、別の場所にあるSOAP Webサービスを呼び出すことができると確信していますか?つまり、クロスドメイン制限のような制限はありません。

また、使用する必要のある正しいURLがわかりません。SOAPサービスはLadonを使用して公開されてます。デバッグの目的で、WSがsoapUIで適切に機能することを確認しました。ここで、次のURLを見つけることができます。

  • WSDL URL:http://192.168.1.5/ws/MyWS/soap/description//私の理解では、これにすることはできません
  • サービスエンドポイント:http://192.168.1.5/ws/MyWS/soap
  • SOAPAction:http://192.168.1.5/ws/MyWS/soap/myOperation

エンドポイントまたはSOAPActionを使用する必要があると思いますが、機能しませんでした。私はここで何かを見逃すかもしれませんし、後のJavascriptが非常に欠陥があるので、確信が持てません。

これが私の実際のJSが電話をかけているところです(コメントの中にいくつか質問があります):

<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>
</head>
<body>

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

</body>
</html>

よろしくお願いします

編集:答えを探し続けながら、私はそれを読みました=> Prestaulが「Webサービスがあなたのページと同じドメインにない限り、これはストレートJavaScriptでは実行できません」と言う最も単純なSOAPの例。だから、多分私は不可能なことをしようとしていますか?それがうまくいかない理由ですか?

4

3 に答える 3

24

ブラウザに組み込まれている同一生成元ポリシーの制限のため、クロスドメインAJAXリクエストを送信することはできません。これを機能させるには、jQueryコードを含むHTMLページをWebサービスと同じドメインでホストする必要があります(http://192.168.1.5/ws/MyWS/)。

サーバーでJSONPを使用することを含む回避策がありますが、WebサービスがSOAPであるため、これは機能しません。

Webサービスと同じドメインでJavaScriptを移動できない場合にこれを機能させる唯一の信頼できる方法は、JavaScriptコードと同じドメインでホストされ、JavaScriptコード間のブリッジとして機能するサーバー側スクリプトを作成することです。 2つのドメイン。したがって、AJAXリクエストをサーバー側スクリプトに送信すると、リモートWebサービスが呼び出され、結果が返されます。

于 2012-10-10T08:38:38.403 に答える
13

これはどう?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>
于 2015-09-23T19:10:56.680 に答える
1

以下のコードは正常に機能しています。それはあなたを助けるかもしれません。

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

    });
于 2013-10-03T05:03:06.013 に答える