Статьи

Пейджинг через канал ATOM с использованием Node.js, CoffeeScript, MongoDB и Atom Hopper

Я ежедневно работаю с Atom Hopper, который является сервером Java ATOMPub. Когда мы добавляем новые функции, нам нужно тестировать эти функции, и часто мы получаем маленькие скрипты, такие как тот, который я покажу вам сегодня. Недавно был обновлен Atom Hopper, чтобы можно было просматривать страницы и получать ATOM. По сути, Atom Hopper будет создавать ссылки « Следующая» и « Предыдущая» в головке подачи, по которым можно легко переходить либо к хвосту (самые старые записи) подачи, либо к голове (новые записи).

 

Смотрите мои предыдущие статьи или вики о том, как настроить Atom Hopper, а также мою статью о том, как настроить его для использования адаптера данных MongoDB. Вы также можете использовать адаптер данных Hibernate, если хотите.

Головка подачи, которую производит Atom Hopper, выглядит примерно так:

<feed xmlns="http://www.w3.org/2005/Atom">
  <link href="http://localhost:8080/namespace/feed/" rel="current" />
  <link href="http://localhost:8080/namespace/feed/" rel="self" />
  <id>urn:uuid:0b5061ec-94b1-4ffc-a383-803221793e2c</id>
  <title type="text">namespace/feed</title>
  <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:34ee3a9a-31dd-46e4-b39e-05bd3596966d&limit=25&search=&direction=forward" rel="previous" />
  <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:9b2e6989-0771-4622-b0eb-49d33f4f5487&limit=25&search=&direction=backward" rel="next" />
  <link href="http://localhost:8080/namespace/feed/?marker=urn:uuid:69128671-daf3-4bac-adbb-64e459b6701e&limit=25&search=&direction=backward" rel="last" />
  <updated>2012-06-09T03:43:01.743Z</updated>
 
... Entries would be seen here ....
 
</feed>

Вы можете видеть, что есть несколько ссылок. Так как я нахожусь во главе канала, где находятся самые новые записи, я могу перейти по следующей ссылке, чтобы перейти к хвосту канала. Поскольку я делаю это, я могу анализировать записи ATOM, содержащиеся в возвращаемых данных. В качестве примера я загрузил 100 записей ATOM в MongoDB и установил свой предел в скрипте, чтобы загружать только 25 записей на вызов (по умолчанию 25, а максимальное — 1000).

Используя CoffeeScript, я могу легко переходить по следующим ссылкам, пока не доберусь до конца. Как только я доберусь до хвоста, больше не будет записей, и поэтому следующая ссылка не будет создаваться в хвосте канала.

Сначала вам нужно будет установить пару пакетов NPM:

$ npm install elementtree
$ npm install coffee-script

Вот CoffeeScript:

fs = require("fs")
et = require("elementtree")
http = require("http")
url = require("url")
element = et.Element
 
opts =
    host: "localhost"
    port: 8080
    method: "GET"
    path: "/namespace/feed/?limit=25"
 
loadAtomFeed = ->
    http.get(opts, (response) ->
        returnedData = ""
        response.on "data", (chunk) ->
            returnedData += chunk
 
      response.on "end", ->
          etree = et.parse(returnedData)
          nextLink = etree.find("./link[@rel=\"next\"]")
          return if not nextLink?
 
          parsedUrl = url.parse(nextLink.attrib["href"])
          console.log "Following Next Link: " + parsedUrl.href
 
          opts.host = parsedUrl.hostname
          opts.path = parsedUrl.path
          loadAtomFeed()
    ).on "error", (e) ->
        console.log "Error: " + e.message
 
loadAtomFeed()

Примечание: я уверен, что это можно сделать намного эффективнее. Поскольку это всего лишь сценарий тестирования, он работает «достаточно хорошо».

Я использую ElementTree для разбора XML. Хотя я на самом деле не разбираю ничего, кроме следующей ссылки, вы определенно можете извлечь из ленты все, что захотите.

Я сохранил скрипт как app.coffee . Предполагая, что у вас установлены CoffeeScript и Node.js, вы можете запустить скрипт прямо так:

$ coffee app.coffee

Мои результаты выглядели так:

Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:9b2e6989-0771-4622-b0eb-49d33f4f5487&limit=25&search=&direction=backward
Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:1ed87690-632b-4bc9-a9f1-c7c607d771bb&limit=25&search=&direction=backward
Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:82e12cc7-06d3-4b89-bedc-4f6bd4a3f4b6&limit=25&search=&direction=backward
Following Next Link: http://localhost:8080/namespace/feed/?marker=urn:uuid:69128671-daf3-4bac-adbb-64e459b6701e&limit=25&search=&direction=backward