相信你们在使用jQuery异步请求非本身网站内相对资源(经过别人站点上的URL直接读取)使常常会遇到以下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让咱们开发路上遇到了拦路虎。html
当你直接在浏览器中请求:“http://www.weather.com.cn/adat/sk/101110101.html”时会获得你须要的json数据。json
当你经过jQuery的getJSON方法读取时你就会获得下列错误。跨域
Chrome提示错误:浏览器
XMLHttpRequest cannot load http://www.weather.com.cn/adat/sk/101110101.html. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.安全
火狐提示错误:异步
已阻止跨源请求:同源策略禁止读取位于 http://www.weather.com.cn/adat/sk/101110101.html 的远程资源。(缘由:CORS 头缺乏 'Access-Control-Allow-Origin')。测试
理解跨域首先必需要了解同源策略。同源策略是浏览器上为安全性考虑实施的很是重要的安全策略。网站
若是是本身开发的网站那就很简单,只须要在后台(C#)输出json的同时给Response增长一个Header头,开启容许跨域请求就能够完美的解决该问题。编码
C#后台只须要增长以下一句话便可:url
Response.AddHeader("Access-Control-Allow-Origin", "null");
若是是别人网站就没有办法了,只能借助后台进行处理,毕竟C#读取是不存在跨域问题的。C#读取以后,后台进行转换增长如上的响应头后输出,这样就能够跨域了。
该灵感源自:“eezzo.com”给个人。
固然对于那些没法自行开发的站长而言,能够直接调用eezzo.com的API进行直接转换,这样咱们就能够完美的解决jQuery在浏览器跨域请求时的问题了。下边贴出代码:
$(document).ready(function() { //测试跨域请求链接 var requestUrl = "http://www.weather.com.cn/adat/sk/101110101.html"; //这里必定要注意,实际请求的url实际上是以参数形式从eezzo.com读取的,所以咱们都要对url进行编码,使用encodeURI方法便可 $.getJSON("http://eezzo.com/API/CD", { url: encodeURI(requestUrl) }, function(json) { alert(json); }); });
经过以上代码咱们就能够轻松的获取各大网站提供的API数据了。经过跟踪获得实例所读取的json数据以下:
实现跨域有2种方法:
一、经过本身自行编写代码实现;
二、经过eezzo.com提供的API直接进读取,毕竟拿来主义仍是比较靠谱的
下边是测试中用到的获取天气json数据的一些资料
C# 获取天气 JSON解析 http://blog.csdn.net/ecocn/article/details/8542152
天气预报接口|API|城市代码 http://blog.csdn.net/a535537066/article/details/6656365