Можно ли заставить YQL возвращать несколько результатов JSON с сайта в одном запросе? - PullRequest
2 голосов
/ 20 декабря 2011

В настоящее время я использую этот запрос YQL (Yahoo Query Language) для преобразования JSON с сайта в JSONP:

select * from json where url="http://airportcode.riobard.com/airport/ABC?fmt=JSON"

ABC - это параметр.

Так что я знаю, что YQL разработан так, чтобы быть похожим на SQL, и я думаю, что есть некоторая функция, которая позволяет вам делать объединения, но я не уверен, что будет возможно использовать эти функции, чтобы объединить несколько запросов к этому сайту кода аэропорта в один запрос. (Сайт не поддерживает это, и владелец сайта не ответил на мой запрос по электронной почте.)

По сути, мне нужен YQL-запрос, который будет получать не только результаты для ABC, но и для ABC, XYZ, FOO за один вызов. Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Вы также можете использовать таблицу uritemplate для преобразования кодов аэропортов в группу URL-адресов, которые затем могут быть переданы в таблицу json.

Коды аэропортов для URL

Таблица uritemplate принимает «шаблон» и любое количество значений для заполнения этого шаблона. (См. Также, Шаблон URI черновик).

В этом случае потребности просты, просто введите код аэропорта в нужное место.

select * from uritemplate where
template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON"
and airport in ("SFO", "LAX", "LHR")

( Попробуйте этот запрос в консоли YQL )

Это дает следующий результат (diagnostics информация удалена для простоты).

result of query

Получение результатов JSON по этим URL-адресам

Теперь, когда у нас есть список URL-адресов, достаточно просто использовать таблицу json для извлечения JSON для каждого из них, используя sub-select . Фактически, мы уже использовали вышеупомянутый подвыбор, распознаваемый синтаксисом in (…).

select * from json where url in (
    select url from uritemplate 
    where template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON" 
    and airport in ("SFO", "LAX", "LHR")
)

( Попробуйте этот запрос в консоли YQL )

Результат на этот раз выглядит так.

query result

Простой запрос

Я большой поклонник псевдонимов запросов YQL (и связанных подстановок переменных , таких как @var), которые могут предоставить вам удобные конечные точки для доступа без необходимости встраивать YQL-запрос в URL. Ссылка выше описывает, как их создавать, и в результате вы можете получить YQL-запрос, подобный приведенному ниже.

select * from json where url in (
    select url from uritemplate where 
    template="http://airportcode.riobard.com/airport/{airport}?fmt=JSON" 
    and airport in (@ap)
)

С помощью псевдонима запроса (я назвал его airports) запрос может быть доступен через URL-адрес, подобный приведенному ниже, и может легко изменять или добавлять больше / меньше кодов аэропортов.

http://query.yahooapis.com/v1/public/yql/peter/airports?ap=SFO&ap=LHR&ap=BOB

( Перейдите туда . Примечание. Я могу удалить этот псевдоним без уведомления.)

Чтение:

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

ДА!

И он не использует ничего сложного, например join, query.multi или execute.После поиска таких вариантов я, наконец, обнаружил, что это намного проще, чем требующий только or и повторное использование url=, по одному для каждого параметра:

select * from json where url="http://airportcode.riobard.com/airport/LAX?fmt=JSON"
  or url="http://airportcode.riobard.com/airport/SFO?fmt=JSON"
  or url="http://airportcode.riobard.com/airport/LHR?fmt=JSON"

Я хотел бы услышать, если естьаккуратный способ сделать это без повторяющихся похожих URL.

...