Home / Посібники / Інтеграція Astro Contact Form (Static & SSR)
ПОСІБНИК З ІНТЕГРАЦІЇ · ASTRO & JAMSTACK

Інтеграція Astro Contact Form (Static & SSR)

Як додати контактні форми до статичних сайтів Astro (SSG) і гібридних серверних маршрутів за допомогою кінцевих точок Lugatu без підтримки серверів електронної пошти чи баз даних.

1. Поглинання форми чистого статичного сайту (SSG).

Astro відомий тим, що за умовчанням не містить JavaScript. За допомогою Lugatu ви можете підтримувати свій сайт Astro на 100% статичним, одночасно збираючи запити за допомогою стандартних HTML-форм і легкої вибірки на стороні клієнта.

src/pages/contact.astro astro
---
// 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. Маршрут API Astro Hybrid / SSR із ключем API сервера

Якщо ваш сайт Astro працює в гібридному режимі або режимі SSR на сторінках Cloudflare, Netlify або Vercel, безпечно пересилайте подання через маршрут Astro API.

src/pages/api/contact.ts typescript
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' },
  });
};

Інваріант безпеки та автентифікації

Інструкція з безпеки: ніколи не розкривайте import.meta.env.LUGATU_API_KEY у тегах клієнтського сценарію Astro. Клієнтські сценарії мають використовувати лише публічну кінцеву точку.

Усунення несправностей і поширені помилки передавання

Форма працює локально, але не працює під час робочої збірки Cloudflare/Netlify

Переконайтеся, що змінні робочого середовища (LUGATU_FORM_ID і LUGATU_API_KEY) налаштовано на інформаційній панелі хостингу.

Часті запитання

Чи можу я підтримувати 100% статичний сайт Astro за допомогою Lugatu?

так Чисто статичні (SSG) сайти надсилаються безпосередньо до загальнодоступної кінцевої точки Lugatu, не вимагаючи жодних серверних обчислень у вашого хостинг-провайдера.

Готові створити кінцеву точку форми?

Почніть безкоштовно за лічені секунди. Кредитна картка не потрібна.

Почніть безкоштовно →