Zum Hauptinhalt springen

Übersicht

Das Abrufen von Daten in Analog baut auf Konzepten in Angular auf, wie z. B. der Verwendung von HttpClient für API-Anfragen.

Verwendung des HttpClient

Die Verwendung von HttpClient ist der empfohlene Weg, um API-Anforderungen für interne und externe Endpunkte zu stellen. Der Kontext für die Anforderung wird von der Funktion provideServerContext für jede Anforderung bereitgestellt, die HttpClient verwendet und mit „/“ beginnt.

Kontext der Serveranfrage

Verwende auf dem Server verwenden die Funktion provideServerContext aus dem Analog-Router in der Datei main.server.ts.

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

// Analog server context
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;
}

Diese stellt den Request und Response sowie die Base URL vom Server bereit und registriert sie als Anbieter, die injiziert und verwendet werden können.

Injektionsfunktionen

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

class MyService {
request = injectRequest(); // <- Server Request Object
response = injectResponse(); // <- Server Response Object
baseUrl = injectBaseURL(); // <-- Server Base URL
}

Injektor des Anfragekontext

Analog bietet auch requestContextInterceptor für den HttpClient, der die Umwandlung jeder URL-Anfrage, die mit einem / beginnt, in eine vollständige URL-Anfrage auf dem Server, dem Client und während des Prerenderings übernimmt.

Verwende es mit der Funktion withInterceptors aus den Paket @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(),
],
};

Stelle sicher, dass der requestContextInterceptor der letzte im Array der Interceptoren ist.

Anfragen erstellen

Verwende in der Komponente/dem Dienst HttpClient zusammen mit API-Routen mit einer vollständige URL.

Eine Beispiel-API-Route, die ToDos abruft.

// 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;
});

Ein Beispieldienst, der ToDos vom API-Endpunkt abruft.

// 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');
}
}

Datenanfragen verwenden auch Angulars TransferState, um alle Anfragen zu speichern, die während des serverseitigen Renderings gemacht wurden, und werden übertragen, um eine zusätzliche Anfrage während der anfänglichen clientseitigen Hydration zu verhindern.