Cómo crear un Canal RSS

RSS son las siglas de Rich Site Summary, un formato XML para compartir contenido en la web. Se utiliza para difundir información actualizada frecuentemente a usuarios que se han suscrito a la fuente de contenidos. A continuación explicamos como integrarlo en tu aplicación

El primer paso para la creación de este servicio es comprobar que tenemos cargada la librería Seam jboss-seam-rss que, en principio, ya está incluida en el arquetipo de la aplicación y por lo tanto cargada en nuestro proyecto base.

Lo primero que tenemos que hacer es crear en nuestro esquema de base de datos, dos tablas que como mínimo deben tener, los siguientes campos y restricciones:

  CREATE TABLE "FUNDEWEB"."ENTRY"
  (
    "ID"      VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "TITLE"   VARCHAR2(150 BYTE) NOT NULL ENABLE,
    "LINK"    VARCHAR2(200 BYTE),
    "AUTHOR"  VARCHAR2(20 BYTE),
    "SUMMARY" VARCHAR2(256 BYTE),
    "PUBLISHED" DATE,
    "UPDATED" DATE,
    "ID_FEED" VARCHAR2(20 BYTE),
    CONSTRAINT "ENTRY_PK" PRIMARY KEY ("ID") USING INDEX PCTFREE 0 
    INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    STORAGE(INITIAL 16384 NEXT 16384 MINEXTENTS 1 
    MAXEXTENTS 10 PCTINCREASE 0 FREELISTS 1 FREELIST 
    GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "FUNDEWEB" ENABLE,
    CONSTRAINT "ID_FEED_FK1" FOREIGN KEY ("ID_FEED") 
    REFERENCES "FUNDEWEB"."FEED" ("ID") ENABLE
  )
  TABLESPACE "FUNDEWEB" ; 
  
  CREATE TABLE "FUNDEWEB"."FEED"
  (
    "ID"       VARCHAR2(20 BYTE) NOT NULL ENABLE,
    "TITLE"    VARCHAR2(100 BYTE) NOT NULL ENABLE,
    "SUBTITLE" VARCHAR2(256 BYTE),
    "UPDATED" DATE,
    "LINK" VARCHAR2(100 BYTE),
    CONSTRAINT "FEED_PK" PRIMARY KEY ("ID") USING INDEX PCTFREE 0 
    INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 
    16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 10 PCTINCREASE 0 
    FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) 
    TABLESPACE "FUNDEWEB" ENABLE
  )
  TABLESPACE "FUNDEWEB" ; 
  

Estas tablas contienen la mínima información para un RSS. En la Tabla Feed, cada entrada representa un Rss o feed que queremos sindicar en un fichero xml. Las entradas de cada uno de estos Rss se almacenan en la tabla entry. Tras crear estas tablas en base de datos, debemos crear los POJO (clases java que los representa) respectivos para poder tratar los datos introducidos en ambas desde nuestra aplicación.

El POJO que contenga a la entidad Feed debemos añadirle una consulta namedQuery para poder recuperar el RSS adecuado desde el bean de respaldo.

 @NamedQuery(name = "feed.findById", query = "SELECT feed FROM Feed feed WHERE feed.id = :id")  

Es necesario crear un bean de respaldo para recuperar nuestro rss (feed) y las entradas asociadas a el. Una vez recuperado, las pasamos a la vista que se encargará de ir metiendo cada propiedad de las entradas del feed, en su etiqueta correspondiente. El usuario se abstrae de esta operación, que realiza Seam por medio de la libreía añadida jboss-seam-rss.

package org.umu.atica.components;
 
import javax.persistence.EntityManager;
import javax.persistence.Query;
 
import model.entity.Feed;
 
import org.jboss.seam.annotations.Create;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
 
@Name("rss")
@Scope(ScopeType.APPLICATION)
public class RssNovedades {
 
    public static final long RSS_ID = 1;
 
    @In
    private EntityManager entityManager;
 
    private Feed feed;
 
 
 
   @Create
   public void create() {
       Query q = entityManager.createNamedQuery("feed.findById").setParameter("id", RSS_ID);
       this.feed = (Feed) q.getSingleResult();
   }
 
