`
IT小菜菜
  • 浏览: 6824 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

json、jsonp跨域请求数据小结

    博客分类:
  • ajax
阅读更多

         环境:DotNet4.5 MVC4.0

         最近在做项目的时候遇到跨域请求的问题,主要是对json和jsonp的使用,做个小总结,小的初学,请各位大牛轻虐。

        就环境而言呢,实际上项目是部署在同一服务器上的几个solution,现在的需求是想要访问另一solution中的API,返回Json(model,jsonbehavior.allowget)。满怀自信的写好ajax,type=“get”,data-type=“json”,url=“xxx.xxx.xxx.xxx/api/func",然后处理下success的json数据,append的到页面上,启动,一气呵成,OK,显示正常,发布部署到服务器,浏览,数据为空,呵呵了。

        看了下发现我的电脑用的是IE11,服务器是IE9,浏览器不兼容,好的,找个IE9的电脑,调试下程序,在ajax的error事件里抛出statusTXT,报”NO Tranport“异常,果断问度娘,找到一句话,jquery.support.cors=true;启动,数据出来了,NICE,打完收工。

        第二天bos说IE6报js错误,叫喊蛋碎一地,自己试了下,发现除了IE9+,其他浏览器均无法显示数据,Very Very Nice,然后各种调试,get、post和json、html各种组合,全部NO反应,看来跨域请求json数据还是有点不同的,基于同源策略的蛋疼特性,所以转投jsonp的怀抱。

        研究以后,这里先说明一下jsonp和json的区别,虽然被jquery打包塞进了ajax的数据类型中,不过严格来说jsonp并不是一种数据格式,而是一种数据访问的方式,被某些大牛利用html一些特性做出来主要用于跨域数据传递的解决。由于同源策略的限制,页面使用的资源通常只能访问本域内有的,但是某些标签除外,比如说<script>和<iframe>标签中的src属性,使得它们可以直接跨域调用资源,比如说引用Jquery.min.js,我们可以直接引用google的js,而jsonp就是利用这种特性来进行跨域资源访问的。

        查了查jquery的api,主要多了个callback参数,用于传递回调方法的名称,大爷的,关键部分不说。好吧,先试试,直接把数据格式改成jsonp,启动,JS报错,返回的json数据冒号附近有语法错误,缺少分号”;“。咦,难道是我api里返回的json数据格式冗余?好的,各种精简,没有的全部干掉,需要啥返回啥,再次运行,一样报错,哭好吧,上网查。

        注意到网上的一些处理方法,服务器接到请求后在js里生成类似于<script>object{"xxx":"xxx"}</script>的html语句块,突然意识到上面说的,jsonp是利用<script>的src特性来完成跨域数据访问的,所以这里返回的应该是javascript而不是直接返回json,但是网上是在js里用createElement生成的html,难道我要在Controller里手动拼接?nope,这里用了一个webapi JavaScriptSerializer,使用Serialize方法直接将数据处理为javascript,然后response回去,类似于json api的序列化方法。生成启动,OK,数据出来了,试了搜狗、火狐、360浏览器,全部没有问题,奶奶的,终于可以歇口气了,上个厕所去,回见。

 

补充说明:

       经过一段时间的使用,这里再详细说明一下jsonp的使用特性,上文已经说明,使用jsonp请求json数据实际上实在请求跨域的js资源,你可以返回字符串,datatable等等,那么返回的数据会作为js加载到页面当中,比如说我返回一个string:“hello world”,那么实际上在页面的脚本上添加了下面这样的东西。

<script>
 hello world
</script>
 同样,如果我们json的数据那么它在页面加载的结果就是:
<script>
{string:"hello world"}
</script>
 显而易见,这必然是报错的结果,我们肯定不能直接在写js的时候写一个字符串上去,那么如何解决这个问题,这就是为什么要传一个callback参数过去。如何把这个字符串放到js上而且不报错,还要为我们所用,那么需要我们把它当成一个方法的参数传回来,而这个方法就是我们指定的callback参数,即回调函数。实际上我们可以把这个回调函数先放一边,假设我们传回来这样一个字符串"fun('hello world')",那么在页面加载的js就是
<script>
fun("hello world")
</script>
 那么我们要做的就是提前定义好一个方法fun(string){},至于json该怎么用就显而易见了吧。那么大多数情况下API可能不是我们自己写的,我们不能要求那边每次按我们的要求返回什么样的字符串,所以就要用到callback参数,就是提前把我们想让他返回结果后调用的方法传给他,那么他就可以通过request解析到这个方法名,然后拼出结果返回给我们就可以了。

 

       上面我用了一个webAPI来将json字符串解析为js,然后就可以直接返回到ajax请求的success(string)方法里,其实原理是一样的,只是某些操作被jquery自动执行了。如果我们不指定callback参数的值,其实jquery会帮我们自动生成一个,类似于“jquery000000000”,后面的这些数字是用来唯一区别的,至于是时间戳还是什么的我就没有去研究了,通过上面的webAPI自动帮我们解析,传回结果,然后这个方法会替代success方法执行,好处就是不用我们自己去想一个方法名了,看起来就和普通的ajax请求很像了。

分享到:
评论
2 楼 IT小菜菜 2014-11-01  
我重新加了点说明,你先看下?
1 楼 wf_wangfeng 2014-10-31  
$.ajax({
             type: "get",
             async: false,
             url: "http://z.cn",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
             jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
             contentType: "application/x-www-form-urlencoded; charset=utf-8",
             complete: function(xhr, status) {
            alert("complete--"+xhr.getResponseHeader("Date") );
             },
             success: function(json){
             alert("success");
             },
             error: function(){
                 alert('fail');
             }
         });

这个是我的代码,一直进error,是什么原因,求指点。。

相关推荐

    AJax与Jsonp跨域访问问题小结

    AJAX与JSONP跨域访问问题小结 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术。它通过使用XMLHttpRequest对象来与服务器进行异步通信。XMLHttpRequest对象...

    jsonp解决跨域.docx

    JsonP(JSON with Padding)是一种常用的解决跨域请求的技术。在本文中,我们将详细介绍 JsonP 的原理、作用、优缺点和使用场景。 1. 什么是跨域? 跨域是指在不同域名或端口号之间的请求调用。例如,...

    json与jsonp知识小结(推荐).docx

    ### JSON与JSONP知识点详解 #### 一、JSON简介 ...JSON提供了结构化的数据格式,而JSONP则是在特定场景下(主要是跨域请求)的一种解决方案。理解和掌握这两种技术对于开发高效可靠的Web应用至关重要。

    springboot+jsonp解决前端跨域问题小结

    在后端合理配置JSONP请求处理,并在前端正确设置请求参数,即可实现跨域请求数据的获取。这一技术实现简单,兼容性好,但也有一定的局限性,比如只支持GET请求,且对安全性有一定要求的场景可能不适用。在安全性要求...

    node跨域请求方法小结

    JSONP和CORS是两种常见的解决浏览器同源策略限制,实现Node.js服务器进行跨域请求的方法。 1. JSONP(JSON with Padding): JSONP是一种老式的跨域解决方案,适用于GET请求。它利用了浏览器允许`&lt;script&gt;`标签...

    js跨域问题小结

    CORS可以处理所有类型的HTTP请求,包括POST、PUT等,同时提供了预检请求(OPTIONS)机制,确保了跨域请求的安全性。 3. document.domain:这种方法适用于顶级域名相同,子域名不同的情况。通过设置`document.domain...

    json与jsonp知识小结(推荐)

    JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON常用于Web应用开发中,用以实现服务器与客户端之间的数据传输。JSON数据可以包含以下类型:数字(整数或浮点数)、字符串(必须...

    简单介绍jsonp 使用小结

    同源策略是为了防止恶意脚本通过跨域请求获取敏感数据,但这也限制了Web应用的灵活性。 然而,JSONP巧妙地利用了HTML `&lt;script&gt;` 标签的跨域特性来规避这一限制。因为浏览器不会对`&lt;script&gt;`标签的`src`属性执行...

    详解vue-cli项目中的proxyTable跨域问题小结

    总之,Vue CLI 的 `proxyTable` 是一种方便的开发环境跨域解决方案,它使得开发者能够在本地开发时,无需修改后端接口即可进行跨域请求,提高了开发效率。然而,在生产环境中,通常需要依赖 CORS 或其他跨域策略来...

    ajax小结

    **Ajax小结** Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,...

    ajax开发详解.rar

    小结 Ajax技术极大地提升了网页的交互性和用户体验,通过JavaScript实现了局部刷新,减少了服务器负担。理解并掌握Ajax的基本原理和使用方式,是现代Web开发的重要技能。在实际开发中,还需关注性能优化、错误处理...

    jquery 相关问题

    在提供的文档《Ajax请求小结.doc》中,可能包含了关于jQuery如何处理Ajax请求的详细总结,包括不同类型的请求(GET、POST等)、请求参数设置、错误处理以及与其他jQuery方法的集成等内容。通过阅读这份文档,你可以...

    Jquery中$.post和$.ajax的用法小结

    对于JSONP,这是一种跨域请求的解决方案,jQuery会动态插入一个`&lt;script&gt;`标签来加载返回的JavaScript代码。 `beforeSend`允许在请求发送之前进行一些预处理,比如添加自定义HTTP头。`success`、`complete`和`error...

    Ajax的小贴士使用小结

    6. **JSONP (JSON with Padding)**:对于跨域请求,由于同源策略限制,可以利用JSONP机制,通过动态创建`&lt;script&gt;`标签来实现数据交换。 7. **局部刷新和用户体验**:Ajax的核心优势在于它可以提供局部刷新,提升...

    python入门到高级全栈工程师培训 第3期 附课件代码

    03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和数据链路层 08 网络层和arp协议 09 传输层和应用层 第2章 01 上节课复习 02 arp协议复习 03 字符编码 第3章 01 网络基础和dos命令 02 为何学习...

Global site tag (gtag.js) - Google Analytics