2013-04-05 225 views
1

如何将JSON数据作为URL字符串发布到外部URL(跨域)并绕过访问控制?将JSON数据发布到外部URL

这里是一个jQuery阿贾克斯POST请求将无法工作发送给因外部URL访问控制允许来源:

var json = JSON.stringify(object); 

$.ajax({ 
    type: 'POST', 
    url: externalurl, 
    data: json, 
    dataType: 'json', 
    success: function(data){console.log(data);}, 
    failure: function(errMsg) { 
     console.log(errMsg); 
    }, 
}); 

我收到了一个建议,POST数据到相同的域名,并将“请求传递给”外部域名,尽管此解决方案对我来说没有意义。我正在寻找最安全的解决方案。任何帮助将非常感激。

+0

您是否尝试过使用JSON-P?我相信在jQuery中,您使用'jsonp'而不是'json'来处理数据类型,但我不是100%确定的... – 2013-04-05 00:34:49

+1

当您说'传递请求'解决方案对于你的意思只是你不理解它,希望得到解释,或者你明白它,但认为它不适合你目前的情况? @MarkOrmston - JSONP确实可以解决域问题,但只有在设置了外部域来处理它并提供适当的解决方案时,它才会起作用。 – nnnnnn 2013-04-05 00:37:24

+0

是的,它不适合在这种情况下,数据必须作为json发送。我也无法控制外部服务器,因此CORS也不是一个可行的解决方案。 – jverban 2013-04-05 00:39:40

回答

2

一种方法绕过同源策略是使用卷曲做实际发射。

我将举一个使用PHP的例子,但您可以轻松地在任何服务器端语言上执行此操作。

设置一个脚本,您的服务器上,例如send.php

首先你点你的阿贾克斯send.php

var json = JSON.stringify(object); 

$.ajax({ 
    type: 'POST', 
    url: send.php, 
    data: json, 
    dataType: 'json', 
    success: function(data){console.log(data);}, 
    failure: function(errMsg) { 
     console.log(errMsg); 
    }, 
}); 

然后你的PHP脚本来转发:

<?php 
    // Initialize curl 
    $curl = curl_init(); 

    // Configure curl options 
    $opts = array(
     CURLOPT_URL    => $externalscriptaddress, 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_CUSTOMREQUEST => 'POST', 
     CURLOPT_POST   => 1, 
     CURLOPT_POSTFIELDS  => 'field1=arg1&field2=arg2' 
    ); 

    // Set curl options 
    curl_setopt_array($curl, $opts); 

    // Get the results 
    $result = curl_exec($curl); 

    // Close resource 
    curl_close($curl); 

    echo $result; 
?> 
+0

也感谢您的解决方案。这已经成功了! – jverban 2013-04-07 23:55:27

+0

很高兴能提供帮助,如果您对解决方案感到满意,请将其标记为未来其他人看到的答案。 – 2013-04-08 00:03:33

+0

要接受答案,您可以点击upvote旁边的勾号,它会将答案标记为正确的答案,并且如果您的第一个问题标记为答案,也会给您一些声誉:) – 2013-04-08 00:30:32

3

我不久前在PHP中做了这个。这是一个“传递请求”的例子。 (您需要启用PHP卷曲,这与大多数的安装非常标准。)

<?php 
    //Get the JSON data POSTed to the page 
    $request = file_get_contents('php://input'); 

    //Send the JSON data to the right server 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "http://location_of_server.com/"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8")); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request); 
    $data = curl_exec($ch); 
    curl_close($ch); 

    //Send the response back to the Javascript code 
    echo $data; 
?> 
+0

+1比我快:D – 2013-04-05 01:16:00

+0

非常感谢您的解决方案。 – jverban 2013-04-07 23:43:48