jsonp是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。
借助script标签,实现跨域请求,示例:
所以只是单纯的返回一个也没有什么意义,我们需要的是数据
如下:可以返回一个字典,不过也可以返回其他的(简单的解决了跨域,利用script)
项目一:
项目一
jsonp
$(".send_jsonp").click(function() {
$.ajax({
url:"",
success:function(data) {
console.log(data)
}
})
});functionfunc(arg) {
console.log(arg)
}
项目二:
defajax_send2(request):importjsonprint(222222)#return HttpResponse("func(\'name\')")
s = {"name":"dylan","age":18}#return HttpResponse("func(\'name\')")
return HttpResponse("func(\'%s\')"%json.dumps(s))#返回一个func()字符串,正好自己的ajax里面有个func函数,就去执行func函数了,arg就是传的形参
这回访问项目一就取到值了:
这其实就是JSONP的简单实现模式,或者说是JSONP的原型:创建一个回调函数,然后在远程服务上调用这个函数并且将JSON 数据形式作为参数传递,完成回调。
将JSON数据填充进回调函数,这就是JSONP的JSON+Padding的含义。
2. jQuery对JSONP的实现:
项目一:
from flask importFlaskfrom flask importrender_template,redirect,request,jsonify
app= Flask(__name__)
@app.route("/p1",methods=[\'POST\',\'GET\'])defp1():return render_template(\'p1.html\')if __name__ == \'__main__\':
app.run(host=\'127.0.0.1\',port=80)
p1.py
p1.html:
项目一
jsonp
$(".send_jsonp").click(function() {
$.ajax({
url:"http://127.0.0.1:8080/ajax_send2",//去请求项目二中的url
dataType:"jsonp",
jsonp:\'callbacks\',
success:function(data) {
console.log(data)
}
})
});{##}
jsonp: \'callbacks\'就是定义一个存放回调函数的键,jsonpCallback是前端定义好的回调函数方法名\'SayHi\',server端接受callback键对应值后就可以在其中填充数据打包返回了;
jsonpCallback参数可以不定义,jquery会自动定义一个随机名发过去,那前端就得用回调函数来处理对应数据了。利用jQuery可以很方便的实现JSONP来进行跨域访问。
注意 JSONP一定是GET请求
项目二:p2.py
from flask importFlaskfrom flask importrender_template,redirect,request,jsonify
app= Flask(__name__)
@app.route("/ajax_send2",methods=[\'POST\',\'GET\'])defajax_send2():importjsonprint(222222)#return HttpResponse("func(\'name\')")
s = {"name":"dylan","age":18}#return HttpResponse("func(\'name\')")
callbacks = request.values.get("callbacks") #注意要在服务端得到回调函数名的名字
printcallbacksreturn "%s(\'%s\')" %(callbacks, json.dumps(s))if __name__ == \'__main__\':
app.run(host=\'0.0.0.0\',port=8080)