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

JSON与PHP文件和本地javascript文件的跨域通信,php,javascript,jquery,json,Php,Javascript,Jquery,Json,我是一个JSON新手,但在PHP和javascript方面有很好的经验。问题很简单,答案可能更简单。我无法将数据从服务器上的PHP文件发送到本地的另一个PHP文件,该文件将从服务器接收JSON格式的数据。我做错了什么 Javascript框架(本地) $(document).ready(function(){ //attach a jQuery live event to the button $.getJSON('http://www.xpal.com/ws_users.php?action=

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

Javascript框架(本地)

$(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>");
    });

});
编辑:


错误消息:XMLHttpRequest无法加载xpal.com/ws\u users.php?action=get\u user\u data&user\u id=33。Access Control Allow Origin不允许使用Origin localhost。

您不能对页面所在的其他域进行ajax调用。请参阅浏览器出于安全原因实现的

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

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


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


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

您应该了解CORS及其实现

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


关于CORS的一个很好的参考可以在上找到。

正如在其他答案中已经解释的那样,这不起作用,因为

现在,JSONP(参见jfriend00的答案)是解决这个问题的一种方法,但它也有它的缺点。(见本章末尾)


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


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

要使用jsonp,正如其他建议一样,您必须将“callback=?”放在URL的末尾,或者使用$.ajax()并指定数据类型为jsonp。示例。

您可以使用相同的jQuery发出跨域请求,只需检查链接,他们已经演示了如何实现跨域请求

在代码中,请确保以下内容是正确的

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

  • 您的json输出应该由echo$\u GET['callback']覆盖。“.json\u encode($array)。”;正如上面提到的链接一样


据我所知,什么都没有。我按照URL找到了一个漂亮的JSON字符串,其中包含用户数据(我希望是测试数据)。到底出了什么问题。什么是Haping,您希望发生什么?XMLHttpRequest无法加载。访问控制不允许原点允许原点。是我得到的错误。是的,这是一个测试数据库:)这可能是由于浏览器的安全策略。看:啊!我该如何着手解决这个问题呢?阅读您对这里答案的评论,我不清楚您对xpal服务器的访问权限。你在为那个服务器开发吗?谢谢你的朋友。其他API是如何工作的?他们都使用JSONP吗?我想我所要做的就是从服务器端回显一个JSON包,并使用必要的javascript函数在客户端捕获它。看起来没那么容易。@sniper-我不明白你在评论中的要求。使用ajax与主机服务器通信很容易,因为这是同一个来源。是的,我完全理解这一点。假设我希望xpal.com向facebook.com发送数据(单向)。所以facebook.com将需要对xpal.com进行一些API调用,xpal.com将返回一个JSON对象,对吗?还假设一周后,xpal.com应该向我们正在构建的移动应用程序发送数据。只有当我使用JSONP?服务器可以心满意足地相互交谈时,这两种情况才可能发生。它们不受相同来源的限制。但是,如果xpal.com上的某个页面想要与facebook通信,那么它可以使用facebook API来实现,该API为您管理跨域通信。如果在手机上查看的xpal.com网页想要与您自己的xpal.com服务器通信,它可以使用普通的ajax进行通信,因为它的来源相同。如果我正在构建一个web服务,移动应用程序将使用该服务从我的服务器获取数据,该解决方案将如何扩展?我正在寻找一种解决方案,使其更像一个API函数调用,最终返回结果。:)这些信息不在你的问题中。然而,我不认为这有什么问题,它取决于您以一种可扩展且健壮的方式编写代码。相信我,在jQuery中尝试这样做会遇到更多问题。这就像桃子一样有效。:)但这是一个安全的解决方案吗?看起来它会立即返回一些可执行文件!据我所知,返回“一些即时可执行文件”正是jsonp设计的目的!见,嘿,努伊。我照克里斯的建议做了
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);
}   
<?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)