博客列表 >php实现callback跨域请求jsonp数据

php实现callback跨域请求jsonp数据

TANKING的代码日志
TANKING的代码日志原创
2023年10月21日 10:00:1492浏览

摘要

JSONPJSON with Padding 的缩写,是一种解决跨域数据获取的方案。由于浏览器的同源策略限制,不同域名之间的前端JS代码不能相互访问到对方的数据,JSONP通过script标签的特性,实现在不同域名的网页间传递数据。

其原理是在客户端页面上定义一个回调函数 (callback),然后通过script标签向外部服务器请求数据,并将定义好的回调函数名称作为参数放在url请求地址里,服务器成功接收请求后,使用该参数将数据传递给定义好的回调函数并返回,客户端页面中定义好的回调函数接收参数后进行处理。

正常的AJAX请求

  1. $.ajax({
  2. url: "https://qq.com/getdata/",
  3. success: function(res) {
  4. console.log(res)
  5. }
  6. });

如果跨域请求,浏览器会报错:

跨域:例如你访问页面的域名是 https://baidu.com/getdata/,但是ajax请求的是 https://qq.com/getdata/ ,虽然都是getdata,但是其域名不一样,浏览器会拒绝请求。

这样的情况下,你通过ajax是无法获得请求数据的。

如何解决这个问题?jsonp就可以解决。

JSONP数据源代码示例

数据源即ajax请求的接口,其返回的是由括号括起来的json数据。服务端需要根据请求中的回调函数名称callback,将用户数据包装在函数调用中。

假设是:https://www.qq.com/callbackData/index.php

  1. <?php
  2. // 页面编码
  3. header("Content-type:application/json");
  4. // 数据源
  5. $data = array(
  6. array(
  7. 'title' => '90后考上公职3个月开始贪污获刑3年',
  8. 'url' => 'https://baijiahao.baidu.com/s?id=1780086209787359686'
  9. ),
  10. array(
  11. 'title' => '男子闪婚后闪离 24万礼金要回8万',
  12. 'url' => 'http://dzb.hxnews.com/news/kx/202310/19/2138573.shtml'
  13. ),
  14. array(
  15. 'title' => '神舟十七号船箭组合体转运至发射区',
  16. 'url' => 'https://baijiahao.baidu.com/s?id=1780150004201916038&wfr=spider&for=pc'
  17. ),
  18. array(
  19. 'title' => '以selie要求本国公民立即离开土耳其',
  20. 'url' => 'https://baijiahao.baidu.com/s?id=1780107306390790504&wfr=spider&for=pc'
  21. ),
  22. array(
  23. 'title' => '好莱坞将翻拍《你好李焕英》',
  24. 'url' => 'https://baijiahao.baidu.com/s?id=1780164746410232029&wfr=spider&for=pc'
  25. )
  26. );
  27. // 返回结果
  28. $result = array(
  29. 'datalist' => $data,
  30. 'code' => 200,
  31. 'msg' => '获取成功'
  32. );
  33. // 输出callback
  34. $resultCallback = json_encode($result);
  35. echo $_GET['callback'] . "(" . $resultCallback . ")";
  36. ?>

ajax请求

  1. <html>
  2. <head>
  3. <title>jsonp请求示例</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover">
  6. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <div id="app"></div>
  10. <script>
  11. $.ajax({
  12. url: "https://www.qq.com/callbackData/index.php",
  13. dataType: "jsonp",
  14. jsonpCallback: "handleJSONPResponse",
  15. success: function(res) {
  16. console.log(res)
  17. }
  18. });
  19. </script>
  20. </body>
  21. </html>

结果:

通过 dataType: "jsonp" 就可以成功请求到数据。

作者

TANKING

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议