Tích hợp biểu mẫu liên hệ Astro (Tĩnh & SSR)
Cách thêm biểu mẫu liên hệ vào các trang web tĩnh Astro (SSG) và các tuyến máy chủ kết hợp bằng cách sử dụng điểm cuối Lugatu mà không cần duy trì máy chủ email hoặc cơ sở dữ liệu.
1. Nhập biểu mẫu trang web tĩnh thuần túy (SSG)
Astro nổi tiếng vì không có JavaScript theo mặc định. Với Lugatu, bạn có thể giữ cho trang web Astro của mình tĩnh 100% trong khi thu thập các yêu cầu bằng biểu mẫu HTML tiêu chuẩn và tìm nạp phía máy khách nhẹ nhàng.
---
// src/pages/contact.astro
---
<form id="astro-contact-form" class="space-y-4 max-w-md">
<div>
<label class="block text-sm font-semibold mb-1">Your Name</label>
<input type="text" name="name" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label class="block text-sm font-semibold mb-1">Email Address</label>
<input type="email" name="email" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label class="block text-sm font-semibold mb-1">Message</label>
<textarea name="message" rows="4" required class="w-full border rounded-xl p-2.5"></textarea>
</div>
<input type="text" name="_gotcha" style="display:none !important" tabindex="-1" autocomplete="off" />
<button type="submit" class="btn-primary-editorial py-2.5 px-6">Send Message</button>
</form>
<script>
const form = document.getElementById('astro-contact-form') as HTMLFormElement;
form?.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(form);
const payload = {
fields: {
name: formData.get('name'),
email: formData.get('email'),
message: formData.get('message'),
},
honeypot: formData.get('_gotcha') || '',
};
const res = await fetch('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify(payload),
});
if (res.ok) {
alert('Thank you! Message delivered.');
form.reset();
}
});
</script>
2. Tuyến API Astro Hybrid / SSR với Khóa API máy chủ
Nếu trang Astro của bạn chạy ở chế độ kết hợp hoặc SSR trên Trang Cloudflare, Netlify hoặc Vercel, hãy chuyển tiếp nội dung gửi một cách an toàn thông qua tuyến API Astro.
import type { APIRoute } from 'astro';
export const POST: APIRoute = async ({ request }) => {
const data = await request.formData();
const fields = {
name: data.get('name')?.toString(),
email: data.get('email')?.toString(),
message: data.get('message')?.toString(),
};
const res = await fetch(`https://www.lugatu.com/api/v1/forms/${import.meta.env.LUGATU_FORM_ID}/submissions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${import.meta.env.LUGATU_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ fields }),
});
return new Response(JSON.stringify({ success: res.ok }), {
status: res.status,
headers: { 'Content-Type': 'application/json' },
});
};
Bảo mật & xác thực bất biến
Hướng dẫn bảo mật: Không bao giờ để lộ import.meta.env.LUGATU_API_KEY trong thẻ tập lệnh phía máy khách Astro. Tập lệnh máy khách chỉ được sử dụng điểm cuối công khai.
Khắc phục sự cố và các lỗi nhập thường gặp
Đảm bảo các biến môi trường sản xuất của bạn (LUGATU_FORM_ID và LUGATU_API_KEY) được định cấu hình trong bảng điều khiển lưu trữ của bạn.
Câu hỏi thường gặp
Tôi có thể giữ trang Astro của mình tĩnh 100% bằng Lugatu không?
Đúng. Các trang web thuần túy tĩnh (SSG) gửi trực tiếp đến điểm cuối công khai Lugatu mà không yêu cầu bất kỳ máy chủ nào tính toán trên nhà cung cấp dịch vụ lưu trữ của bạn.
Bạn đã sẵn sàng tạo điểm cuối biểu mẫu chưa?
Bắt đầu miễn phí trong vài giây. Không cần thẻ tín dụng.