1.  json 是一种数据格式, jsonp 是一种数据调用的方式。你可以简单的理解为 带callback的json就是jsonp。

2. Python里面有个模块requests, requests.get('http://www.baidu.com')。把这段代码放到程序里面

3.创建app02备用:在terminal端输入 python manage.py startapp app02, 导入requests模块。

4.  这是一个关于天气情况的网址:http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityID=101121301。我们尝试用

requests.get 方法在页面上拿到它。

urls.py中写对应关系

from django.conf.urls import url
from django.contrib import admin
from app01 import views
from app02 import views as a2 urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^req/', a2.req),
url(r'^article-(?P<article_type_id>\d+)-(?P<category_id>\d+).html', views.article,name='article'),
]

views.py

req.html中写前端

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{result}}
</body>
</html>

页面效果:

5. 浏览器没有直接向天气接口发请求,而是向我们自己的URL发送了请求,我们自己的URL内部通过模块向远程进行发送了。所以说浏览器没有直接接触外部请求。

6. 尝试通过jQuery的ajax方法,越过中间的server,让浏览器直接发请求至天气接口。

7. 写req.html页面如下,用XMLHttpRequest来实现。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>后台获取的结果</h1>
{{result}}
<h1>js直接获取的结果</h1>
<input type="button" value="获取数据" onclick="getContent();"/>
<div id="container"></div>
<script>
function getContent(){
var xhr=new XMLHttpRequest();
xhr.open('GET','http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityID=101121301')
xhr.onreadystatechange=function(){
console.log(xhr.responseText);
};
xhr.send();
} </script>
</body>
</html>

运行结果:

8. 上述两种方法进行比较:第1种方法,没有经过浏览器,往别的域名发请求是允许的;第2种方法,经过了浏览器发请求是不允许的。

由于浏览器具有同源(本域名)策略,阻止了ajax请求。通过巧妙的机制可以绕开这个限制。

例如:<script src="//cdn.bootcss.com/jquery/3.1.1/core.js"></script> 就可以越过浏览器的这个限制。凡是具有src属性的标签都不受浏览器同源策略的影响。

9. 向我自己写的另外一个网站(另外的域名)发请求,默认也会受同源策略的阻止。下面通过实验验证。

9.1: 写URL

9.2: 写后端。

9.3: 修改端口。

9.4: 打开,查看可用的域名。

9.5:

9.6:把域名添加到allower_host里面。

9.7: 直接访问没有报错。

9.8:通过浏览器给自己发请求。

9.9: 以GET方式向别的域名发请求。

9.10:

10. 用一个巧妙的方法来解决

var tag=document.createElement('script');-------创建一个script标签。
            tag.src='http://wupeiqi.com:8001/jsonp.html?k1-v1&k2=v2'; -------向这个地址发请求。
            document.head.appendChild(tag);--------把script标签放到head里面。

修改req.html如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>后台获取的结果</h1>
{{result}}
<h1>js直接获取的结果</h1>
<input type="button" value="获取数据" onclick="getContent();"/>
<div id="container"></div>
<script>
function getContent(){
/*
var xhr=new XMLHttpRequest();
xhr.open('GET','http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityID=101121301')
xhr.onreadystatechange=function(){
console.log(xhr.responseText);
};
xhr.send();
*/
var tag=document.createElement('script');
tag.src='http://wupeiqi.com:8001/jsonp.html?k1-v1&k2=v2';
document.head.appendChild(tag);
}
</script>
</body>
</html>

页面效果:

11. 既然XMLHttprequest对象会受浏览器的影响,那么我们自己创建一个script标签放到这里就可以了。虽然访问成功了,但是返回的“OK”却没有意义,还会引起报错。

修改返回的内容,查看效果:

12. 到目前为止,通过JScript实现了跨域请求。返回的数据必须是符合JS格式的。

13. 目前为止,还没有变量去接收返回的数据。返回的字符串就叫:“callback( XXXX)”,相当于调用一个你自己写的那个callback函数。

100000相当于callback函数的实参。

所以需要自己定义一个callback函数

页面效果:拿到了这个返回的值。

14. 把callback函数改成一个动态的函数名。这样就可以区分不同的客户了。访问的时候就把自己的函数名也传过去。

func=request.GET.get('call')

return HttpResponse('call(1000000)')

页面效果:同上,没有报错。也返回了100000

15. 执行完以后,应该把script标签移除掉,让程序恢复原状。

document.head.removeChild(tag);

JSONP是用的最为广泛的跨域请求。

访问效果:

16. 一般情况下,函数名的key都叫callback,callback=要执行的那个函数名(例如:callback=list)。下面看一个示例,江西电视台的一个节目单。

17. JSONP只能发GET请求,不能发POST请求。因为所有的参数都放到了URL中的?后面了。

tag.src='http://wupeiqi.com:8001/jsonp.html?callback=list&k2=v2'

相当于通过JSONP伪造了一个ajax请求。上面的方式是通过原生的JS来写的。

