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
- 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.
- 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.
- 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.
- Pada Universal Webhook, pilih
POST,Platform API Keyuntuk pengesahan akses danFrom Flowuntuk POST Response Mode. Pada setiap nod JSON Operations, pilihJQ Expressiondan gunakan pertanyaan yang sepadan di bawah. - Tetapkan Write File kepada storan
Local, formatjsondan matikan mod tambah. Gunakan nama asas fail tanpa garis miring, sepertisubmission.json. Pada Upload File, tetapkan medan aslifile_pathkepada fail pada proses pelaksana yang sama,drive_file_namekepada nama fail JSON pilihan anda,mime_typekepadaapplication/json, danparent_folder_idkepada folder destinasi anda. Pilih Google Account yang telah diberi kebenaran. - Sambungkan
messagepada Write File kepadadescriptionpada Upload File supaya muat naik menunggu penulisan selesai. Medan aslifile_pathtidak 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. - Tetapkan respons kejayaan kepada
200 OKdan respons penolakan kepada422 Unprocessable Entity, kedua-duanya dengan jenis kandunganapplication/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.
| Keluaran | Masukan |
|---|---|
Universal Webhook request_data | JSON Operations pengesahan data data |
JSON Operations pengesahan data data_output | Verification Router verification_result |
Verification Router verified | JSON Operations muatan data |
JSON Operations muatan data_output | Write File input |
Write File message | Upload File description |
Upload File file | JSON Operations respons data |
JSON Operations respons data_output | Webhook Response kejayaan body_data |
Verification Router rejected | Webhook 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
endnamemestilah 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.emailmestilah 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.requestmestilah 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-jsonmenjangkakan 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.
| ID kes | Hasil yang dijangka | HTTP yang diperhatikan | Fail baharu yang diperhatikan | Keputusan direkodkan / syarat |
|---|---|---|---|---|
valid | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | LULUS |
missing-name | 422; tiada fail baharu | 422 | 0 | LULUS |
missing-email | 422; tiada fail baharu | 422 | 0 | LULUS |
missing-request | 422; tiada fail baharu | 422 | 0 | LULUS |
type-name-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-name-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-name-2 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-name-3 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-name-4 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-email-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-email-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-email-2 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-email-3 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-email-4 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-request-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-request-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-request-2 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-request-3 | 422; tiada fail baharu | 422 | 0 | LULUS |
type-request-4 | 422; tiada fail baharu | 422 | 0 | LULUS |
invalid-email | 422; tiada fail baharu | 422 | 0 | LULUS |
malformed-json | 400 atau 422; tiada fail baharu | 422 | 0 | LULUS |
missing-key | 403; tiada fail baharu | 403 | 0 | LULUS |
invalid-key | 403; tiada fail baharu | 403 | 0 | LULUS |
blank-name-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
blank-name-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
blank-email-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
blank-email-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
blank-request-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
blank-request-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
non-object-0 | 422; tiada fail baharu | 422 | 0 | LULUS |
non-object-1 | 422; tiada fail baharu | 422 | 0 | LULUS |
non-object-2 | 422; tiada fail baharu | 422 | 0 | LULUS |
non-object-3 | 422; tiada fail baharu | 422 | 0 | LULUS |
name-too-long | 422; tiada fail baharu | 422 | 0 | LULUS |
email-too-long | 422; tiada fail baharu | 422 | 0 | LULUS |
request-too-long | 422; tiada fail baharu | 422 | 0 | LULUS |
name-control | 422; tiada fail baharu | 422 | 0 | LULUS |
request-control | 422; tiada fail baharu | 422 | 0 | LULUS |
name-leading-space | 422; tiada fail baharu | 422 | 0 | LULUS |
name-trailing-space | 422; tiada fail baharu | 422 | 0 | LULUS |
unicode-literal | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | Asal: GAGAL; lulus selepas penormalan nama NFC dalam pelaksanaan semula diagnostik |
minimum-boundaries | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | LULUS |
boundaries | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | LULUS |
unicode-name-boundary | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | LULUS |
unicode-name-too-long | 422; tiada fail baharu | 422 | 0 | LULUS |
extra-fields | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan | 200 | 1 | LULUS |
repeat-first | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan; fail berasingan bagi setiap penghantaran | 200 | 1 | LULUS |
repeat-second | 200; satu fail JSON, medan sepadan tepat; medan tambahan dikecualikan; fail berasingan bagi setiap penghantaran | 200 | 1 | LULUS |
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_iddalam 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.