    public Feed getFeed() {	
	return this.feed;
    }
 
    public void refreshFeed() {
	feed = this.entityManager.find(Feed.class,this.feed.getId());
	this.entityManager.refresh(feed);
    }
 
}

Finalmente, tenemos que diseñar como será el diseño del RSS de cara al usuario y que propiedades vamos a mostrar. Destacar la importancia de usar la etiqueta r:feed proporcionada por la librería jboss-seam-rss. Esta librería se encarga de la creación del xml correspondiente a las entradas con la estructura que un RSS debe tener.

Cabe destacar que el código mostrado a continuación debe estar en un fichero xhtml independiente del resto y no integrado en ningún otro.

<rss:feed xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rss="http://jboss.org/schema/seam/rss"
	xmlns:h="http://java.sun.com/jsf/html"
	title="#{rss.feed.title}"
	uid="#{rss.feed.id}" subtitle="#{rss.feed.subtitle}"
	updated="#{rss.feed.updated}" link="#{rss.feed.link}">
 
	<ui:repeat value="#{rss.feed.entries}" var="entry">	
		<rss:entry uid="#{entry.id}" title="#{entry.title}" link="#{entry.link}"
			author="#{entry.author}" summary="#{entry.summary}"
			published="#{entry.published}" updated="#{entry.updated}" />
	</ui:repeat>
 
</rss:feed>

Como añadir CORS

Para permitir peticiones cross-domain, hemos añadido el elemento <rss:cors>, que es hijo al elemento <rss:feed>. Veamos un ejemplo:

<rss:feed xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:rss="http://jboss.org/schema/seam/rss"
	xmlns:h="http://java.sun.com/jsf/html"
	title="#{rss.feed.title}"
	uid="#{rss.feed.id}" subtitle="#{rss.feed.subtitle}"
	updated="#{rss.feed.updated}" link="#{rss.feed.link}">
 
	<rss:cors allowOrigin="*" />
 
	<ui:repeat value="#{rss.feed.entries}" var="entry">	
		<rss:entry uid="#{entry.id}" title="#{entry.title}" link="#{entry.link}"
			author="#{entry.author}" summary="#{entry.summary}"
			published="#{entry.published}" updated="#{entry.updated}" />
	</ui:repeat>
 
</rss:feed>

En este ejemplo, permitimos todos las peticiones cross-domain, pero se pueden restringir, ya sea por puerto, dominio, protocolo, etc.

Las propiedades disponibles son las siguientes:

  • allowOrigin: indica el control de acceso. Es el valor especificado en la cabecera de respuesta Access-Control-Allow-Origin.
  • allowMethods: indica los métodos HTTP permitidos para la petición. Es el valor especificado en la cabecera de respuesta Access-Control-Allow-Methods. El valor por defecto es GET.
  • allowHeaders: indica la lista separada por comas de cabeceras soportadas. Es el valor especificado en la cabecera de respuesta Access-Control-Allow-Headers.
  • allowCredentials: indica que en la petición se deben añadir las credenciales. Es el valor especificado en la cabecera de respuesta Access-Control-Allow-Credentials. El valor por defecto es false.
  • exposeHeaders: indica las cabeceras adicionales que exponen al cliente. Es el valor especificado en la cabecera de respuesta Access-Control-Expose-Headers. Las cabeceras que se exponen por defecto al cliente son:
    • Cache-Control
    • Content-Language
    • Content-Type
    • Expires
    • Last-Modified
    • Pragma
  • maxAge: indica el tiempo de validez de una respuesta a una petición preflight. Es el valor especificado en la cabecera de respuesta Access-Control-Max-Age. El valor por defecto es 86400 segundos (es decir, 24 horas). Indica el tiempo que se cachea la respuesta en el navegador, para permitir realizar menos peticiones preflight.

Una petición preflight, es la que se utiliza para verificar que se pueden establecer peticiones cross-domain desde determinados dominios y métodos HTTP.

  • fdw2.0/fundeweb2.0/gt/como_crear_un_canal_rss.txt
  • Última modificación: 07/11/2017 10:46
  • (editor externo)