jsonp跨域问题【主要解决的是返回状态码是200,但是js脚本仍然是执行error模块问题】

我jsonp的坑在这里:

最终发现后台传回来的数据是这样的 


参照此文章跨域请求之jQuery的ajax jsonp的使用解惑 http://www.cnblogs.com/know/archive/2011/10/09/2204005.html解决问题,

原因是返回的数据中不能有" ",正确返回的数据是这样的,如下图所示:


概述:

1、首先要了解什么是域?

2、为什么要跨域,跨域能解决什么问题?

3、jsonp

4、jsonp支持POST请求吗?  不支持,只支持GET请求,除非其他办法,未知

5、jquery对jsonp的支持

6、ajax 和jsonp 不是一码事 细读详解http://blog.youkuaiyun.com/superhosts/article/details/9057301

什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域。跨域,就是在一个域中访问另一个域的数据。

如果只是加载另一个域的内容,而不需要访问其中的数据的话,跨域是很简单的,比如使用iframe。但如果需要从另一个域加载并使用这些数据的话,就会比较麻烦。为了安全性,浏览器对这种情况有着严格的限制,需要在客户端和服务端同时做一些设置才能实现跨域请求。

JSONP简介
JSONP(JSON with Padding)是一种常用的跨域手段,但只支持JS脚本和JSON格式的数据。顾名思义,JSONP是利用JSON作为垫片,从而实现跨域请求的一种技术手段。其基本原理是利用HTML的<script>标签天生可以跨域这一特点,用其加载另一个域的JSON数据,加载完成后会自动运行一个回调函数通知调用者。此过程需要另一个域的服务端支持,所以这种方式实现的跨域并不是任意的。

JQuery对JSONP的支持
JQuery的Ajax对象支持JSONP方式的跨域请求,需要像此文章http://www.jb51.net/article/75768.htm【此文章有自己实现jsonp,可以学习】说的,必须加上crossDomain: true,否则报错。


自己完整jquery框架中的js实现jsonp跨域请求并处理返回值:【仅供参考,标红字段必须含有】:

注意:后台传回来的数据必须是 回调函数名(json格式数据)  切记"回调函数名(正确的json格式数据)"    返回这种格式数据一定是错误的,不能有双引号

后台repsonse设置【标注紫红的两个参数必须设置,一个是响应类型,另一个是允许所有ip访问】:

def rep(value)://进入的value已经是json格式的数据
    print value,'<------------->response'
    response = HttpResponse(value)
    response.__setitem__("Content-Type", "text/plain")
    response.__setitem__("Access-Control-Allow-Origin", "*")
    return response
js脚本截图:

<script type="text/javascript">
        function loadData() {
        	$.ajax({
                type:"GET",//请求方式:GET
                async :false,//是否异步:否
                cache:false,//是否缓存:否
                timeout: 200,//请求超时响应:200s
                url: "http://localhost:8000/dataservice/APPINSTALL",//请求url
                data: {"cid":"test","ssk":"c8ff727c44cc49e9093f487cf022cdcb568b82f6"},//请求参数
                dataType:"jsonp",//数据类型:jsonp
                crossDomain: true,//是否跨域:是
                jsonp: "callback",//callback或者jsoncallback或者jsonpcallback;传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
                jsonpCallback: "my",//自定义jsonp回调函数名称,可以随意起名,或者根据项目规范命名,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据;ruo自定义的函数名是js中的function会执行下面函数function
                complete: function() {
                    //hideLoadingMsg(); // 数据获取完成后,需要做的事,此为隐藏读取数据的滚动条。
                },
                success: function (json) {//请求成功:此处传回来的数据为:my({'msg': 'OK', 'code': 0, 'data': {'appinstall': '2000'}})
		            if (json.msg=='OK' && json.code == "0") {
		            	var html=JSON.stringify(json.data);
	                    $("#result").html(html);
		            }
		            else {
		                //显示错误信息
		                //var errorMessage = json.errors;
		                //alert(errorMessage);
		            }
       		 },
		         error: function (XMLHttpRequest, textStatus, errorThrown) {//请求异常:网络断开或者
		            alert("请求数据异常,状态码:" + XMLHttpRequest.status);
		         }
            });
        }
        function OnGetMemberSuccessByjsonp(data) {
            alert(data);
            //if(o.data) alert(eval(o.data));//在eval执行一次回调函数
			//else{//o为实际返回的JSON对象了
		      //alert(o.statuses[0].created_at)
   		   // }
        }
        function jsonp(data){
            return data;
        }

        $(document).ready(function(){
            loadData();
        });

    </script>


==============================

调用其他公司已经实现的API,完成音乐播放功能(包括获取音乐列表和音乐,有代码供下载)

jQuery+JSONP通过调用虾米接口实践

http://caibaojian.com/jquery-jsonp-xiami-api.html






Vue是一款非常流行的JavaScript框架,而Axios是一个基于Promise的HTTP客户端工具库。然而,在使用Vue和Axios时,我们可能会遇到问题。当我们从一个名发送HTTP请求到另一个名时,由于浏览器的同源策略限制,会产生问题Jsonp是一种解决问题的方法之一。 Jsonp全称为JSON with Padding,它通过在前端创建一个script标签,并设置其src属性为包含回调函数的URL,来实现请求。服务器在收到请求后,将返回一个JavaScript函数调用,并将数据作为参数传入该函数中。这样,前端页面就可以通过定义该回调函数,获取到服务器返回的数据。 在Vue中使用Axios发送Jsonp请求,可以通过设置Axios的`params`选项来实现。具体步骤如下: 1. 首先,在Vue项目中安装Axios库:`npm install axios` 2. 然后在Vue组件中引入Axios:`import axios from 'axios'` 3. 创建一个方法来发送Jsonp请求: ```javascript methods: { fetchData() { axios({ method: 'jsonp', url: 'http://example.com/api', params: { callback: 'jsonpCallback', // 回调函数名 } }) .then(response => { console.log(response.data); // 获取到服务器返回的数据 }) .catch(error => { console.log(error); }); } } ``` 4. 在上述代码中,通过设置`params`属性将回调函数名传递给服务器。服务器在返回数据时,会将回调函数名拼接到返回数据的尾部。 5. 最后,在模板或其他地方调用该方法,即可发送Jsonp请求来获取数据。 需要注意的是,由于Jsonp使用`<script>`标签加载数据,因此只能发送GET请求。同时,为了保证安全性,我们需要对返回的数据进行校验和过滤,以防止恶意注入脚本。 以上就是通过Vue和Axios发送Jsonp请求来解决问题的方法。希望这能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值