使用Ember调用Dark Sky天气API时遭遇404错误,求排查原因
解决Dark Sky API请求404错误的问题
首先,你的核心问题是请求URL的格式不符合Dark Sky API的要求,这直接导致了404错误。我们来一步步拆解和修复:
1. 错误的URL结构分析
你当前的请求URL是:
https://api.darksky.net/forecast?key=secretString&latitude=42.361145&longitude=-71.057083&time=1525213510
但Dark Sky API要求把API密钥、经纬度(可选带时间)作为路径参数,而不是查询参数(?key=xxx这种形式)。
2. 正确的URL格式
正确的请求URL格式应该是:
https://api.darksky.net/forecast/[你的API密钥]/[纬度],[经度],[时间]
对应你的参数,正确的URL应该是:
https://api.darksky.net/forecast/secretString/42.361145,-71.057083,1525213510
3. 调整Ember Data的请求配置
因为你用了Ember Data,需要修改适配器来生成符合要求的URL。比如创建一个针对天气模型的适配器(假设模型名为weather):
// app/adapters/weather.js import DS from 'ember-data'; export default DS.JSONAPIAdapter.extend({ host: 'https://api.darksky.net', pathForType() { return 'forecast'; }, urlForFindRecord(id, modelName, snapshot) { // 建议将API密钥存到环境变量,不要硬编码 const apiKey = 'secretString'; const { latitude, longitude, time } = snapshot.record; return `${this.host}/${this.pathForType()}/${apiKey}/${latitude},${longitude},${time}`; } });
4. 修复模型代码的小错误
你的模型里temperature属性少了DS.attr方法,应该修改为:
import DS from 'ember-data'; export default DS.Model.extend({ temperature: DS.attr('number'), // 补上DS.attr summary: DS.attr('string'), icon: DS.attr('string') });
额外提醒
- 不要把API密钥硬编码到代码里,建议用Ember的环境变量(
config/environment.js)管理,比如在配置文件里添加ENV.darkSkyApiKey = '你的密钥',再在适配器里引用this.get('darkSkyApiKey')。 - 注意Dark Sky API已被Apple收购,后续可能有服务变更,留意官方的最新说明。
内容的提问来源于stack exchange,提问作者user6506263
相关产品推荐
相关产品推荐

