JSON Feed es un nuevo estándar para formalizar un feed RSS basado en JSON que pretende simplificar la creación de feeds eliminando el estándar XML. La implementación de un feed para su sitio es simple y la especificación es sorprendentemente clara.
ejemplo:
{
"version": "https://jsonfeed.org/version/1",
"title": "My Example Feed",
"home_page_url": "https://example.org/",
"feed_url": "https://example.org/feed.json",
"items": [
{
"id": "2",
"content_text": "This is a second item.",
"url": "https://example.org/second-item"
},
{
"id": "1",
"content_html": "<p>Hello, world!</p>",
"url": "https://example.org/initial-post"
}
]
}
La estructura de un feed
Un feed JSON comienza con alguna información en la parte superior: dice de dónde proviene el feed, y puede decir quién lo creó, etc.
Después de eso, hay una serie de objetos, elementos, que describen cada objeto en la lista.
Para conocer todas las caracteristicas te invito a leer las especificaciones.
Ejemplo rápido con laravel
Obtener la lista de post
$posts = Posts::latest();
Configura los datos basicos para el JSON Feed
La especificación de JSON Feed tiene algunos campos de nivel superior opcionales, como título, URL de fuente, ícono de sitio y más. Estos campos no son dinámicos por lo que hay que agregarlos a un arreglo de forma manual:
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'El nombre de tu feed',
'home_page_url' => 'https://domain.tld',
'feed_url' => 'https://domain.tld/feed/json',
'icon' => 'https://domain.tld/apple-touch-icon.png',
'favicon' => 'https://domain.tld/apple-touch-icon.png',
'items' => [],
];
NOTA en el campo
items
vamos a colocar todos los items (valga la redundancia) de los post.
Agregando los items al feed
Este punto es lo más sencillo del mundo, unicamente hay que hacer:
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://domain.tld/'.$post->uri, // o la ruta de los post
'image' => $post->featured_image,
'content_html' => $post->content,
'date_published' => $post->created_at->tz('UTC')->toRfc3339String(),
'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
El resultado final
Nuestro metodo quedaria de esta forma:
public function jsonFeed()
{
$posts = Posts::latest();
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'El nombre de tu feed',
'home_page_url' => 'https://domain.tld',
'feed_url' => 'https://domain.tld/feed/json',
'icon' => 'https://domain.tld/apple-touch-icon.png',
'favicon' => 'https://domain.tld/apple-touch-icon.png',
'items' => [],
];
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://domain.tld/'.$post->uri, // o la ruta de los post
'image' => $post->featured_image,
'content_html' => $post->content,
'date_created' => $post->publishes_at->tz('UTC')->toRfc3339String(),
'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
return $data;
}
En nuestro archivo de rutas podemos tener algo como esto:
Route::get('/feeds/json', 'JsonFeedController@jsonFeed')->name('json.feed');
Y en el header
colocamos algo como esto:
<link rel="alternate" title="El nombre de tu feed" type="application/json" href="{{ route('json.feed') }}" />
Y listo, ya tenemos nuestro JSON Feed configurado completamente...