Simpan kiriman webhook sebagai fail JSON dalam Google Drive

Jawapan ringkas: Sahkan nama, e-mel dan butiran permintaan daripada webhook dengan pengesahan akses, simpannya sebagai JSON, kemudian muat naik fail ke Google Drive. Ujian pengeluaran untuk permintaan berurutan lulus dengan penormalan nama Unicode yang didokumenkan.

Status: diuji dalam persekitaran pengeluaran untuk permintaan berurutan. Keputusan: 48/48 dengan penormalan nama Unicode yang didokumenkan; 47 daripada 48 sepadan tepat.

Simpan kiriman webhook dengan menerima webhook JSON dengan pengesahan akses, menyemak name, email dan request, menulis medan tersebut ke fail JSON setempat, kemudian memuat naiknya ke folder Google Drive pilihan anda. Graf ini menggunakan komponen fail dan JSON tanpa model AI.

Oleh Ai Flowi · Diterbitkan · Dikemas kini . Diuji dengan AI Flowi Workflow 1.9.2.

Dalam unicode-literal, HTTP 200 disertai satu fail baharu. Nilai name yang disimpan menggunakan bentuk Unicode NFD: huruf beraksen diuraikan, dan nilainya sama selepas penormalan NFC. Medan email dan request sepadan tepat, termasuk Windows CR+LF dalam permintaan; emoji dalam nama dikekalkan. Keputusan 48/48 ini tertakluk pada syarat tersebut, bukannya 48 padanan tepat.

Medan yang ditolak dan JSON yang formatnya tidak betul menghasilkan HTTP 422 dan tiada fail baharu dikesan dalam pemerhatian. Permintaan tanpa Platform API Key yang sah menghasilkan HTTP 403 dan tiada fail baharu dikesan dalam pemerhatian. Kiriman berurutan yang sah menghasilkan HTTP 200 dan satu fail baharu setiap kali, termasuk penghantaran berulang.

Berkaitan: Integrasi Google Drive untuk AI Flowi Workflow; Amazon S3 integration dalam AI Flowi Workflow.

Tugasan

Simpan kiriman yang diterima sebagai objek JSON dalam Drive dengan hanya name, email dan request. Medan input tambahan dan penanda pengesahan data tidak dimasukkan ke dalam muatan yang disimpan. Resipi ini mencipta fail Drive yang berasingan walaupun nama fail yang dikonfigurasikan kekal sama.

Untuk siapa

Pasukan yang memerlukan rekod permintaan JSON dalam folder Drive, dengan pelayan dipercayai yang boleh menghantar kiriman satu demi satu. Laksanakan pengesahan akses webhook dalam integrasi pelayan tersebut; menyisipkan Platform API Key dalam borang awam akan mendedahkannya.

Contoh input

{"name":"Demo Contact","email":"demo@example.com","request":"Keep this request as JSON."}

Dengan nama fail contoh submission.json, fail yang dimuat turun sepatutnya dihuraikan menjadi:

{
  "name": "Demo Contact",
  "email": "demo@example.com",
  "request": "Keep this request as JSON."
}

Ruang putih dan pemformatan jujukan pelepasan JSON bukan kriteria ujian; nilai medan selepas penghuraianlah kriterianya. Penukaran nama kepada NFD yang didokumenkan terpakai pada kes Unicode.

