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.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido