Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript可以与其他服务器通信吗?_Javascript_Ajax_Client Server_Client Side - Fatal编程技术网

JavaScript可以与其他服务器通信吗?

JavaScript可以与其他服务器通信吗?,javascript,ajax,client-server,client-side,Javascript,Ajax,Client Server,Client Side,JavaScript可以与位于不同服务器上的数据库交互吗 即涉及三台计算机 服务器:它为用户提供一个带有JavaScript的HTML页面 客户机:运行要与之交谈的页面的客户机 第二台服务器:向客户机发送数据或从客户机接收数据 这是否违反了法律?若否,原因为何?如果是这样的话,有办法解决吗 我的背景——我是一名称职的计算机科学家,但我从未处理过客户端编程。回答时,请随意使用复杂的想法,但请假设我对JavaScript语言或客户端编程背后的特定策略一无所知。是的,这违反了同源策略 您可以通过使

JavaScript可以与位于不同服务器上的数据库交互吗

即涉及三台计算机

  • 服务器:它为用户提供一个带有JavaScript的HTML页面
  • 客户机:运行要与之交谈的页面的客户机
  • 第二台服务器:向客户机发送数据或从客户机接收数据
这是否违反了法律?若否,原因为何?如果是这样的话,有办法解决吗


我的背景——我是一名称职的计算机科学家,但我从未处理过客户端编程。回答时,请随意使用复杂的想法,但请假设我对JavaScript语言或客户端编程背后的特定策略一无所知。

是的,这违反了同源策略

您可以通过使用来绕过此限制,它利用
脚本
标记的行为从第二台(数据库)主机获取数据。这假设您可以以一种非常特殊的方式从第二台主机提供数据:在回调中包装JSON响应。它还需要使用GET来提供响应


另一种选择是,它还需要对服务器发送数据的方式进行一些控制,并将您限制在最新的web浏览器上。

每当您的html来自服务器1且AJAX请求转到服务器2时,它确实会违反相同的来源

退房。这是一个专门设计来处理这一问题的标准 情况。它是在大多数现代浏览器中实现的


或者,您可以使用来提供数据,或者如果您无法控制第二台服务器,则使用反向代理通过第一台服务器向第二台服务器代理请求。

是的,这违反了SOP。有很多解决方法,但值得强调一个关键点:

客户端访问远程服务器的任何尝试都需要该服务器的同谋。

那么有什么选择呢

JSON-p

JSON-p涉及让服务器返回封装在回调函数调用中的响应。它的工作原理如下:

callback = function(response) { console.log(response); };
var script = document.createElement('script');
script.src = 'http://www.some-request.com/here.php?callback=callback'; //the example happens to use the same name; the callback parameter tells the some-request domain what function to wrap JSON in 
document.body.appendChild(script);
  • 一个新的脚本标记被编写到页面中,或者一个现有的标记被删除 再利用
  • 脚本标记的
    src
    属性设置为请求路径(脚本标记可以从任何地方加载脚本-它们不受 (SOP)
  • 带有数据的服务器响应,通常(但不一定)进行编码 作为JSON,并将其作为参数输出到 回调函数(必须在JS中定义)
因此,用本机JS编写的JSON-p请求如下所示:

callback = function(response) { console.log(response); };
var script = document.createElement('script');
script.src = 'http://www.some-request.com/here.php?callback=callback'; //the example happens to use the same name; the callback parameter tells the some-request domain what function to wrap JSON in 
document.body.appendChild(script);
然后,如果服务器的响应是

callback({"foo": "bar"});
…我们会在控制台中得到响应。注意:我显式地将函数设置为全局函数,因为它必须是可访问的,而不是被作用域隐藏的。(从这个意义上讲,它必须是全局可访问的,但不一定是传统意义上的全局-例如,它可以是全局名称空间的静态方法)

许多符合JSON-p的web服务器允许您规定要调用的函数的名称,通常通过
&callback=func_name
将此信息附加到请求URL

更多有关此的信息

CORS/XHR2

在CORS中,也就是XHR(即AJAX)v2背后的跨域思想,这意味着服务器发送一个头部,指示哪些域可以向其或所有域发出跨域请求。例如,在PHP中,我们可以允许任何调用方域发出请求,因此:

header("Access-Control-Allow-Origin: *");
更多关于这个的信息

EasyXDM*

整理了一些特定于供应商的、更新的、HTML5到达方式,用于在域之间发布和接收基于文本的消息,值得一看

非JS

如果您需要从一个不玩球的服务器上获取一些东西,那么您唯一的选择就是一个中间服务器端脚本,因为这些脚本可以触发cURL请求,从而在不受SOP限制的情况下获取远程资源

$curl = curl_init("http://www.example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);

更多关于卷曲。

是的,它可以。以
$.getJSON
jquery实现为例:@MRocklin这是对低于~60-70%的人的标准评论,表示你应该回去接受有帮助的答案,因为人们将来更有可能帮助你。@MRocklin这与问题无关。这是关于他如何不试图回答你的问题的评论。