---
title: Lee el contenido desde un sitio
description: Lee lo que publicas desde un Worker por un service binding, desde un sitio Nuxt, Astro, React o Vue, o desde cualquier lugar por HTTP con un token de lectura.
section: guides
order: 2
---

# Lee el contenido desde un sitio

Tu sitio lee solo el contenido publicado: un borrador, o los cambios sin publicar de una entrada, nunca le llegan. Hay tres formas de leerlo.

## Desde un Worker, por un service binding

Un Worker de la misma cuenta de Cloudflare enlaza el entrypoint `Hollware` de tu Worker de Hollware. Sin red y sin token:

```jsonc
// wrangler.jsonc del sitio
"services": [
  { "binding": "HOLLWARE", "service": "my-cms", "entrypoint": "Hollware" }
]
```

```ts
const answer = await env.HOLLWARE.getEntry('my-site', 'blog', 'hello-world', 'en', {
  formats: ['html'],
})
if (answer.outcome === 'ok') return new Response(answer.entry.html)
```

El binding tiene seis métodos, todos de solo lectura: `getEntry`, `listEntries`, `getTranslations`, `describeSite`, `search` y `listRedirects`. `getEntry` entrega el Markdown, el documento de Comark o el HTML, según pida `formats`; con `related: true`, las entradas publicadas más cercanas por significado, y con `references: true`, las entradas que nombran sus campos de referencia (un autor, una serie: consulta [Contratos](/es/docs/contracts/)). Sus imágenes llegan con su `srcset` y su tamaño ([Imágenes](/es/docs/images/)), y los campos que la colección deja a Hollware (una fecha, el tiempo de lectura) llegan llenos en su frontmatter ([Configura tu contenido](/es/docs/configure-your-content/)).

```ts
const found = await env.HOLLWARE.search('my-site', 'how do I cache pages', { locale: 'en', limit: 5 })
```

`search` encuentra entradas publicadas por sus palabras, por su significado o por ambos (`mode: 'fulltext' | 'semantic' | 'hybrid'`, híbrido por defecto), y con `passages: true` la sección de cada una que coincidió, para que un modelo responda con ella. La búsqueda por significado necesita Workers AI y Vectorize: consulta [Búsqueda y analítica](/es/docs/search-and-analytics/).

Cuando una entrada cambia de slug, su ruta anterior se guarda como redirección. Respóndela con un 301:

```ts
const moved = await hollware.redirectFor('blog', 'en', slug) // createHollware() de cualquier paquete
if (moved) return Response.redirect(new URL(moved.path ?? moved.slug, request.url), 301)
```

## Desde un framework

Cada framework tiene un paquete que lee Hollware y renderiza lo que lee con tus propios componentes, con vistas previas de borradores e imágenes listas:

| Framework | Paquete | Guía |
| --- | --- | --- |
| Nuxt | `@hollware/nuxt` | [Nuxt](/es/docs/nuxt/) |
| Astro | `@hollware/astro` | [Astro](/es/docs/astro/) |
| React Router, Next.js, TanStack Start | `@hollware/react` | [React](/es/docs/react/) |
| Vue 3 sin Nuxt | `@hollware/vue` | [Vue](/es/docs/vue/) |

Cualquier otro JavaScript lee con `@hollware/client`, el paquete sobre el que se construyen todos: `createHollware` por un binding o un token de lectura, e `imageOf` para las imágenes del frontmatter.

## Por HTTP, con un token de lectura

La API de lectura sirve las mismas lecturas en `/v1`:

```sh
curl -H "Authorization: Bearer hw_read_..." "http://localhost:5199/v1/blog/en/hello-world?formats=html"
```

| Solicitud                                         | Respuesta                         |
| ----------------------------------------------- | ------------------------------ |
| `GET /v1/site`                                  | el sitio: locales, colecciones |
| `GET /v1/search?q&collection&locale&limit&mode&passages&minScore` | las entradas publicadas que coinciden con q, las mejores primero |
| `GET /v1/{collection}?locale&tag&limit&cursor` | una página de entradas publicadas    |
| `GET /v1/{collection}/{locale}/{slug}?formats=&related=&references=` | una entrada, con sus entradas relacionadas y las que nombra cuando se piden |
| `GET /v1/{collection}/translations/{group}`     | las entradas de un grupo de traducción |
| `GET /v1/redirects?collection&locale&limit&cursor` | las rutas antiguas de las entradas que se movieron, y adónde van |

Las respuestas traen un ETag; devuélvelo en `If-None-Match` para recibir un 304. El documento OpenAPI está en `/v1/openapi.json`.

Un **token de lectura** (`hw_read_`) lee el contenido publicado por esta API y nada más, así que puede estar en un build, o incluso en un navegador:

```sh
npx hollware token create --read --label my-site            # en el proyecto, para la base de datos local
npx hollware token create --read --label my-site --remote   # para la desplegada
```

Como todo token, se imprime una sola vez: Hollware guarda solo su hash. En local, la API de lectura está en `http://localhost:5199/v1`; una vez desplegada, en la URL pública de tu Hollware. `blog` es la colección del starter: usa los nombres que entrega `describe_site`.

Para un navegador, lista los orígenes de tus páginas en el admin, en **Sitio**, como *orígenes que leen desde el navegador*, por ejemplo `https://example.com`, o haz que un agente los agregue con `update_site`. Se aplican al instante.