Persediaan

  1. Berikan kebenaran kepada sambungan Google untuk memuat naik fail ke Drive dan pilih folder destinasi yang membenarkan anda menulis. Akses Sheets sahaja mungkin tidak mempunyai skop Drive yang diperlukan. Lihat persediaan sambungan Google.
  2. Pastikan proses pelaksana (worker) yang menjalankan aliran mempunyai direktori semasa yang boleh ditulis dan storan backend setempat. Write File dan Upload File mesti mengakses fail setempat yang sama pada proses pelaksana tersebut. Laluan ini belum disahkan dengan storan S3 atau proses pelaksana yang berasingan.
  3. Bina sembilan nod: Universal Webhook, JSON Operations pengesahan data, Verification Router, JSON Operations muatan, Write File, Google Drive Upload File, JSON Operations respons, serta nod kejayaan dan penolakan Webhook Response.
  4. Pada Universal Webhook, pilih POST, Platform API Key untuk pengesahan akses dan From Flow untuk POST Response Mode. Pada setiap nod JSON Operations, pilih JQ Expression dan gunakan pertanyaan yang sepadan di bawah.
  5. Tetapkan Write File kepada storan Local, format json dan matikan mod tambah. Gunakan nama asas fail tanpa garis miring, seperti submission.json. Pada Upload File, tetapkan medan asli file_path kepada fail pada proses pelaksana yang sama, drive_file_name kepada nama fail JSON pilihan anda, mime_type kepada application/json, dan parent_folder_id kepada folder destinasi anda. Pilih Google Account yang telah diberi kebenaran.
  6. Sambungkan message pada Write File kepada description pada Upload File supaya muat naik menunggu penulisan selesai. Medan asli file_path tidak mempunyai port Data/JSON/Message yang boleh disambungkan; ia memerlukan laluan fail yang boleh digunakan semasa pelaksanaan, bukan sekadar nama fail yang dipaparkan. Sahkan konfigurasi dengan data sintetik sebelum bergantung padanya.
  7. Tetapkan respons kejayaan kepada 200 OK dan respons penolakan kepada 422 Unprocessable Entity, kedua-duanya dengan jenis kandungan application/json. Tunggu sehingga satu kiriman selesai sebelum menghantar yang seterusnya.

Sambungan nod dan pemetaan medan

Pemilihan medan untuk muatan membuang verified dan mengekalkan hanya medan yang diterima. Mesej penyelesaian Write File mengawal urutan pelaksanaan melalui keterangan muat naik; proses muat naik membaca laluan fail setempatnya yang dikonfigurasikan secara berasingan.

Lapan sambungan graf
KeluaranMasukan
Universal Webhook request_dataJSON Operations pengesahan data data
JSON Operations pengesahan data data_outputVerification Router verification_result
Verification Router verifiedJSON Operations muatan data
JSON Operations muatan data_outputWrite File input
Write File messageUpload File description
Upload File fileJSON Operations respons data
JSON Operations respons data_outputWebhook Response kejayaan body_data
Verification Router rejectedWebhook Response penolakan body_data

JQ muatan:

{name:.name,email:.email,request:.request}

JQ respons menyemak ID muat naik yang tidak kosong dan jenis MIME JSON. Respons yang diuji sengaja mengembalikan penanda literal yang menggantikan ID fail yang dirahsiakan, bukannya ID fail Drive yang boleh digunakan:

if (.id|type) == "string" then
  if (.id|length) > 0 and .mimeType == "application/json" then
    {status:"created",file_id:"<redacted-file-id>"}
  else error("File upload incomplete") end
else error("File upload incomplete") end

Contoh permintaan dan respons dengan maklumat sensitif disamarkan

Gantikan ruang letak bagi URL dan maklumat pengesahan akses dalam sistem penghantar yang dipercayai:

POST https://workflow.aiflowi.com/api/v1/webhook/<your-flow-id>
Content-Type: application/json
x-api-key: <your-platform-api-key>

{"name":"Demo Contact","email":"demo@example.com","request":"Keep this request as JSON."}

Badan respons kejayaan HTTP 200 untuk pemetaan respons yang diuji:

{"status":"created","file_id":"<redacted-file-id>"}

Penanda ini ialah nilai literal dalam resipi ini. Ia tidak boleh digunakan untuk mencari fail yang dimuat naik. Semak folder Drive pilihan anda dan baca semula JSON untuk mengesahkan penyimpanan.

Jika email tidak disertakan, cabang penolakan HTTP 422 digunakan:

{"verified":false,"error":"Validation failed","details":["email must be a valid address up to 254 characters"]}

Pengesahan data dan perkara yang berlaku apabila proses gagal

Buka JQ pengesahan data

Letakkan ini dalam nod JSON Operations pengesahan data dengan JQ Expression dipilih.

