#yahoo #weather #yahoo-api
#yahoo #Погода #yahoo-api
Вопрос:
Похоже, ошибка Yahoo Weather API в том, что каждый раз, когда я отправляю запрос, я получаю одну и ту же погоду. Что за интересный дизайн, в ответе нет поля временной метки для определения времени погоды.
$ curl "http://weather.yahooapis.com/forecastjson?p=CHXX0099amp;u=c" -v
* About to connect() to weather.yahooapis.com port 80 (#0)
* Trying 180.233.115.34... connected
* Connected to weather.yahooapis.com (180.233.115.34) port 80 (#0)
> GET /forecastjson?p=CHXX0099amp;u=c HTTP/1.1
> User-Agent: curl/7.21.3 (i386-redhat-linux-gnu) libcurl/7.21.3 NSS/3.12.9.0 zlib/1.2.5 libidn/1.19 libssh2/1.2.7
> Host: weather.yahooapis.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 31 May 2011 12:58:10 GMT
< Cache-Control: private, max-age=1200
< Expires: Tue, 31 May 2011 13:18:10 GMT
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json;charset=UTF-8
<
* Closing connection #0
{"units":{"temperature":"C","speed":"km/h","distance":"km","pressure":"mb"},"location":{"location_id":"CHXX0099","city":"Nanjing","state_abbreviation":"JI","country_abbreviation":"CH","elevation":3,"latitude":32,"longitude":118.80000000000000},"wind":{"speed":6.00000000000000,"direction":"N"},"atmosphere":{"humidity":"22","visibility":12.01000000000000,"pressure":1024.00000000000000,"rising":""},"url":"http://weather.yahoo.com/forecast/CHXX0099.html","logo":"http://l.yimg.com/a/i/us/nt/ma/ma_nws-we_1.gif","astronomy":{"sunrise":"06:22","sunset":"18:09"},"condition":{"text":"Sunny","code":"32","image":"http://l.yimg.com/a/i/us/we/52/32.gif","temperature":14.00000000000000},"forecast":[{"day":"Today","condition":"Mostly Clear","high_temperature":13.00000000000000,"low_temperature":3.00000000000000},{"day":"Tomorrow","condition":"Partly Cloudy","high_temperature":16.00000000000000,"low_temperature":5.00000000000000}]}
Однако, если я запрошу тот же интерфейс через VPN, возвращаемые данные будут в самый раз.
$ curl "http://weather.yahooapis.com/forecastjson?p=CHXX0099amp;u=c" -v
* About to connect() to weather.yahooapis.com port 80 (#0)
* Trying 180.233.115.34... connected
* Connected to weather.yahooapis.com (180.233.115.34) port 80 (#0)
> GET /forecastjson?p=CHXX0099amp;u=c HTTP/1.1
> User-Agent: curl/7.21.3 (i386-redhat-linux-gnu) libcurl/7.21.3 NSS/3.12.9.0 zlib/1.2.5 libidn/1.19 libssh2/1.2.7
> Host: weather.yahooapis.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 31 May 2011 12:58:10 GMT
< Cache-Control: private, max-age=1200
< Expires: Tue, 31 May 2011 13:18:10 GMT
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json;charset=UTF-8
<
* Closing connection #0
{"units":{"temperature":"C","speed":"km/h","distance":"km","pressure":"mb"},"location":{"location_id":"CHXX0099","city":"Nanjing","state_abbreviation":"JI","country_abbreviation":"CH","elevation":3,"latitude":32,"longitude":118.80000000000000},"wind":{"speed":6.00000000000000,"direction":"N"},"atmosphere":{"humidity":"22","visibility":12.01000000000000,"pressure":1024.00000000000000,"rising":""},"url":"http://weather.yahoo.com/forecast/CHXX0099.html","logo":"http://l.yimg.com/a/i/us/nt/ma/ma_nws-we_1.gif","astronomy":{"sunrise":"06:22","sunset":"18:09"},"condition":{"text":"Sunny","code":"32","image":"http://l.yimg.com/a/i/us/we/52/32.gif","temperature":14.00000000000000},"forecast":[{"day":"Today","condition":"Mostly Clear","high_temperature":13.00000000000000,"low_temperature":3.00000000000000},{"day":"Tomorrow","condition":"Partly Cloudy","high_temperature":16.00000000000000,"low_temperature":5.00000000000000}]}
Лично я думаю, что это что-то связанное с Varnish или Squid. На вас также влияет эта проблема? Прежде чем я смогу найти официальную ссылку поддержки, что я могу сделать, чтобы срок действия кэша на стороне сервера истек?
Ответ №1:
В вашем опубликованном вопросе два примера Curl выглядят идентично, но я полагаю, вы заметили, что возвращаемые данные отличались в зависимости от вашего сетевого пути.
Существует некоторый уровень кэширования этих ответов JSON (я полагаю, 30 минут), но в вашей сети может быть дополнительное кэширование.
Одна из важных проблем заключается в том, что данные прогноза погоды на серверной части обновляются с определенной периодичностью, поскольку сам прогноз меняется не так часто.
Фактически, используемый вами интерфейс погоды в формате JSON официально не поддерживается, но я полагаю, что он просто используется самой Yahoo на различных страницах.
Обратитесь к Yahoo! Страница погоды на YDN для «официального» поддерживаемого интерфейса. Сам по себе этот интерфейс не столь полезен, поскольку он представлен только в формате XML. Вместо этого вы могли бы использовать консоль YQL для передачи вашего местоположения и получения обратно данных в формате JSON.
Например, попробуйте этот запрос: выберите * из weather.bylocation, где location=»Нанкин, CN». В результатах обратите внимание на lastBuildData
значение, при котором прогноз обновлялся в последний раз:
{
"query": {
"count": 1,
"created": "2011-12-30T20:03:17Z",
"lang": "en-US",
"results": {
"weather": {
"rss": {
"version": "2.0",
"geo": "http://www.w3.org/2003/01/geo/wgs84_pos#",
"yweather": "http://xml.weather.yahoo.com/ns/rss/1.0",
"channel": {
"title": "Yahoo! Weather - Nanjing, CN",
"link": "http://us.rd.yahoo.com/dailynews/rss/weather/Nanjing__CN/*http://weather.yahoo.com/forecast/CHXX0099_f.html",
"description": "Yahoo! Weather for Nanjing, CN",
"language": "en-us",
"lastBuildDate": "Sat, 31 Dec 2011 3:00 am CST",
"ttl": "60",
"location": {
"city": "Nanjing",
"country": "China",
"region": ""
},
"units": {
"distance": "mi",
"pressure": "in",
"speed": "mph",
"temperature": "F"
},
"wind": {
"chill": "25",
"direction": "90",
"speed": "4"
},
"atmosphere": {
"humidity": "83",
"pressure": "30.45",
"rising": "2",
"visibility": "0.99"
},
"astronomy": {
"sunrise": "7:03 am",
"sunset": "5:09 pm"
},
"image": {
"title": "Yahoo! Weather",
"width": "142",
"height": "18",
"link": "http://weather.yahoo.com",
"url": "http://l.yimg.com/a/i/brand/purplelogo//uh/us/news-wea.gif"
},
"item": {
"title": "Conditions for Nanjing, CN at 3:00 am CST",
"lat": "32.05",
"long": "118.78",
"link": "http://us.rd.yahoo.com/dailynews/rss/weather/Nanjing__CN/*http://weather.yahoo.com/forecast/CHXX0099_f.html",
"pubDate": "Sat, 31 Dec 2011 3:00 am CST",
"condition": {
"code": "20",
"date": "Sat, 31 Dec 2011 3:00 am CST",
"temp": "30",
"text": "Fog"
},
"description": "
nCurrent Conditions:
nFog, 30 F
n
Forecast:
nSat - Sunny. High: 50 Low: 28
nSun - Sunny. High: 51 Low: 28
n
nFull Forecast at Yahoo! Weather
n(provided by The Weather Channel)
",
"forecast": [
{
"code": "32",
"date": "31 Dec 2011",
"day": "Sat",
"high": "50",
"low": "28",
"text": "Sunny"
},
{
"code": "32",
"date": "1 Jan 2012",
"day": "Sun",
"high": "51",
"low": "28",
"text": "Sunny"
}
],
"guid": {
"isPermaLink": "false",
"content": "CHXX0099_2012_01_01_7_00_CST"
}
}
}
}
}
}
}
}
Ответ №2:
Я не совсем уверен, применимо ли это здесь в равной степени, но распространенным решением для агрессивного кэширования IE для запросов GET является добавление параметра timestamp в запросе — поскольку значение меняется каждый раз, когда выполняется запрос, каждый запрос выглядит уникальным.
Выберите имя параметра, которое вряд ли будет конфликтовать с параметрами API, и устанавливайте его на текущее время каждый раз, когда вы делаете запрос, и посмотрите, исправит ли это ситуацию.
Комментарии:
1. Спасибо. Я тестировал со случайным параметром, но он не работает для сплошного кэша Yahoo : (