Ενσωμάτωση γωνιακής φόρμας επαφής (αυτόνομη και σήματα)
Συνδέστε εφαρμογές Angular 17/18+ στο Lugatu χρησιμοποιώντας αυτόνομα εξαρτήματα, αντιδραστικά σήματα και HttpClient για αξιόπιστη παράδοση φόρμας επικοινωνίας χωρίς τη διατήρηση διακομιστή SMTP.
1. Αυτόνομο στοιχείο φόρμας επαφής με αντιδραστικά σήματα
Το Modern Angular ευνοεί τα αυτόνομα εξαρτήματα και τα σήματα έναντι των βαριών NgModules. Αυτή η υλοποίηση παρέχει μια προσβάσιμη φόρμα επικοινωνίας με καταστάσεις αντιδραστικής φόρτωσης, σφάλματος και επιτυχίας που υποβάλλονται απευθείας στο 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 Forwarding
Εάν η εφαρμογή Angular εκτελείται με Angular SSR (μηχανή Node / Express), μπορείτε να υποβάλετε ερωτήματα μεσολάβησης μέσω ενός προγράμματος χειρισμού διαδρομής από την πλευρά του διακομιστή για να προστατεύσετε το κλειδί API διακομιστή-προς-διακομιστή Lugatu.
// 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. Bot Defense & Honeypot Configuration
Το Lugatu επιθεωρεί αυτόματα το πεδίο _gotcha. Διατηρήστε το αόρατο στους ανθρώπους που χρησιμοποιούν το display:none και το tabindex="-1". Τα ανεπιθύμητα μηνύματα που γεμίζουν κάθε είσοδο DOM ενεργοποιούν την αθόρυβη καταστολή.
Μην χρησιμοποιείτε ποτέ ετικέτες φόρμας για εισόδους honeypot. Αφήστε απενεργοποιημένη την αυτόματη συμπλήρωση και εξαιρέστε το πεδίο από ονόματα προσβάσιμα από τον αναγνώστη οθόνης.
Αμετάβλητη ασφάλεια & έλεγχος ταυτότητας
Αμετάβλητη ασφάλεια: Τα κλειδιά API από διακομιστή σε διακομιστή (lug_live_...) δεν πρέπει ποτέ να ομαδοποιούνται σε στοιχεία Angular από την πλευρά του πελάτη ή σε αρχεία περιβάλλοντος. Χρησιμοποιήστε το δημόσιο τελικό σημείο για άμεσες υποβολές πελατών ή προωθήστε μέσω τερματικών σημείων διακομιστή.
Αντιμετώπιση προβλημάτων και κοινά σφάλματα κατάποσης
Τα τελικά σημεία δημόσιας φόρμας επιτρέπουν υποβολές πολλαπλής προέλευσης από οποιοδήποτε πρόγραμμα περιήγησης. Εάν καλείτε το τελικό σημείο διακομιστή σε διακομιστή (POST /api/v1/forms/{id}/submissions) απευθείας από το Angular, μεταβείτε στο δημόσιο τελικό σημείο (POST /api/v1/public/forms/{id}/submissions) ή προωθήστε το μέσω ενός backend.
Συχνές Ερωτήσεις
Το Lugatu υποστηρίζει το Angular SSR με ενυδάτωση πελάτη;
Ναί. Οι υποβολές δημόσιας φόρμας Lugatu πραγματοποιούνται μέσω ανάκτησης από την πλευρά του πελάτη ή HttpClient μετά από αλληλεπίδραση με τον χρήστη, το οποίο είναι απολύτως συμβατό με το Angular SSR και την ενυδάτωση του πελάτη.
Είστε έτοιμοι να δημιουργήσετε το τελικό σημείο της φόρμας σας;
Ξεκινήστε δωρεάν σε δευτερόλεπτα. Δεν απαιτείται πιστωτική κάρτα.