(其实现在应该很少使用JSONP了,只是跟上一篇比较有关所以顺便整理,简单了解一下就好。)
当请求一个跨域的资料时,资料会因为同源政策,而被浏览器阻挡。然而,在请求一个script时(例如、使用CDN),并不会受到同源政策的限制。
JSONP (JSON with Padding) 也是一种跨领域请求的方式,透过将资料引入<script>
,并用函式接住资料,来进行资料的求取。
这里借用一下W3C的范例,用php档模拟一个server端:
// server
<?php
$myJSON = '{ "name":"John", "age":30, "city":"New York" }';
echo "myFunc(".$myJSON.");";
?>
呈现的页面会是像这样的JSON格式:
myFunc({"name":"John", "age":30, "city":"New York"});
重点是将要请求的资料引入script:
<script src="demo_jsonp.php"></script>
(这里的范例其实还是同源,但一般呼叫CDN也都是非同源,就可以知道放在<script src=""></script>
的请求是可以跨域的。)
client档的程序码:
<!DOCTYPE html>
<html>
<body>
<h2>Request JSON using the script tag</h2>
<p>The PHP file returns a call to a function that will handle the JSON data.</p>
<p id="demo"></p>
<script>
function myFunc(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
</script>
<script src="demo_jsonp.php"></script>
</body>
</html>
可以成功出现这样的页面:
The PHP file returns a call to a function that will handle the JSON data.
John
因为上面的例子页面是写死的,我们可以用JS把页面写成能动态更新的状态,并将资料写入callback function。
<!DOCTYPE html>
<html>
<body>
<h2>Request With a Callback Function</h2>
<p>The PHP file returns a call to the function you send as a callback.</p>
<p id="demo"></p>
<script>
// 动态加入资料
let s = document.createElement("script");
s.src = "demo_jsonp2.php?callback=myDisplayFunction"; // 加入callback function的名称
document.body.appendChild(s);
function myDisplayFunction(myObj) {
document.getElementById("demo").innerHTML = myObj.name;
}
</script>
</body>
</html>
在client写好要使用的callback function,并告诉server要调用哪个函式。
所以可以知道JSONP的具体流程大概是这样子:
client端会依据<script>
引入的跨域网址,传送请求。
server收到请求後会返回JS档,并将请求的JSON资料放进指定的function并执行。
!!JSONP只能使用GET方法请求资料,而且容易受到CSRF攻击,因此不会被设计来传递隐私性较高的资料。
相较於依赖XHR(XMLHttpRequest)物件或fetch API的CORS,JSONP透过将资料引入<script>
来进行资料的传递。
【如内文有误还请不吝指教>< 谢谢阅览至此的各位:D】
参考资料:
Before running basic application using Mbed Simula...
安装前注意事项 unRaid采用随身碟开机(系统跟引导区亦装在随身碟里) 所以须注意随身碟的挑选,千...
如果有错误,欢迎留言指教~ Q_Q 什麽是 Hook? Hook 是 React 16.8 中增加...
阿~今天的笔记,真心觉得,给我来一口翻译蒟蒻吧,很多硬梆邦的东西,记不起来XD" ▉条文是...
第~14~天~罗~ 假如有开发过 Web 的都知道, 假如要设定按钮按下後的动作, 可在 html ...