3

私はこれを達成しようとしています http://wiki.kolmisoft.com/index.php/MOR_API_login。サーバーで API を許可する設定を有効にしました。Javascript の問題は、私のメイン Web サイトがドメイン website.com で実行されているのに対し、アスタリスク サーバーは voip.website.com で実行されていることです。そのため、jQuery を使用して URL を呼び出そうとすると、XMLHttpRequest cannot load http://voip.website.com/.../.../ ..... Origin http://sites is not allowed by Access が表示されます。 -コントロール許可オリジン。

これを達成するための最良の方法は何かわかりません。どの点も大変参考になります。

4

2 に答える 2

4

すべてのブラウザーは、ホスト全体 (website.com と voip.website.com) を含む同一生成元ポリシーを適用します。ホストが同じでない限り、Ajax ポストから返された JSON を処理することはできません。

JSONP と呼ばれる回避策があります。秘訣は、返信を JavaScript 関数でラップすることです。おわかりのように、同一生成元ポリシーはデータにのみ適用され、本格的なスクリプト自体には適用されません。そのため、応答がデータではなく JavaScript である場合、ブラウザーは、このスクリプトを実行する必要があると判断します。

たとえば、応答が次の JSON になるとします。

{
  firstName: 'Abed',
  lastName: 'Nadir',
  school: 'Greendale Community College'
}

代わりに、次のように応答します。

({
  firstName: 'Abed',
  lastName: 'Nadir',
  school: 'Greendale Community College'
})

注意すべきことは、前後のかっこによって、JSON データではなく JavaScript 匿名関数になることです。そのレスポンスを受け取り、前後の JavaScript コードを削除するだけです。

下品に聞こえますか?それはそうですが、Flickr、Google、Amazon、Facebook など、誰もがそれを行っています。

于 2012-04-30T20:31:10.017 に答える
2

text/javascriptクロスドメイン ポリシーを回避するために、JSONP を使用してデータをコールバックにラップし、mimetype する必要があります。

.net と通信する JSONP を使用した JQuery の良い例は何ですか?

タイトルには .net と記載されていますが、サーバー側の環境はクライアントの実装には関係ありません。

実行可能な代替手段は、CURL (またはその他の http lib) を使用してリクエストを転送し、スクリプトの XHR リクエストへの応答を出力する独自のドメインにサーバー側スクリプトをセットアップすることです。curl やその他のサーバー側の http lib はクロスドメイン ポリシーに拘束されないため、この方法では、クライアント側のスクリプトとアクセスしようとしているリモート ドメインの間にキャッチオールが設定されます。

編集

投稿を送信する必要があるとあなたが言っているので、2 番目のアプローチについて詳しく説明します。概念実証として、PHP を使用して何を行う必要があるかを詳しく説明しますが、この一般的な考え方を別のスクリプト言語に移植するのは簡単なはずです。

であなたのドメインでキャッチオールスクリプトを作成できるとしましょうwww.yourdomain.com/data.php 。そのファイルのロジックは、http リクエストからすべての投稿変数を読み取り、それらを新しいドメインへのリクエストとして curl インスタンスに入れ、そのリクエストを実行し、次に要求の応答が私の ajax XHR に返される出力は、そもそも仲介者が存在しなかったように見えます。

私は、jscol の OOCurlを使用して、curl の構文を少しきれいにするのが好きです。

<?
reqire_once('path/to/oocurl.php');
$c = new Curl('voip.otherdomain.com/api'); // instantiate with the url endpoint for the api
$c->post = True;
// Set the postfields for the child request to the same as the parent
$c->postfields = $_POST;
//Bust if there is an error and output that instead  
$c->failoneerror = True;
$response = $c->exec();
if($c->errno()){
  //there was an error, what was it?
  header('Status:' . $c->info(CURLINFO_HTTP_CODE));
  echo $c->error();
}else{
  //success, echo output
  header('Content-type: application/json');
  echo $response;
}
?>

この種のスクリプトに ajax リクエストを送信すると、CURL のコンストラクターで指定された他のドメインに透過的に渡されます。ここで、返される mimetype が json であると想定していることに注意してください。API に合わせてこれを調整する必要がある場合があります。

API の認証資格情報がある場合は、それらを追加のポスト変数として手動でリクエストにコーディングし、hmacを使用してエンドポイントを保護する必要があります。これは、クライアント/サーバー側の相互作用をどのように行っているかに本当に固有のものであり、リダイレクターの範囲から少し外れます...基本的には、サーバーで定義されたハッシュソルトがあり、投稿要求でダイジェストが送信されるようにしてください。第三者があなたの仲介エンドポイントに簡単に投稿できないようにするためです。

編集

誰かが Google から出くわした場合に備えて、このアプローチを独自に取り入れたライブラリを作成しました。ここで入手できます。

于 2012-04-30T20:32:50.880 に答える