jsonp跨域获取数据实现百度搜索

简介:

本菜鸡最近在写某个页面请求数据时,报了如下的错误。

Failed to load https://...: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:7070' is therefore not allowed access.

了解原因后,得知是由于跨域请求导致的,学习了一下跨域及同源策略相关知识后,写了个demo玩玩

简单聊聊跨域

要了解跨域,必须先了解浏览器同源策略,接下来搬运了一些大神的总结

什么是同源策略?

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

同源策略限制以下几种行为:


1.Cookie、LocalStorage 和 IndexDB 无法读取
2.DOM 和 Js对象无法获得
3.AJAX 请求不能发送

假设没有同源策略,那么我在A网站下的cookie就可以被任何一个网站拿到;那么这个网站的所有者,就可以使用我的cookie(也就是我的身份)在A网站下进行操作。同源策略可以算是 web 前端安全的基石,如果缺少同源策略,浏览器也就没有了安全性可言。

同源策略做了很严格的限制,但是在实际的场景中,又确实有很多地方需要突破同源策略的限制,也就是我们常说的跨域。 跨域的方法有很多(如接下来要玩的jsonp跨域,还有cors跨域资源共享,反向代理等等)。

使用jsonp跨域

由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而HTML的<script> 元素是一个例外。利用<script>元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

示例代码


function handleResponse(response) {
   alert(`You get the data : ${response}`)
}
const script = document.createElement('script')
script.src = 'http://somesite.com/json/?callback=handleResponse'
document.body.insertBefore(script, document.body.firstChild)

这里的callback回调函数很重要,动态添加在body中的script标签可以使用被加载的文件与HTML文件下的其他JS文件共享一个全局作用域。也就是说,<scritp>标签加载到的资源是可以被全局作用域下的函数所使用的!

玩一玩,写一个百度搜索框

百度有一个对外暴露的数据接口:sp0.baidu.com/5a1Fazu8AA5…

在chrome浏览器中打开百度主页,在开发者工具在 netkwork 可以找到

98e36b65a589f8ed115bf2906624491a4d68a631

我们可以直接拿来使用,配合jsonp就能实现跨域获取输入框内容相关热点数据并点击跳转了,具体实现请看Github项目源码

实现效果

242abd9ebbd1db4b9c0039a1b0d9b163d8b54e3a

页面结构非常简单,如图:

39e3552a12c6d9b85a44221c0bcc94aab46c0ca9



jsonp跨域实现代码



  document.onkeyup = function () {
    var val = text.value
    var script = document.createElement('script')
    script.src = `https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=${val}&cb=dosomething`;
    document.body.appendChild(script)
  }
  function dosomething (data) {
    var oUl = document.querySelector('#lists ul')
    oUl.innerHTML = ''
    data.s.map(function (html) {
      var oLi =  document.createElement('li')
      oLi.innerHTML = html
      oLi.onclick = function () {
        window.location.href = `http://www.baidu.com/s?wd=${html}`
      }
      oUl.appendChild(oLi)
    })
}

仅仅是一个利用jsonp实现跨域的简单小demo,便于和我一样的新手学习,其它结构和样式文件就不一一列出来了。


原文发布时间为:2018年06月25日

原文作者:行无忌
本文来源: 掘金    如需转载请联系原作者

相关文章
|
Java
百度搜索:蓝易云【hutool Http 工具发送POST请求的几种方式。】
以上是使用Hutool发送POST请求的几种方式。根据实际需求和代码复杂度,选择合适的方式来发送POST请求。
319 0
|
数据采集 JSON API
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
|
6月前
|
存储 NoSQL Redis
实现URL排行榜功能的基本思路
【6月更文挑战第17天】实现URL排行榜功能涉及收集页面访问次数(PV),排序和展示。使用Redis的键值存储和排序能力可简化此过程。示例中,URL作为键,访问次数为值,通过`incr`增计数,`ZADD`入有序集合并自动排序,`ZRANGE`获取高排名URL。以下Python代码展示了这一流程,但实际应用需考虑并发和数据准确性等复杂情况。
53 1
|
4月前
|
网络协议 前端开发 JavaScript
浏览器加载网页的幕后之旅:从URL到页面展示详解
【8月更文挑战第31天】当在浏览器地址栏输入URL并回车后,一系列复杂过程随即启动,包括DNS解析、TCP连接建立、HTTP请求发送、服务器请求处理及响应返回,最后是浏览器页面渲染。这一流程涉及网络通信、服务器处理和客户端渲染等多个环节。通过示例代码,本文详细解释了每个步骤,帮助读者深入理解Web应用程序的工作机制,从而在开发过程中作出更优决策。
74 5
|
7月前
|
缓存 网络协议 前端开发
面试题:浏览器中输入URL返回页面过程?
面试题:浏览器中输入URL返回页面过程?
110 0
|
XML JSON 数据格式
百度搜索:蓝易云【HTTP 中 POST 提交数据的四种方式详解】
以上四种方式都是常见的POST提交数据的方式,选择适当的方式取决于具体的需求和数据类型。在实际开发中,根据不同的场景和后端服务器的要求来选择合适的方式进行数据的提交和处理。
130 0
|
Web App开发 网络协议 网络安全
面试:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?
经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?
|
域名解析 存储 缓存
在浏览器从输入URL到页面加载完成都经历了什么/一个完整的URL解析过程详细介绍
在浏览器从输入URL到页面加载完成都经历了什么/一个完整的URL解析过程详细介绍
155 0
|
JavaScript 搜索推荐 API
JQuery+ajax实现类似百度搜索自动匹配功能
JQuery+ajax实现类似百度搜索自动匹配功能
371 0
JQuery+ajax实现类似百度搜索自动匹配功能
|
数据采集 Python
爬虫第二次笔记 解编码 使用get请求方式和post请求方式
爬虫第二次笔记 解编码 使用get请求方式和post请求方式
260 0
爬虫第二次笔记 解编码 使用get请求方式和post请求方式