100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > JavaScript用JSONP跨域请求数据实例详解

JavaScript用JSONP跨域请求数据实例详解

时间:2021-06-23 12:49:11

相关推荐

JavaScript用JSONP跨域请求数据实例详解

web前端|js教程

js jsonp 跨域

web前端-js教程

前言

速卖通关键字挖掘工具源码,如何取消vscode的行编号,ubuntu 安装g77,容器tomcat在哪,sqlite锁类型,网页设计的发展趋势,怎样设置imap服务器,fsgallery插件,前端换肤框架,爬虫网在线,php正则判断,seo之如何入门,springboot继承组件,网站同步小程序,开发者工具修改网页的源代码,易企秀怎么改模板名称,oracle后台管理,企业登录页面模板免费下载,动易6.8 用户管理系统,程序封版lzw

最近因为工作需要,需要把爱词霸的每日一句引入到页面上,爱词霸向外开放了 API, 接口返回 json 数据,为了让页面更轻巧,我没有用 jQuery,而是直接纯 js 写了一段代码:

网页版开源网盘系统源码,vscode设置ssh,ubuntu加桌面,tomcat-8.0.26,sqlite查询变量,如何查看服务器空间大小,jquery登录验证码插件,web前端框架怎么实现,跨境爬虫软件,php云人才系统怎么样,阳江seo优化,最新云划算试客网站系统,图片编辑插件 网页,crc卡模板,dz注册页面,魅思后台管理系统,微信小程序排行源码lzw

function httpGetAsync(theUrl, callback) { xmlHttp = null; if (window.XMLHttpRequest) {// code for IE7, Firefox, Opera, etc. xmlHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE6, IE5 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlHttp != null) { xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { callback(xmlHttp.responseText); } else { console.error("Problem retrieving XML data"); } } xmlHttp.open("GET", theUrl, true); // true for asynchronous xmlHttp.setRequestHeader(Access-Control-Allow-Origin, *); xmlHttp.send(null); } else { console.error("Your browser does not support XMLHTTP."); } } function showIcibaDS(ds_data) { // show daily sentence content = ds_data.content; note = ds_data.note; document.write(content +

); document.write(note); } httpGetAsync("/dsapi/", showIcibaDS);

驾校考试系统完整版源码免费,ubuntu绑定裸设备,爬虫体育数据,imtoken PHP,湛江seo费用lzw

运行之后数据并没有获取到,而是出现了如下错误提示:

XMLHttpRequest cannot load /dsapi/. Response to preflight request doesn pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. Origin ull is therefore not allowed access. The response had HTTP status code 501.

这就是跨域请求的问题。那么什么是跨域请求呢?浏览器出于安全方面的考虑,采用同源策略(Same origin Policy),即只允许与同域下的接口交互。

同域是指:

同协议:如都是 http 或者 https

同域名:如都是 /a 或 /b

同端口:如都是 80 端口

也就是说,用户打开了页面: , 当前页面下的 js 向 /XXX 的接口发数据请求,浏览器是允许的。但假如向: /xxx 发数据请求则会被浏览器阻止掉,因为存在跨域调用。

跨域请求的解决办法就是 JSONP(JSON with Padding) . HTML 中 script 标签可以加载其他域下的 js, JSONP 就是通过 script 标签加载数据的方式去获取数据当做 JS 代码来执行,然后再用一个回调函数抽取数据:

var cur_date = new Date(); document.getElementById("cur_year").innerHTML = cur_date.getFullYear(); function showIcibaDS(ds_data) { // show daily sentence content = ds_data.content; note = ds_data.note; ds_p = document.getElementById("iciba_ds") var content_span = document.createElement(span); var note_span = document.createElement(span); var br = document.createElement(r) content_span.innerHTML = content note_span.innerHTML = note ds_p.appendChild(content_span); ds_p.appendChild(br); ds_p.appendChild(note_span); }

再查查资料,发现有人做了封装:

function jsonp(setting){ setting.data = setting.data || {} setting.key = setting.key||callback setting.callback = setting.callback||function(){} setting.data[setting.key] = \__onGetData__ window.__onGetData__ = function(data) { setting.callback (data); } var script = document.createElement(script) var query = [] for(var key in setting.data) { query.push(key + = + encodeURIComponent(setting.data[key])) } script.src = setting.url + ? + query.join(&) document.head.appendChild(script) document.head.removeChild(script)} jsonp({ url: /aj/index, key: jsoncallback, data: { page: 1, cate: ecommend }, callback: function(ret) { console.log(ret) }})

如果你使用的是 jQuery,则可以直接用 ajax 请求数据:

$(function(){ $.ajax({ async: true, type: "GET", dataType: jsonp, jsonp: callback, jsonpCallback: callbackfunction, url: "/dsapi/", data: "", timeout: 3000, contentType: "application/json;utf-8", success: function(data) { console.log(data); } });})

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

更多JavaScript用JSONP跨域请求数据实例详解相关文章请关注PHP中文网!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。