Saltar al contenido principal

Visión General

La obtención de datos en Analog se basa en conceptos de Angular, como el uso de HttpClient para realizar solicitudes API.

Uso de HttpClient

Usar HttpClient es la forma recomendada para hacer solicitudes API a endpoints internos y externos. El contexto para la solicitud es proporcionado por la función provideServerContext para cualquier solicitud que use HttpClient y comience con una /.

Contexto de Solicitud del Servidor

En el servidor, usa la función provideServerContext del router de Analog en el main.server.ts.

import 'zone.js/node';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { renderApplication } from '@angular/platform-server';

// Contexto del servidor de Analog
import { provideServerContext } from '@analogjs/router/server';
import { ServerContext } from '@analogjs/router/tokens';

import { config } from './app/app.config.server';
import { AppComponent } from './app/app.component';

if (import.meta.env.PROD) {
enableProdMode();
}

export function bootstrap() {
return bootstrapApplication(AppComponent, config);
}

export default async function render(
url: string,
document: string,
serverContext: ServerContext
) {
const html = await renderApplication(bootstrap, {
document,
url,
platformProviders: [provideServerContext(serverContext)],
});

return html;
}

Esto proporciona el Request y Response, y la Base URL desde el servidor y los registra como proveedores que pueden ser inyectados y usados.

Funciones de Inyección

import { inject } from '@angular/core';
import {
injectRequest,
injectResponse,
injectBaseURL,
} from '@analogjs/router/tokens';

class MyService {
request = injectRequest(); // <- Objeto de Solicitud del Servidor
response = injectResponse(); // <- Objeto de Respuesta del Servidor
baseUrl = injectBaseURL(); // <-- Base URL del Servidor
}

Interceptor de Contexto de Solicitud

Analog también provee requestContextInterceptor para el HttpClient que maneja la transformación de cualquier solicitud a una URL que comience con una / a una solicitud de URL completa en el servidor, cliente y durante el prerenderizado.

Úsalo con la función withInterceptors del paquete @angular/common/http.

import {
provideHttpClient,
withFetch,
withInterceptors,
} from '@angular/common/http';
import { ApplicationConfig } from '@angular/core';
import { provideClientHydration } from '@angular/platform-browser';
import { provideFileRouter, requestContextInterceptor } from '@analogjs/router';
import { withNavigationErrorHandler } from '@angular/router';

export const appConfig: ApplicationConfig = {
providers: [
provideFileRouter(withNavigationErrorHandler(console.error)),
provideHttpClient(
withFetch(),
withInterceptors([requestContextInterceptor])
),
provideClientHydration(),
],
};

Asegúrate de que el requestContextInterceptor esté último en el arreglo de interceptores.

Realizando Solicitudes

En tu componente/servicio, usa HttpClient junto con [/docs/features/api/overview](API routes) proporcionando una URL completa.

Un ejemplo de ruta API que obtiene todos los todos.

// src/server/routes/v1/todos.ts -> /api/v1/todos
import { eventHandler } from 'h3';

export default eventHandler(async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/todos');
const todos = await response.json();

return todos;
});

Un ejemplo de servicio que obtiene todos los todos desde el endpoint API.

// todos.service.ts
import { Injectable, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { Todo } from './todos';

@Injectable({
providedIn: 'root',
})
export class TodosService {
http = inject(HttpClient);

getAll() {
return this.http.get<Todo[]>('/api/v1/todos');
}

getData() {
return this.http.get<Todo[]>('/assets/data.json');
}
}

Las solicitudes de datos también usan el TransferState de Angular para almacenar cualquier solicitud realizada durante la Renderización del Lado del Servidor, y se transfieren para prevenir una solicitud adicional durante la hidratación inicial del lado del cliente.