(.body) as $b
| if ($b|type) != "object" then {verified:false, error:"Request body must be a JSON object with name, email and request."}
  else ([
    (if ($b.name|type) == "string" then
       if ($b.name|length) >= 1 and ($b.name|length) <= 100 and ($b.name|test("[^\\s]")) and (($b.name|test("^\\s|\\s$"))|not) and ($b.name|explode|all(. >= 32 and . != 127)) then empty else "name must be 1-100 characters, nonblank, without control characters or outer whitespace" end
     else "name must be 1-100 characters, nonblank, without control characters or outer whitespace" end),
    (if ($b.email|type) == "string" then
       if ($b.email|length) <= 254 and ($b.email|test("^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$")) and ($b.email|explode|all(. >= 32 and . != 127)) then empty else "email must be a valid address up to 254 characters" end
     else "email must be a valid address up to 254 characters" end),
    (if ($b.request|type) == "string" then
       if ($b.request|length) >= 1 and ($b.request|length) <= 5000 and ($b.request|test("[^\\s]")) and ($b.request|explode|all(. == 9 or . == 10 or . == 13 or (. >= 32 and . != 127))) then empty else "request must be 1-5000 characters, nonblank, with only tab/newline/CR controls" end
     else "request must be 1-5000 characters, nonblank, with only tab/newline/CR controls" end)
  ]) as $errors
  | if ($errors|length) > 0 then {verified:false, error:"Validation failed", details:$errors}
    else {verified:true, name:$b.name, email:$b.email, request:$b.request} end
  end
  • name mestilah rentetan sepanjang 1–100 titik kod Unicode, mengandungi teks selain ruang putih dan tiada ruang putih di awal atau akhir, aksara kawalan C0 atau DEL.
  • email mestilah rentetan sehingga 254 titik kod yang sepadan dengan pola alamat asas dalam pertanyaan, tanpa aksara kawalan C0 atau DEL. Ini hanya menyemak sintaks; ia tidak membuktikan bahawa e-mel boleh dihantar ke alamat tersebut.
  • request mestilah rentetan sepanjang 1–5000 titik kod yang mengandungi teks selain ruang putih. Tab, LF dan CR dibenarkan; aksara kawalan C0 yang lain dan DEL ditolak.
  • Pengesah tidak membuang ruang putih di awal atau akhir mahupun menulis semula nilai yang diterima. Bacaan semula mendapati nama Unicode dalam bentuk NFD, yang sama selepas penormalan NFC, manakala nilai email dan request kekal sepadan tepat. Windows CR+LF dalam permintaan dikekalkan.
  • Badan yang bukan objek dan medan yang ditolak mengembalikan 422 dan tiada fail baharu dikesan dalam pemerhatian. Platform mengembalikan 403 untuk kunci yang tiada atau tidak sah sebelum cabang penulisan.
  • malformed-json menjangkakan sama ada 400 atau 422; respons sebenar ialah 422 dan tiada fail baharu dikesan dalam pemerhatian. Pemerhatian itu tidak merangkumi penggunaan penghurai yang berbeza.
  • Graf ini tidak mempunyai mekanisme menangkap ralat storan atau Google dalam aliran. Ralat tersebut boleh menghentikan pelaksanaan dan mendedahkan ralat mentah platform atau penyedia kepada pemanggil webhook. Penghantar anda memerlukan respons kegagalan yang selamat untuk dipaparkan kepada pengguna.

Penulisan setempat boleh berjaya sebelum muat naik ke Drive gagal. Muat naik juga boleh berjaya sebelum respons webhook gagal, menjadikan hasilnya tidak pasti. Cubaan semula automatik kemudian boleh mencipta fail lain. Mesej penyelesaian penulisan yang digunakan sebagai keterangan Drive mungkin mengandungi laluan fail pada proses pelaksana; ambil kira metadata tersebut apabila berkongsi fail.

Keputusan ujian

Bukti ini merangkumi permintaan ujian sintetik dalam ruang kerja Ai Flowi sendiri pada 9 Oktober 2026. Pelaksanaan utama mengandungi 48 kes, dengan semakan respons HTTP, bilangan fail baharu dan nilai medan JSON yang dimuat turun. Ia merekodkan 47 keputusan LULUS dan satu GAGAL: unicode-literal gagal dalam perbandingan nama secara tepat walaupun mengembalikan 200 dan mencipta satu fail.

