Home / Guides / Intégration du formulaire de contact angulaire (autonome et signaux)
GUIDE D'INTÉGRATION · ANGULAR & SPA

Intégration du formulaire de contact angulaire (autonome et signaux)

Connectez les applications Angular 17/18+ à Lugatu à l'aide de composants autonomes, de signaux réactifs et de HttpClient pour une livraison fiable de formulaires de contact sans maintenir de serveur SMTP.

1. Composant de formulaire de contact autonome avec signaux réactifs

Modern Angular privilégie les composants et signaux autonomes par rapport aux NgModules lourds. Cette implémentation fournit un formulaire de contact accessible avec des états de chargement, d'erreur et de réussite réactifs soumis directement à Lugatu.

contact-form.component.ts typescript
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. Redirection universelle de serveur à serveur SSR et angulaire

Si votre application Angular s'exécute avec Angular SSR (moteur Node/Express), vous pouvez envoyer des requêtes par proxy via un gestionnaire de routage côté serveur pour protéger votre clé API serveur à serveur Lugatu.

server.ts typescript
// 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. Défense contre les robots et configuration du pot de miel

Lugatu inspecte automatiquement le champ _gotcha. Gardez-le invisible pour les visiteurs humains en utilisant display:none et tabindex="-1". Les spambots remplissant chaque entrée du DOM déclenchent une suppression silencieuse.

tip

N’utilisez jamais d’étiquettes de formulaire pour les entrées de pot de miel. Laissez la saisie semi-automatique désactivée et excluez le champ des noms accessibles par les lecteurs d'écran.

Invariant de sécurité et d'authentification

Invariant de sécurité : les clés API de serveur à serveur (lug_live_...) ne doivent jamais être regroupées dans des actifs angulaires côté client ou des fichiers environnement.ts. Utilisez le point de terminaison public pour les soumissions directes des clients ou transférez-les via les points de terminaison du serveur.

Dépannage et erreurs d’ingestion courantes

HTTP 403 FORBIDDEN_BROWSER_ORIGIN lors de la soumission depuis Angular

Les points de terminaison de formulaire public permettent les soumissions d’origines croisées à partir de n’importe quel navigateur. Si vous appelez le point de terminaison de serveur à serveur (POST /api/v1/forms/{id}/submissions) directement depuis Angular, passez au point de terminaison public (POST /api/v1/public/forms/{id}/submissions) ou transférez via un backend.

Foire aux questions

Lugatu prend-il en charge Angular SSR avec l'hydratation des clients ?

Oui. Les soumissions de formulaires publics Lugatu sont effectuées via une récupération côté client ou HttpClient après interaction de l'utilisateur, ce qui est entièrement compatible avec Angular SSR et l'hydratation du client.

Prêt à créer votre point de terminaison de formulaire ?

Commencez gratuitement en quelques secondes. Aucune carte de crédit requise.

Commencez gratuitement →