33739

[code]

    $.ajax({
      type:'POST',
      url: URL,      // POST送信先のURL
      crossDomain: true,
      contentType:'application/x-www-form-urlencoded',
      data: date,
      success: function(json_data) {
          if (!json_data[0]) {
              alert('Transaction error. ' + json_data[1]);
              return;
          }
          console.log(json_data);
      },
      error: function() {
          alert('Server Error. Pleasy try again later.');
      },
      complete: function() {
          button.attr('disabled', false);
      }
    });
    });
    
[/code]

上記のような感じでWordpressで外部サービスにPOSTしたいのですが、

[code]

    XMLHttpRequest cannot load "送信先のURL". No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '送信元URL' is therefore not allowed access.
    
[/code]

上記のようなエラーを吐いてしまいます。

以下のような記事を参考にしましたがうまくいかず、wordpressの仕様でうまくいっていないのでしょうか？  
<https://stackoverflow.com/questions/20433655/no-access-control-allow-origin-
header-is-present-on-the-requested-resource-or>


CC BY-SA 3.0
2017-04-02T06:54:36.390
33710
2017-04-03T07:35:04.560
2017-05-23T12:38:56.083
-1
9988
question
api wordpress ajax
Wordpressでajaxで外部のサービスのAPIにPOSTしたいとき


本件「クロスドメイン」と言われる動作になっており、  
javascriptが置いてあるサーバー(質問者様のサーバー)の問題ではなく  
ajaxでアクセスしようとしているサーバー(外部サービスのサーバー)の問題となります。

ご記載いただいているエラーにも記載されていますが。  
レスポンスヘッダーにAccess-Control-Allow-Originが必要だが、ない。  
と言われております。

Publicでサービスを公開しているのではない場合、APIキーの認証だったりドメインの登録、署名の登録が必要だったりします。  
「外部サービス」側でAPIキーに認証が必要だったり、ドメイン指定が必要だったり、のようなユーザー設定項目が存在しませんでしょうか？


CC BY-SA 3.0
2017-04-02T10:19:25.497
33713
2017-04-02T10:19:25.497
19716
33710
answer


WordPressは多分関係ないと思うので、WordPressを使わないページで同様のコードを書いて試してみていただきたいですが...。

ブラウザでは Same-origin Policy
というルールに基づき、異なるドメイン間での通信に制限があります。具体的には、CORSというルールに従ってサーバー側が「そのドメインからは呼び出してもいい」ということをレスポンスヘッダを使ってブラウザに伝えなければいけません。

そして `No 'Access-Control-Allow-Origin' header is present on the requested
resource.` はそのようなヘッダがないことを示しています。ですからまず考えられるのは、
**そのAPIが異なるドメインからの呼び出しに対応していない**
、という可能性です。この照会は実際のPOSTの前に行われるので、APIキーの渡し方以前の問題です。

このあたりは呼び出したいAPIを具体的に提示していただかないとこちらでは調べようがないので、ここでは書けないのでしたらご自身でその外部サービスのヘルプを読んだり、問い合わせていただくことになります。

もし対応していなければ、ブラウザから直接ではなく、呼び出し元ページのあるサーバーからPHPなどのプログラムで呼び出しを行う必要があるかと思います。

ちなみに `$.ajax()` の crossDomain オプションは、異なるドメインへの通信では自動的に true
になるので、通常明示する必要はありません。


CC BY-SA 3.0
2017-04-03T07:35:04.560
33739
2017-04-03T07:35:04.560
8000
33710
answer