Pelaksanaan semula diagnostik terkini bagi unicode-literal mengesahkan NFD dalam name dan kesamaan selepas penormalan NFC, dengan nilai email dan request yang sepadan tepat. Emoji dikekalkan, dan Windows CR+LF tidak ditukar kepada LF. Kedua-dua fail bukti mengekalkan keputusan GAGAL asal bagi perbandingan tepat; penormalan yang didokumenkan menyokong 48/48 hanya apabila perbandingan tertakluk pada syarat tersebut.

Tatal jadual secara mendatar jika ia memerlukan lebih ruang. Kawasannya yang berlabel boleh difokuskan menggunakan papan kekunci.

Semua kes, termasuk kegagalan perbandingan Unicode asal
ID kesHasil yang dijangkaHTTP yang diperhatikanFail baharu yang diperhatikanKeputusan direkodkan / syarat
valid200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001LULUS
missing-name422; tiada fail baharu4220LULUS
missing-email422; tiada fail baharu4220LULUS
missing-request422; tiada fail baharu4220LULUS
type-name-0422; tiada fail baharu4220LULUS
type-name-1422; tiada fail baharu4220LULUS
type-name-2422; tiada fail baharu4220LULUS
type-name-3422; tiada fail baharu4220LULUS
type-name-4422; tiada fail baharu4220LULUS
type-email-0422; tiada fail baharu4220LULUS
type-email-1422; tiada fail baharu4220LULUS
type-email-2422; tiada fail baharu4220LULUS
type-email-3422; tiada fail baharu4220LULUS
type-email-4422; tiada fail baharu4220LULUS
type-request-0422; tiada fail baharu4220LULUS
type-request-1422; tiada fail baharu4220LULUS
type-request-2422; tiada fail baharu4220LULUS
type-request-3422; tiada fail baharu4220LULUS
type-request-4422; tiada fail baharu4220LULUS
invalid-email422; tiada fail baharu4220LULUS
malformed-json400 atau 422; tiada fail baharu4220LULUS
missing-key403; tiada fail baharu4030LULUS
invalid-key403; tiada fail baharu4030LULUS
blank-name-0422; tiada fail baharu4220LULUS
blank-name-1422; tiada fail baharu4220LULUS
blank-email-0422; tiada fail baharu4220LULUS
blank-email-1422; tiada fail baharu4220LULUS
blank-request-0422; tiada fail baharu4220LULUS
blank-request-1422; tiada fail baharu4220LULUS
non-object-0422; tiada fail baharu4220LULUS
non-object-1422; tiada fail baharu4220LULUS
non-object-2422; tiada fail baharu4220LULUS
non-object-3422; tiada fail baharu4220LULUS
name-too-long422; tiada fail baharu4220LULUS
email-too-long422; tiada fail baharu4220LULUS
request-too-long422; tiada fail baharu4220LULUS
name-control422; tiada fail baharu4220LULUS
request-control422; tiada fail baharu4220LULUS
name-leading-space422; tiada fail baharu4220LULUS
name-trailing-space422; tiada fail baharu4220LULUS
unicode-literal200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001Asal: GAGAL; lulus selepas penormalan nama NFC dalam pelaksanaan semula diagnostik
minimum-boundaries200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001LULUS
boundaries200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001LULUS
unicode-name-boundary200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001LULUS
unicode-name-too-long422; tiada fail baharu4220LULUS
extra-fields200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan2001LULUS
repeat-first200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan; fail berasingan bagi setiap penghantaran2001LULUS
repeat-second200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan; fail berasingan bagi setiap penghantaran2001LULUS

repeat-first dan repeat-second masing-masing mengembalikan 200 dan menambah satu fail. Fail kedua mempunyai ID yang berbeza, maka pengulangan kiriman tidak menyingkirkan pendua.

Format penyampaian: Resipi yang diuji

Bina semula graf ini dengan tetapan, port dan JQ yang disediakan di sini. Muat turun aliran kerja yang boleh diimport tidak disediakan. Pemerhatian semasa pelaksanaan membuktikan laluan berurutan yang diuji, tetapi tidak membuktikan ketepatan kitaran eksport dan import atau pengekalan data yang disimpan secara automatik oleh editor.

Konfigurasi yang diperlukan

Anda memerlukan Google Account dengan kebenaran Drive, folder destinasi yang boleh ditulis, storan backend setempat pada proses pelaksana yang menjalankan aliran, serta laluan Write File dan Upload File yang sepadan. Konfigurasikan Production Endpoint webhook anda untuk POST, pengesahan akses Platform API Key dan respons From Flow.

