web-dev-qa-db-ja.com

クロスドメインAJAXリクエストが機能しない

JQueryの$ .ajax関数を使用して作業してきたサードパーティAPIでPOSTを呼び出しています。ただし、呼び出しを行うと、次のエラーが表示されます:XMLHttpRequest cannot load http://the-url.com. The request was redirected to 'http://the-url.com/anotherlocation', which is disallowed for cross-Origin requests that require preflight.

この投稿 から、これはWebkitのバグである可能性があることがわかったので、Firefox(Chromeで開発中)で試しましたが、同じ結果が得られました。ChromeとFirefoxで同じ結果が得られます。

この投稿 ごとに、$。ajax関数のcrossDomainプロパティをtrueに設定し、dataTypejsonp。しかし、これにより500内部サーバーエラーが発生しました。

--disable-web-securityフラグを使用してChromeを起動しても、問題はありません。ただし、ブラウザを正常に起動すると、エラーが発生します。

だから、これは2部構成の質問のようなものかもしれないと思う。このクロスドメインリクエストを行うにはどうすればよいですか? JSONPが答えである場合、サードパーティのAPIがこれをサポートするように正しく設定されているかどうかをどのように判断しますか?

EDIT:これは、ブラウザのセキュリティを無効にして呼び出しを行ったときのスクリーンショットです: https://drive.google.com/file/ d/0Bzo7loNBQcmjUjk5YWNWLXM2SVE/edit?usp = sharing

ブラウザのセキュリティを有効にして(通常のように)呼び出しを行うときのscreenchostは次のとおりです。 https://drive.google.com/file/d/0Bzo7loNBQcmjam5NQ3BKWUluRE0/edit?usp=sharing

13
Don

私が思いついた解決策は、cURL(@wakiが言及したように)を使用することでしたが、SOAPをサポートするわずかに修正されたバージョンです。次に、AJAXサードパーティAPIへの呼び出し(正しく構成されていない)を行う代わりに、ローカルのPHPファイルへの呼び出しを行い、 SOAPサードパーティAPIを呼び出し、データを自分のPHPファイルに戻します。ここで処理できます。これにより、CORSおよびすべてのそれに関連付けられた複雑さ。ここにコードがあります( this 質問から取得および変更されていますが、認証はありません)。

$post_data = "Some xml here";
$soapUrl = "http://yoursite.com/soap.asmx"; // asmx URL of WSDL


$headers = array(
    "Content-type: text/xml;charset=\"utf-8\"",
    "Accept: text/xml",
    "Cache-Control: no-cache",
    "Pragma: no-cache",
    "SOAPAction: http://yoursite.com/SOAPAction",
    "Content-length: " . strlen($post_data),
); //SOAPAction: your op URL

$url = $soapUrl;

// PHP cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // the SOAP request
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);

/* Check for an error when processing the request. */
if(curl_errno($ch) != 0) {
   // TODO handle the error
}

curl_close($ch);

// TODO Parse and process the $response variable (returned as XML)
3
Don

CURLを使用できますか? Ajaxを使用して、ハンドラーにデータを送信します(サーバーで、callback.phpと呼ばれます)。ファイル(callback.php)で、データにcURLを使用します。

$post_data = array( 
    'key' => 'key', 
    'test' => 'text'
    ); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_POST, TRUE); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);  
curl_setopt($curl, CURLOPT_URL, 'http://www.domain.com/'); 
$return = json_decode(trim(curl_exec($curl)), TRUE); 
curl_close($curl); 

$ return変数でデータを取得します。

1
waki