Integration af vinklet kontaktformular (standalone og signaler)
Forbind Angular 17/18+-applikationer til Lugatu ved hjælp af Standalone-komponenter, reaktive signaler og HttpClient for pålidelig levering af kontaktformularer uden at vedligeholde en SMTP-server.
1. Standalone kontaktformularkomponent med reaktive signaler
Modern Angular foretrækker selvstændige komponenter og signaler frem for tunge NgModules. Denne implementering giver en tilgængelig kontaktformular med reaktiv indlæsning, fejl og succestilstande, der sendes direkte til Lugatu.
import { Component, signal, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-contact-form',
standalone: true,
imports: [CommonModule, FormsModule],
template: `
<form (ngSubmit)="onSubmit()" class="space-y-4 max-w-md">
<div>
<label for="name" class="block text-sm font-semibold mb-1">Your Name</label>
<input id="name" type="text" [(ngModel)]="name" name="name" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label for="email" class="block text-sm font-semibold mb-1">Email Address</label>
<input id="email" type="email" [(ngModel)]="email" name="email" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label for="message" class="block text-sm font-semibold mb-1">Message</label>
<textarea id="message" rows="4" [(ngModel)]="message" name="message" required class="w-full border rounded-xl p-2.5"></textarea>
</div>
<!-- Honeypot spam defense -->
<input type="text" [(ngModel)]="gotcha" name="_gotcha" style="display:none !important" tabindex="-1" autocomplete="off" />
<button type="submit" [disabled]="isSubmitting()" class="btn-primary-editorial py-2.5 px-6">
{{ isSubmitting() ? 'Sending...' : 'Send Message' }}
</button>
<p *ngIf="isSuccess()" class="text-sm text-green-700 font-medium">Thank you! Your message has been received.</p>
<p *ngIf="errorMessage()" class="text-sm text-red-600">{{ errorMessage() }}</p>
</form>
`,
})
export class ContactFormComponent {
private http = inject(HttpClient);
name = signal('');
email = signal('');
message = signal('');
gotcha = signal('');
isSubmitting = signal(false);
isSuccess = signal(false);
errorMessage = signal('');
onSubmit() {
if (this.gotcha()) return; // Silent discard for automated bot submissions
this.isSubmitting.set(true);
this.errorMessage.set('');
const payload = {
fields: {
name: this.name(),
email: this.email(),
message: this.message(),
},
honeypot: this.gotcha(),
};
this.http.post('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', payload)
.subscribe({
next: () => {
this.isSubmitting.set(false);
this.isSuccess.set(true);
this.name.set('');
this.email.set('');
this.message.set('');
},
error: () => {
this.isSubmitting.set(false);
this.errorMessage.set('Submission failed. Please try again.');
},
});
}
}
2. SSR & Angular Universal Server-to-Server-videresendelse
Hvis din Angular-applikation kører med Angular SSR (Node / Express-motor), kan du proxy-forespørgsler gennem en server-side-rutehandler for at beskytte din Lugatu Server-to-Server API-nøgle.
// Express / Node backend endpoint in Angular SSR
server.post('/api/contact', async (req, res) => {
const { name, email, message, _gotcha } = req.body;
if (_gotcha) return res.status(200).json({ ok: true });
try {
const response = await fetch(`https://www.lugatu.com/api/v1/forms/${process.env.LUGATU_FORM_ID}/submissions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.LUGATU_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ fields: { name, email, message } }),
});
res.status(response.status).json({ ok: response.ok });
} catch (error) {
res.status(500).json({ error: 'Failed to deliver message' });
}
});
3. Botforsvar & Honeypot-konfiguration
Lugatu inspicerer _gotcha-feltet automatisk. Hold det usynligt for menneskelige besøgende ved hjælp af display:none og tabindex="-1". Spambots, der fylder hvert DOM-input, udløser tavs undertrykkelse.
Brug aldrig formularetiketter til honeypot-indgange. Lad autofuldførelse være slået fra, og udelad feltet fra skærmlæser tilgængelige navne.
Sikkerhed & Autentificering Invariant
Sikkerhedsinvariant: Server-til-server API-nøgler (lug_live_...) må aldrig samles i Angular-aktiver på klientsiden eller environment.ts-filer. Brug det offentlige slutpunkt til direkte klientindsendelser eller videresend via serverendepunkter.
Fejlfinding og almindelige indtagelsesfejl
Offentlige slutpunkter tillader indsendelser med krydsoprindelse fra enhver browser. Hvis du kalder server-til-server-slutpunktet (POST /api/v1/forms/{id}/submissions) direkte fra Angular, skal du skifte til det offentlige slutpunkt (POST /api/v1/public/forms/{id}/submissions) eller videresende gennem en backend.
Ofte stillede spørgsmål
Understøtter Lugatu Angular SSR med klienthydrering?
Ja. Lugatu offentlige formularindsendelser udføres via klientsiden hentning eller HttpClient efter brugerinteraktion, som er fuldstændig kompatibel med Angular SSR og klienthydrering.
Klar til at oprette dit formularslutpunkt?
Kom i gang gratis på få sekunder. Intet kreditkort påkrævet.