下面讲怎么样通过jQuery的来写。

url:'http://www.jxntv.cn/data/jmd-jxtv2.html',
                type:'POST',
                dataType:'jsonp',   表示让$.ajax内部以jsonp的形式来发送请求。
                jsonp:'callback',     两句合起来相当于callback=list
                jsonpCallback:'list',   两句合起来相当于callback=list

req.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>后台获取的结果</h1>
{{result}}
<h1>js直接获取的结果</h1>
<input type="button" value="获取数据" onclick="getContent();"/>
<div id="container"></div>
<script src="/static/jquery-1.12.4.js"></script>
<script>
function getContent(){
/*
var xhr=new XMLHttpRequest();
xhr.open('GET','http://weatherapi.market.xiaomi.com/wtr-v2/weather?cityID=101121301')
xhr.onreadystatechange=function(){
console.log(xhr.responseText);
};
xhr.send();
*/
/*
var tag=document.createElement('script');
tag.src='http://wupeiqi.com:8001/jsonp.html?k1-v1&k2=v2';
document.head.appendChild(tag);
*/
$.ajax({
url:'http://www.jxntv.cn/data/jmd-jxtv2.html',
type:'POST',
dataType:'jsonp',
jsonp:'callback',
jsonpCallback:'list',
})
}
</script>
</body>
</html>

页面正常获得了结果

18. 允许某个域名进行访问。参考如下的老师博客。

Day25-JSONP跨域请求的更多相关文章

  1. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  2. JSONP跨域请求数据报错 “Unexpected token :”的解决办法

    原文  http://www.cnphp6.com/archives/65409 Jquery使用ajax方法实现jsonp跨域请求数据的时候报错 “Uncaught SyntaxError: Une ...

  3. jQuery ajax的jsonp跨域请求

    一直在听“跨域跨域”,但是什么是跨域呢?今天做了一些了解.(利用jQuery的jsonp) jQuery使用JSONP跨域 JSONP跨域是利用script脚本允许引用不同域下的js实现的,将回调方法 ...

  4. Django学习---jsonp跨域请求

    jsonp跨域请求 我们通过ajax进行跨域请求的时候,请求发送过去,但是在接受返回数据的时候浏览器会进行拦截. 这是由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源 ...

  5. jsonp跨域请求响应结果处理函数(python)

    接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...

  6. 原生JavaScript封装的jsonp跨域请求

    原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...

  7. Django 实现组合条件搜索、jsonp跨域请求

    1.类似于汽车之家的条件组合搜索那样 代码:http://pan.baidu.com/s/1nu7vZYD 2.jsonp实现跨域请求(在自己网页自动调用其他网站的接口,并将获取的数据呈现在自己网页上 ...

  8. jsonp 跨域请求

    背景: JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源 ...

  9. 使用JSONP跨域请求数据

    下面代码,可以使用JSONP进行跨域请求数据,Insus.NET记录以下,以备忘记.

  10. jQuery jsonp跨域请求

    跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 如果协议,端口和主机对于两个页面是相同的,则两个页面具 ...

随机推荐

  1. asp.net mvc session锁问题 (转载)

    一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...

  2. BZOJ2427: [HAOI2010]软件安装 tarjan+树形背包

    分析: 一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环! 有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断 ...

  3. 20155229《网络对抗技术》Exp9:Web安全基础

    实验内容 Webgoat实践下相关实验. 实验步骤 WebGoat: Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本 ...

  4. 20155304田宜楠《网络对抗技术》Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序 ...

  5. mfc CImageList和CListCtrl

    知识点: CImageList类的运用 CListCtrl添加图标 一.CImageList CImageList*SetImageList(CImageList*pImageList,int nIm ...

  6. java 读写ini配置文件

    ini配置文件 ;客户端配置[Client];客户端版本号version=0001;设备号devNum=6405 public final class ConfigurationFile { /** ...

  7. 蓝牙inquiry流程之Advertising Report

    setting 界面开始搜索的时候,通常也会同时进行le scan,这一点在inquiry流程之命令下发中已经讲述.此篇文章主要是分析一下对于controller 搜索到的广播包的处理.这里以Andr ...

  8. Python RASP 工程化:一次入侵的思考

    前言 今天讲的内容会很深,包括一些 Python的高级用法和一些自己创造的黑科技,前半部分内容你们可能听过,后半部分内容就真的是黑科技了... 深入的研究和思考,总会发现很多有意思的东西.每一次的研究 ...

  9. 轻量级直播服务器SRS安装及编译

    最近由于公司开发的需要--互动会议,开始研究直播中的技术.由于自身没有接触过虚拟机导致在研究的过程中遇到了很大的问题,首先官方GitHub给出的文档并没有清晰的指出编译是需要通过何种方式进行编译?以下 ...

  10. Zookeeper 通知更新可靠吗? 解读源码找答案!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由特鲁门发表于云+社区专栏 导读: 遇到Keepper通知更新无法收到的问题,思考节点变更通知的可靠性,通过阅读源码解析了解到zk Wa ...