RSS no esta muerto
Introducción
RSS significa Really Simple Syndication. Es una tecnología que permite a los usuarios suscribirse a contenido de sus sitios web o blogs favoritos en un formato estandarizado. En este artículo, veremos cómo configurarlo para una aplicación Phoenix de la forma más simple posible.
El ejemplo estará basado en la configuración de este blog, pero sería lo mismo si reemplazás el nombre de la app tr
con el nombre de tu app.
Configuración
Primero necesitamos aceptar el formato, esto se hace en lib/tr_web.ex
formats: [:html, :json, :xml],
Como estoy usando el controlador de página como índice del sitio, decidí reutilizar ese controlador para el sitemap y el feed RSS. Básicamente, el plug desactiva el layout para esa acción, y la acción renderiza la plantilla.
plug :put_layout, false when action in [:sitemap]
def sitemap(conn, _params) do
posts = Blog.all_posts()
conn
|> put_resp_content_type("text/xml")
|> render("index.xml", posts: posts)
end
Antes de pasar a la plantilla, necesitamos agregar la ruta para ella. Primero agregamos un pipeline para aceptar XML y luego definimos las rutas que servirán el sitemap.
pipeline :xml do
plug :accepts, ["xml"]
end
scope "/", TrWeb do
pipe_through :xml
get "/index.xml", PageController, :sitemap
get "/sitemap.xml", PageController, :sitemap
end
Los siguientes dos archivos son la última parte de la configuración. Primero lib/tr_web/controllers/page_xml.ex
, configuramos la plantilla y un helper para mostrar la fecha.
defmodule TrWeb.PageXML do
@moduledoc """
Módulo para soportar el renderizado de XML
"""
use TrWeb, :html
embed_templates "page_xml/*"
defp format_date(date) do
date
|> to_string()
end
end
Y la última parte de nuestra configuración es la plantilla en sí, lib/tr_web/controllers/page_xml/index.xml.eex
, que se utilizará para generar la lista de todos los posts con los campos relevantes.
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Techsquad Rocks</title>
<link><%= ~p"/blog" %></link>
<atom:link href="<%= ~p"/index.xml" %>" rel="self" type="application/rss+xml" />
<description>Este blog fue creado para documentar y aprender sobre diferentes tecnologías. Entre otras cosas, ha sido desplegado en un clúster k3s corriendo en OCI, utilizando Elixir, el framework Phoenix, Postgres, Docker, Kubernetes en ARM64, y muchas otras cosas. Si esto suena interesante, podés seguirme en Twitter o crear una cuenta aquí para recibir notificaciones de nuevos posts y, más adelante, un boletín. Espero que disfrutes de tu estadía y nos veamos del otro lado...</description>
<language>en</language>
<copyright>Copyright <%= DateTime.utc_now.year %> TechSquad Rocks </copyright>
<lastBuildDate><%= DateTime.utc_now |> format_date() %></lastBuildDate>
<category>IT/Internet/Desarrollo web</category>
<ttl>60</ttl>
<%= for post <- @posts do %>
<item>
<title><%= post.title %></title>
<link><%= ~p"/blog/#{post.id}" %></link>
<guid><%= ~p"/blog/#{post.id}" %></guid>
<description><![CDATA[ <%= post.description %> ]]></description>
<pubDate><%= post.date |> format_date %></pubDate>
<source url="<%= ~p"/blog" %>">Blog Title</source>
</item>
<% end %>
</channel>
</rss>
También podés probarlo de esta manera. Recordá que si decidís usar otro módulo, tendrás que colocarlo allí en lugar de donde están las pruebas del controlador de página:
describe "GET /sitemap.xml" do
test "accede al sitemap en formato xml", %{conn: conn} do
conn = get(conn, "/sitemap.xml")
assert response_content_type(conn, :xml)
assert response(conn, 200) =~ "<link>/blog/from_zero_to_hero_with_kops_and_aws</link>"
end
end
Luego podés ofrecer a tus lectores un enlace como este para que descubran tu feed:
<.link rel="alternate" type="application/rss+xml" title="Blog Title" href={~p"/index.xml"}>
RSS
</.link>
Notas finales
Haceme saber si hay algo que te gustaría ver implementado, probado, explorado o lo que sea en este espacio…
Errata
Si encontrás algún error o tenés alguna sugerencia, mandame un mensaje para que se pueda corregir.
También podés revisar el código fuente y los cambios en los sources aquí
No tienes cuenta? Regístrate aqui
Ya registrado? Iniciar sesión a tu cuenta ahora.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.