从网站检索 jsonP 数据的简单示例
Simple example to retrieve jsonP data from website
我看过很多 JSONP
的例子,但我似乎无法为我的网站找到任何例子。它可以在某些 url 处生成 JSON
代码,但我无法从其他域 检索它 。能否给我一个 JSONP
的工作示例,它可以从任何 JSON
文件 (例如 www.w3schools.com/json/myTutorials.txt)检索数据 。
我可能不完全理解,但我至少需要解释一下为什么如果我用上面的示例替换 url,则不会提取任何数据。
有很多答案指出了 JSON 和 JSONP 之间的区别。你的问题(“...jsonP that can retrieve...”)表明你没有完全理解这个概念。 JSONP 是答案的格式,HTML、XML、JSON 也是。因此响应请求的服务器应该能够发送它 JSONP 格式。
这是使用 Yahoos public APIs.jquery docs 中示例的修改版本。
$.ajax({
url: "https://query.yahooapis.com/v1/public/yql",
// Tell jQuery we're expecting JSONP
dataType: "jsonp",
// Tell YQL what we want and that we want JSON
data: {
q: "show tables",
format: "json"
},
// Work with the response
success: function( response ) {
console.log( response ); // server response
}
});
连同 jsbin:https://jsbin.com/tuketa/edit?js,output
之所以存在JSONP,是为了绕过CORS规则的限制。出于安全原因,您的浏览器通常只允许与其加载页面的服务器通信。 JSONP 的创建是为了解决这个问题,方法是为服务器提供一个回调函数来填充 JSON 数据,因此 JSONP.
中的 P
正如 jasonscript 在评论中指出的那样,并不是任何服务器都可以使用 JSONP,它必须配置为能够使用 JSONP,例如 Yahoo [=示例中的 21=]。
来自不同的域...来自任何 json 文件...这是不可能的。服务器响应实际上是一个 javascript 包装了一个 json 对象。
jsonP 是一个协议。由于 Same-Origin-Policy (SOP),请求者(浏览器中的 javascript)无法通过源 server:port
之外的 XHR (ajax) 请求。
绕过SOP,JSONP诞生。
客户端没有发送XHR请求,而是在DOM中添加了一个<script>
标签,src属性指向json的URL P 带有一个参数(例如 callback=foo),它告诉接收 JSON 作为参数的本地函数的名称。
然后,远程服务器 - 理解 JSONP- 发送一个 javascript 以 JSON 作为参数调用本地函数。
像这个例子:
客户javascript代码:
function foo(data)
{
// do stuff with JSON
}
var script = document.createElement('script');
script.src = '//example.com/path/to/jsonp?callback=foo'
document.getElementsByTagName('head')[0].appendChild(script);
(取自here)
服务器响应:
HTTP/1.1 200 OK
Content-Type: text/javascript
foo({ "key" : "value" });
因此,浏览器加载脚本,使用 json 作为参数调用 foo
。现在,您已经绕过了 SOP 限制。
我看过很多 JSONP
的例子,但我似乎无法为我的网站找到任何例子。它可以在某些 url 处生成 JSON
代码,但我无法从其他域 检索它 。能否给我一个 JSONP
的工作示例,它可以从任何 JSON
文件 (例如 www.w3schools.com/json/myTutorials.txt)检索数据 。
我可能不完全理解,但我至少需要解释一下为什么如果我用上面的示例替换 url,则不会提取任何数据。
有很多答案指出了 JSON 和 JSONP 之间的区别。你的问题(“...jsonP that can retrieve...”)表明你没有完全理解这个概念。 JSONP 是答案的格式,HTML、XML、JSON 也是。因此响应请求的服务器应该能够发送它 JSONP 格式。
这是使用 Yahoos public APIs.jquery docs 中示例的修改版本。
$.ajax({
url: "https://query.yahooapis.com/v1/public/yql",
// Tell jQuery we're expecting JSONP
dataType: "jsonp",
// Tell YQL what we want and that we want JSON
data: {
q: "show tables",
format: "json"
},
// Work with the response
success: function( response ) {
console.log( response ); // server response
}
});
连同 jsbin:https://jsbin.com/tuketa/edit?js,output
之所以存在JSONP,是为了绕过CORS规则的限制。出于安全原因,您的浏览器通常只允许与其加载页面的服务器通信。 JSONP 的创建是为了解决这个问题,方法是为服务器提供一个回调函数来填充 JSON 数据,因此 JSONP.
中的 P正如 jasonscript 在评论中指出的那样,并不是任何服务器都可以使用 JSONP,它必须配置为能够使用 JSONP,例如 Yahoo [=示例中的 21=]。
来自不同的域...来自任何 json 文件...这是不可能的。服务器响应实际上是一个 javascript 包装了一个 json 对象。
jsonP 是一个协议。由于 Same-Origin-Policy (SOP),请求者(浏览器中的 javascript)无法通过源 server:port
之外的 XHR (ajax) 请求。
绕过SOP,JSONP诞生。
客户端没有发送XHR请求,而是在DOM中添加了一个<script>
标签,src属性指向json的URL P 带有一个参数(例如 callback=foo),它告诉接收 JSON 作为参数的本地函数的名称。
然后,远程服务器 - 理解 JSONP- 发送一个 javascript 以 JSON 作为参数调用本地函数。
像这个例子:
客户javascript代码:
function foo(data)
{
// do stuff with JSON
}
var script = document.createElement('script');
script.src = '//example.com/path/to/jsonp?callback=foo'
document.getElementsByTagName('head')[0].appendChild(script);
(取自here)
服务器响应:
HTTP/1.1 200 OK
Content-Type: text/javascript
foo({ "key" : "value" });
因此,浏览器加载脚本,使用 json 作为参数调用 foo
。现在,您已经绕过了 SOP 限制。