17

私はここ数週間、顧客向けに作成した jQuery プラグインから、jQuery AJAX SOAP ベースのクロスドメイン Web サービスの 1 つを動作させようとしています。私が行った調査のほとんどは、CORS または Cross Origin Resource Sharing が jasonP (GET) タイプの呼び出ししか許可しないため、それが不可能であることを示しているように見えました。

私はついにそれを機能させる方法を考え出し、私がしなければならなかったことを共有したいと思いました.

最初に理解しておくべきことは、サーバーが別のドメインにある CORS 対応のブラウザーでは、GET (他のパラメーターの中でも特に) 以外のすべてがプリフライト チェックと呼ばれるものになるということです。これが意味することは、ブラウザが実行を許可されているオプションのリストをサーバーに要求するということです。サーバーが SOAP ベースの Web サービスを許可するオプションの正確なリストを返さない限り、呼び出しは実際の要求が行われる前であっても失敗します。

必要なことは、Web サーバー (私の例では IIS7.5) が正しいオプションのリストを返すようにすることです。
これを行うには、inetpub\wwwroot フォルダーに web.config ファイルを構成します (ない場合は、作成して以下をコピーします)。

私の web.config ファイルは次のようになります。

重要なことは、すべてが期待どおりに機能していることに気づいたら、大文字と小文字が区別されることです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
   <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="content-type,soapaction,x-requested-with" />      
    </customHeaders>
   </httpProtocol>
        <handlers accessPolicy="Read, Execute, Script" />
 </system.webServer>
</configuration>

私のjQuery AJAXコードは次のようになります。

var getNextJobId = function()
{
  var se = '';
  se = se + '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
  se = se + '<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">';
  se = se + '<soap-env:Body>';
  se = se + '<ebas:getNextJobIdRequest xmlns:ebas="http://www.ebasetech.com">';
  se = se + '<ebas:ORGCODE>' + plugin.settings.orgcode + '</ebas:ORGCODE>';
  se = se + '</ebas:getNextJobIdRequest>';
  se = se + '</soap-env:Body>';
  se = se + '</soap-env:Envelope>';
  $.ajax(
  {
    url: params.webserviceTargetUrl,
beforeSend: function(xhr)
{
  xhr.setRequestHeader("SOAPAction", "getNextJobId");
},
type: "POST",
dataType: "xml",
data: se,
crossDomain: true,
headers: {"X-Requested-With": "XMLHttpRequest"},
async: false,
success: function(xml)
{
  params.jobId =   $(xml).find("ebas\:JOBID").text();
},
failure: function(xml)
{
  params.webserviceFailure = $(xml).text();
},
      contentType: "charset=UTF-8"
});
}
4

1 に答える 1

5

「CORS または Cross Origin Resource Sharing では jasonP (GET) タイプの呼び出ししか許可されないため、それは不可能でした。」

CORS は GET メソッドに限定されず、JSONP スタイルの呼び出しにも限定されません。

JSONP は、CORS が標準化される前に Web 開発者がページを提供したホスト以外のホストに AJAX 要求を実行するために使用した手法です。JSONP<script>は、ページにタグを挿入することで機能します。サーバーの参加が必要です。通常、JSON の結果を関数の呼び出しにラップし、callbackパラメーターを介して AJAX 呼び出しで名前を付けます。この回答を参照してください: what-is-jsonp-all-about

ご指摘のとおり、JSONP は GET<script>のみを実行するため、GET メソッドの実行に限定されます。エラーを処理できないなど、他の問題もあります。たとえば、400 応答が返された場合、スクリプトは、AJAX 呼び出しの JS エラー ハンドラーを実行するのではなく、単にブラウザーによって実行されません。

CORS は新しい標準です。Access-Control-Allow-Originまた、プリフライト チェックを処理する必要があるという点でサーバーの参加も必要Access-Control-Allow-MethodsですAccess-Control-Allow-Headers。GET メソッドに限定されません。むしろ、Access-Control-Allow-Methodsヘッダーのプリフライト チェックの結果によって指定されたメソッドに限定されます。CORS では、コールバック関数で結果をラップしたり、その他の結果を調整したりする必要はなく、エラーやその他のステータス コードを処理します。詳細については、この優れたCORSの概要を参照してください。

于 2013-06-13T16:52:01.737 に答える