我从wunderground样本JSON网址:
var url = "http://api.wunderground.com/api/<API_KEY>/conditions/q/CA/San_Francisco.json";
其输出JSON是:
{"response":{"version":"0.1","termsofService":"http://www.wunderground.com/weather/api/d/terms.html","features":{"conditions":1}},"current_observation":{"image":{"url":"http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png","title":"Weather Underground","link":"http://www.wunderground.com"},"display_location":{"full":"San Francisco, CA","city":"San Francisco","state":"CA","state_name":"California","country":"US","country_iso3166":"US","zip":"94101","magic":"1","wmo":"99999","latitude":"37.77500916","longitude":"-122.41825867","elevation":"47.00000000"},"observation_location":{"full":"SOMA - Near Van Ness, San Francisco, California","city":"SOMA - Near Van Ness, San Francisco","state":"California","country":"US","country_iso3166":"US","latitude":"37.773285","longitude":"-122.417725","elevation":"49 ft"},"estimated":{},"station_id":"KCASANFR58","observation_time":"Last Updated on January 15, 12:12 PM PST","observation_time_rfc822":"Wed, 15 Jan 2014 12:12:06 -0800","observation_epoch":"1389816726","local_time_rfc822":"Wed, 15 Jan 2014 12:12:10 -0800","local_epoch":"1389816730","local_tz_short":"PST","local_tz_long":"America/Los_Angeles","local_tz_offset":"-0800","weather":"Partly Cloudy","temperature_string":"69.8 F (21.0 C)","temp_f":69.8,"temp_c":21.0,"relative_humidity":"28%","wind_string":"From the WNW at 2.0 MPH","wind_dir":"WNW","wind_degrees":295,"wind_mph":2.0,"wind_gust_mph":0,"wind_kph":3.2,"wind_gust_kph":0,"pressure_mb":"1026","pressure_in":"30.29","pressure_trend":"-","dewpoint_string":"35 F (2 C)","dewpoint_f":35,"dewpoint_c":2,"heat_index_string":"NA","heat_index_f":"NA","heat_index_c":"NA","windchill_string":"NA","windchill_f":"NA","windchill_c":"NA","feelslike_string":"69.8 F (21.0 C)","feelslike_f":"69.8","feelslike_c":"21.0","visibility_mi":"10.0","visibility_km":"16.1","solarradiation":"--","UV":"3","precip_1hr_string":"0.00 in (0 mm)","precip_1hr_in":"0.00","precip_1hr_metric":" 0","precip_today_string":"0.00 in (0 mm)","precip_today_in":"0.00","precip_today_metric":"0","icon":"partlycloudy","icon_url":"http://icons-ak.wxug.com/i/c/k/partlycloudy.gif","forecast_url":"http://www.wunderground.com/US/CA/San_Francisco.html","history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=KCASANFR58","ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=37.773285,-122.417725"}}
那么现在我们如何想获得这个输出!?我们有2个不同的解决方案:
1-旧解决方案是使用AJAX来获取JSON作为一个字符串,然后解析它作为一个对象,像这样:
GET_JSON = function(callback){
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.onreadystatechange = function(){
if(this.readyState==4){
callback(JSON.parse(req.responseText));
}
}
req.send(null);
}
JSONCallback = function(JSONObj){
alert(JSONObj);
};
GET_JSON(JSONCallback);
但这里的问题是,如果你这样做,在你的网站,你将面临与此错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://mydomain.com' is therefore not allowed access.
2-没问题,wunderground weather api
支持JSONP
,它会帮助我们解决这个问题,我们必须只需打个电话JSONP
,棘手的点这里是的,我们不会使用定期ajax解决方案了:
GET_JSON = function(callback){
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url + "?callback=" + callback;
document.body.appendChild(script);
}
window.JSONCallback = function(JSONObj){
alert(JSONObj);
};
GET_JSON("JSONCallback");
有一个非常棘手的一点是非常重要的。如果您检查最后一行而不是将回调对象作为参数传递,我已经传递了它的名称,为什么?
答案是,如果我们想要有一个JSONP调用,我们必须将0123.queryString的回调函数名称传递给它。像这样:
url = "http:// ... .json?callback=JSONCallback";
,这是所有你需要知道要访问您的JSON对象,没有你需要解析的字符串。
您不需要使用window.open或iframe来请求JSON。您将需要使用XMLHttpRequest对象,并希望它们支持CORS,因为有相同的源策略。如果没有,希望他们支持JSONP。 – epascarello
您需要使用AJAX,并在'onreadystatechange'函数中调用'JSON.parse'并将您想要的内容写入新窗口。由于AJAX同源策略,您可能无法执行此操作,因此您可能需要在服务器上使用代理功能。 – Barmar
为什么使用iFrame来代替AJAX调用?你确定他们的API允许跨域请求吗?如果他们不这样做,那么您需要在服务器上使用代理脚本。 –