JSON跨域与PHP文件和本地javascript文件的通信

时间:2011-08-25 01:37:13

标签: php javascript jquery json

我是JSON新手,但在PHP和javascript方面有很好的经验。问题很简单,答案可能更简单。我无法将数据从服务器上的PHP文件发送到我本地的另一个PHP文件,该文件将从服务器接收JSON格式的数据。我做错了什么?

Javascript Frag(本地)

$(document).ready(function(){
//attach a jQuery live event to the button
$.getJSON('http://www.xpal.com/ws_users.php?action=get_user_data&user_id=33',function(data) {

        alert(data); //uncomment this for debug
        $('#showdata').html("<p>Username= "+data.username+"<br> Email= "+data.email+"<br> Firstname="+data.firstname+"<br> Lastname="+data.lastname+"</p>");
    });

});

PHP Frag(Server @ xpal.com):

$ users =新用户;

if($_GET['action']=="get_user_data")
{
$user_id=$_GET['user_id'];
$assoc=array(
                "username"=>$users->return_username($user_id),
                "email"=>$users->return_user_emailid($user_id),
                "firstname"=>$users->return_user_firstname($user_id),
                "lastname"=>$users->return_user_lastname($user_id)
            );
echo json_encode($assoc);
}   

编辑:

错误消息:XMLHttpRequest无法加载xpal.com/ws_users.php?action=get_user_data&user_id=33。 Access-Control-Allow-Origin不允许使用origin localhost。

7 个答案:

答案 0 :(得分:3)

您无法对托管该网页的其他域进行ajax调用。请参阅浏览器为安全起见而实施的Same Origin Policy

有一种方法可以进行跨域ajax调用,它涉及使用JSONP。基本上,您将脚本标记注入到您自己的框架中,该脚本标记指向Web上任何位置的服务器端点。由于脚本标记的src值不受同一原始策略的限制,因此您可以访问该服务器。但是,现在你需要有办法让结果得到回报。这是使用JSONP完成的,您在服务器请求中指定了希望返回的javascript调用的javascript函数。返回javascript可以在其​​中包含javascript数据,然后传递给所需的函数。 JSONP需要客户端代码和服务器代码之间的协作,因为正常的ajax调用可能不支持JSONP的额外部分。但是,通过双方的这种合作,您可以绕过支持JSONP的服务器端点的相同原始策略。

答案 1 :(得分:3)

正如其他答案中已经解释的那样,由于Same Origin Policy,这不起作用。

现在,JSONP(参见jfriend00的回答)是解决它的一种方法,但它有它的缺点。 (见this page的结尾)。


还有另外一种方法:那就是让PHP查询远程服务器并将响应发送回客户端。见本页:

Cross domain AJAX querying with jQuery

此方法的主要缺点是所有流量都将通过您的服务器,因为您必须调用远程页面,获取响应将响应发送回客户端。

答案 2 :(得分:2)

要使用jsonp,如其他建议,你必须要么“回调=?”在您的URL的末尾,或使用$ .ajax()并指定dataType是jsonp。示例here

答案 3 :(得分:1)

它被称为Same Origin Policy。简而言之:您的代码所在的域是您的javascript可以与之通信的唯一域(默认情况下)

JQuery won't get json?

答案 4 :(得分:0)

如果可以选择,您可以在自己的服务器上运行php脚本 这: -

<?php
    $details = file_get_contents('http://www.xpal.com/ws_users.php?action=get_user_data&user_id=33');
    var_dump(json_decode($details));

返回了这个: -

object(stdClass)[1]
    public 'username' => string 'sniper' (length=6)
    public 'email' => string 'ajithsubramanian@gmail.com' (length=26)
    public 'firstname' => string 'Ajith' (length=5)
    public 'lastname' => string 'Ravi' (length=4)

这会让你走上正确的道路吗?您可以在服务器上基于此对脚本进行AJAX调用。

答案 5 :(得分:0)

你应该看看CORS及其实现。

在您的情况下,可能的解决方案是在您的php文件中使用标头(Access-Control-Allow-Origin:http:// localhost)。将localhost替换为受SOP限制的域。

关于CORS的一个很好的参考资料可以在https://developer.mozilla.org/en/HTTP_access_control找到。

答案 6 :(得分:0)

您可以使用相同的jQuery来发出跨域请求,只需查看链接cross-domain request,他们就演示了如何实现跨域请求...

在您的代码中,确保以下内容正确无误,

  • www.xpal.com输出应采用json格式
  • 如果输出中有任何错误,jsonp技术不会显示错误(错误处理不当)。

  • 您的json输出应该包含echo $ _GET ['callback']。“”。json_encode($ array)。“)”;如上所述的链接。