Cari Write File, Google Drive Upload File dan nod pemprosesan dalam katalog komponen yang tersedia. Sambungan Google diperlukan untuk muat naik; tiada kelayakan akses model dikonfigurasikan dalam graf ini.

Versi dan tarikh ujian

Resipi ini diuji pada menggunakan AI Flowi Workflow 1.9.2. Bukti yang disediakan merangkumi pelaksanaan penuh 48 kes dan pelaksanaan semula diagnostik untuk ketidakpadanan Unicode. Ia tidak merangkumi penghantaran serentak, import atau pengekalan data yang disimpan oleh editor.

Andaian penggunaan dan kos

Pelan: Go dari USD8/bulan dengan bil tahunan (USD10 bulanan), Plus dari USD16 (USD20 bulanan), Pro 100 dari USD80 (USD100 bulanan), Pro 200 dari USD160 (USD200 bulanan) dan Pro 500 dari USD400 (USD500 bulanan), dengan 5,000 hingga 250,000 Flowi Tokens sebulan dan pilihan tambah nilai; 1 token bagi setiap pelaksanaan nod; penggunaan API dan model pihak ketiga tidak termasuk.

Ujian ini mengukur respons dan fail yang disimpan, bukannya pengebilan. Periksa log transaksi untuk nod yang dilaksanakan, cubaan semula dan caj pelaksanaan gagal sebelum membuat anggaran belanjawan. Graf ini tidak mempunyai model AI yang dikonfigurasikan. Keperluan sambungan Google dan storan setempat masih terpakai. Penggunaan API/model pihak ketiga tidak termasuk dalam pelan.

Batasan

  • Fail perantaraan setempat yang tetap hanya sesuai untuk pemprosesan berurutan. Kiriman serentak boleh menulis ganti muatan sebelum muat naik. Untuk menyokong pemprosesan serentak, laluan pelayan bagi setiap permintaan dan komponen muat naik yang boleh menerima laluan tersebut melalui sambungan diperlukan.
  • Penghantaran berulang mencipta fail Drive tambahan dengan nama fail yang sama seperti yang dikonfigurasikan. Tiada perlindungan daripada pendua, pengembalian ke keadaan sebelumnya atau pemulihan automatik bagi hasil yang tidak pasti.
  • Write File memerlukan direktori semasa proses pelaksana yang boleh ditulis dan storan backend setempat yang boleh diakses oleh Upload File. Storan S3 dan pelaksanaan merentas proses pelaksana yang berasingan tidak disahkan.
  • Write File juga mencipta salinan platform. Salinan perantaraan setempat dan salinan platform dikekalkan, maka konfigurasikan pengekalan dan akses untuk salinan tersebut serta fail Drive.
  • Berikan kebenaran akses Drive yang diperlukan walaupun Sheets sudah berfungsi. Kegagalan penyedia boleh sampai kepada pemanggil webhook sebagai ralat mentah; graf ini tidak mempunyai mekanisme menangkap pengecualian Google dalam aliran.
  • Nama Unicode yang diuji disimpan dalam bentuk NFD. Bandingkan selepas penormalan NFC jika sesuai; jangan anggap nama beraksen mempunyai titik kod yang sama tepat.
  • Penyenaraian Drive mencapai kekonsistenan selepas suatu tempoh. Ketiadaan fail baharu dalam pemerhatian penolakan bukan jaminan atomik bahawa tiada penulisan berlaku.
  • Nilai file_id dalam respons yang diuji ialah penanda yang menggantikan ID fail yang dirahsiakan, bukannya pengecam yang boleh digunakan. Tiada semakan kitaran eksport dan import atau simpanan automatik editor yang menyokong dakwaan bahawa templat boleh dimuat turun.

Langkah seterusnya

Mulakan dengan kiriman sintetik anda sendiri dan periksa JSON yang disimpan, folder destinasi dan log transaksi. Kekalkan penghantaran berurutan dan biarkan penghantar mengendalikan kegagalan dengan selamat sebelum mengumpulkan permintaan sebenar. Tutorial webhook ke Google Sheets menyediakan panduan berkaitan pengesahan data dan sambungan Google.