Серверный кеш на Yahoo Weather API? - PullRequest
0 голосов
/ 31 мая 2011

Кажется, ошибка Yahoo Weather API в том, что каждый раз, когда я отправляю запрос, я получаю одну и ту же погоду. Что интересно, в ответе нет поля для отметки времени для определения времени погоды.

$ curl "http://weather.yahooapis.com/forecastjson?p=CHXX0099&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=CHXX0099&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=CHXX0099&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=CHXX0099&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. Вы также затронуты этой проблемой? Прежде чем я смогу найти официальную ссылку поддержки, что я могу сделать, чтобы закончить кэш на стороне сервера?

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

В вашем вопросе в опубликованном виде два примера Curl выглядят одинаково, но я полагаю, вы заметили, что возвращаемые данные различались в зависимости от вашего сетевого пути.

В этих ответах JSON есть некоторый уровень кэширования (я полагаю, 30 минут), но в вашей сети может быть дополнительное кэширование.

Одной из важных проблем является то, что данные прогноза погоды на бэкэнде обновляются с интервалами, потому что сам прогноз меняется не так часто.

На самом деле используемый вами интерфейс погоды JSON официально не поддерживается, но я полагаю, что он просто используется самой Yahoo на различных страницах.

Обратитесь к Yahoo! Страница погоды на YDN для "официального" поддерживаемого интерфейса. Сам по себе этот интерфейс не так полезен, потому что он только в формате XML. Вместо этого вы можете использовать консоль YQL для передачи вашего местоположения и получения обратно данных в формате JSON.

Например, попробуйте этот запрос: select * from 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": "<br />\n<b>Current Conditions:</b><br />\nFog, 30 F<BR />\n<BR /><b>Forecast:</b><BR />\nSat - Sunny. High: 50 Low: 28<br />\nSun - Sunny. High: 51 Low: 28<br />\n<br />\nFull Forecast at Yahoo! Weather<BR/><BR/>\n(provided by The Weather Channel)<br/>",
       "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"
       }
      }
     }
    }
   }
  }
 }
}
0 голосов
/ 31 мая 2011

Я не совсем уверен, применимо ли это здесь в равной степени, но общее решение для агрессивного кэширования IE для запросов GET заключается в добавлении параметра timestamp в запрос - поскольку значение изменяется каждый раз, когда выполняется запрос, каждый запрос выглядит уникальным.

Выберите имя параметра, которое вряд ли будет конфликтовать с параметрами API, и присвойте ему текущее время каждый раз, когда вы делаете запрос, и посмотрите, исправляет ли это что-то.

...