<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Walse</title>
    <description>The latest articles on DEV Community by Walse (@walse).</description>
    <link>https://dev.to/walse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2112661%2Fe62db7e6-764e-4e09-ade6-b75346d4aa5b.jpeg</url>
      <title>DEV Community: Walse</title>
      <link>https://dev.to/walse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/walse"/>
    <language>en</language>
    <item>
      <title>Cara Menggunakan Skrip Pre-Request dan Post-Response di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 09:26:01 +0000</pubDate>
      <link>https://dev.to/walse/cara-menggunakan-skrip-pre-request-dan-post-response-di-apidog-13pi</link>
      <guid>https://dev.to/walse/cara-menggunakan-skrip-pre-request-dan-post-response-di-apidog-13pi</guid>
      <description>&lt;p&gt;Beberapa permintaan API memerlukan pekerjaan sebelum meninggalkan mesin Anda, sementara yang lain memerlukan validasi setelah respons diterima. Contohnya: API pembayaran membutuhkan tanda tangan HMAC dari timestamp dan secret, endpoint login mengembalikan token untuk permintaan berikutnya, dan alur checkout harus memastikan respons benar-benar mengembalikan status &lt;code&gt;200&lt;/code&gt; serta ID pesanan yang sesuai. Jika semuanya dilakukan manual, prosesnya cepat membosankan dan mudah rusak saat dibagikan ke tim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog sekarang&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Skrip menyelesaikan masalah ini. Di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, Anda dapat melampirkan JavaScript ke permintaan API agar berjalan otomatis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre Processor&lt;/strong&gt;: berjalan sebelum permintaan dikirim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post Processor&lt;/strong&gt;: berjalan setelah respons diterima.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda pernah membuat skrip Postman, sebagian besar pola tersebut dapat digunakan kembali karena Apidog kompatibel dengan API objek &lt;code&gt;pm&lt;/code&gt;. Artikel ini menunjukkan cara:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Menandatangani request dengan HMAC di &lt;strong&gt;Pre Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Mengekstrak token dan menambahkan assertion di &lt;strong&gt;Post Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Menggunakan ulang logika dengan &lt;strong&gt;Public Scripts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Menjalankan skenario melalui CLI untuk CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dokumentasi lengkap tersedia di &lt;a href="https://docs.apidog.com/" rel="noopener noreferrer"&gt;dokumen skrip Apidog&lt;/a&gt;, tetapi nama tab dan beberapa perilaku berbeda dari Postman.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang Sebenarnya Dilakukan Skrip Pra dan Pasca
&lt;/h2&gt;

&lt;p&gt;Apidog menjalankan skrip dalam dua tahap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pre Processor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Pre Processor&lt;/strong&gt; berjalan sebelum request dikirim ke server. Gunakan tahap ini untuk menyiapkan data yang dibutuhkan request, misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Membuat timestamp.&lt;/li&gt;
&lt;li&gt;Menghitung tanda tangan HMAC.&lt;/li&gt;
&lt;li&gt;Membuat ID pesanan acak.&lt;/li&gt;
&lt;li&gt;Membaca variabel lalu membentuk header atau body.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pada tahap ini, respons belum tersedia. Karena itu, jangan membaca &lt;code&gt;pm.response&lt;/code&gt; di Pre Processor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Post Processor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Post Processor&lt;/strong&gt; berjalan setelah respons diterima. Gunakan tahap ini untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memastikan kode status sesuai.&lt;/li&gt;
&lt;li&gt;Memvalidasi bentuk dan isi respons.&lt;/li&gt;
&lt;li&gt;Mengekstrak token autentikasi.&lt;/li&gt;
&lt;li&gt;Menyimpan ID resource yang baru dibuat.&lt;/li&gt;
&lt;li&gt;Menyimpan cursor untuk pagination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aturan praktisnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;pm.response&lt;/code&gt;—termasuk &lt;code&gt;code&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;headers&lt;/code&gt;, &lt;code&gt;responseTime&lt;/code&gt;, &lt;code&gt;responseSize&lt;/code&gt;, &lt;code&gt;text()&lt;/code&gt;, dan &lt;code&gt;json()&lt;/code&gt;—hanya tersedia di &lt;strong&gt;Post Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Variabel adalah cara Pre Processor, request, dan Post Processor bertukar data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika Anda menggunakan Postman, perhatikan perubahan nama berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;Apidog&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pre-request Script&lt;/td&gt;
&lt;td&gt;Pre Processor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests&lt;/td&gt;
&lt;td&gt;Post Processor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Perilakunya mirip, tetapi label di antarmukanya berbeda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pengaturan: Buka Request dan Temukan Tab Skrip
&lt;/h2&gt;

&lt;p&gt;Untuk mengikuti contoh, unduh Apidog dari halaman &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Buka request API yang ingin Anda otomatisasi. Setiap endpoint memiliki tab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Params&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Headers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Body&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre Processor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post Processor&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk menambahkan logika:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka tab &lt;strong&gt;Pre Processor&lt;/strong&gt; atau &lt;strong&gt;Post Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;tambahkan Skrip Kustom&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tulis JavaScript menggunakan objek &lt;code&gt;pm&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sebelum membuat skrip, pahami urutan prioritas variabel Apidog:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Variabel Lokal &amp;gt; Variabel Lingkungan &amp;gt; Variabel Global yang Dibagikan dalam Proyek &amp;gt; Variabel Global yang Dibagikan dalam Tim&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Artinya, variabel lokal akan menimpa variabel lingkungan dengan nama yang sama. Jika nilai variabel tidak sesuai harapan, periksa apakah ada variabel dengan prioritas lebih tinggi yang membayangi nilainya.&lt;/p&gt;

&lt;p&gt;Untuk konfigurasi yang stabil di seluruh proyek, gunakan &lt;a href="https://apidog.com/id/blog/how-to-set-global-parameters-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;parameter global di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contoh Pre Processor: Menandatangani Request dengan HMAC
&lt;/h2&gt;

&lt;p&gt;Misalkan Anda memanggil endpoint pembayaran yang menggunakan HMAC-SHA256 untuk memverifikasi setiap request. Server mengharapkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp saat request dibuat.&lt;/li&gt;
&lt;li&gt;Signature yang dihitung dari timestamp, body request, dan API secret.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pola ini umum digunakan pada integrasi pembayaran dan webhook. Contoh konsepnya juga dijelaskan dalam &lt;a href="https://docs.stripe.com/webhooks/signatures" rel="noopener noreferrer"&gt;dokumen tanda tangan Stripe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apidog menyediakan &lt;code&gt;crypto-js&lt;/code&gt; sebagai pustaka bawaan. Di tab &lt;strong&gt;Pre Processor&lt;/strong&gt;, pilih &lt;strong&gt;tambahkan Skrip Kustom&lt;/strong&gt;, lalu tambahkan kode berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Pre Processor: menandatangani request sebelum dikirim&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Timestamp Unix saat ini dalam detik&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Membaca secret dari variabel lingkungan&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payments_api_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Membentuk payload: timestamp + baris baru + body mentah&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Menghitung signature HMAC-SHA256 dalam format hexadecimal&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HmacSHA256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CryptoJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Menyimpan nilai untuk digunakan oleh request&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x_timestamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x_signature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Request ditandatangani pada &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya, gunakan variabel tersebut pada tab &lt;strong&gt;Headers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X-Timestamp: {{x_timestamp}}
X-Signature: {{x_signature}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat request dikirim, urutannya adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apidog menjalankan Pre Processor.&lt;/li&gt;
&lt;li&gt;Skrip membuat timestamp dan signature.&lt;/li&gt;
&lt;li&gt;Nilai disimpan ke variabel lingkungan.&lt;/li&gt;
&lt;li&gt;Apidog menggantikan &lt;code&gt;{{x_timestamp}}&lt;/code&gt; dan &lt;code&gt;{{x_signature}}&lt;/code&gt; di header.&lt;/li&gt;
&lt;li&gt;Server menerima signature yang baru dibuat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Perhatikan cara impor pustaka berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan modul utuh. Berikut tidak didukung:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto-js/sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operasi variabel di skrip hanya mengubah nilai saat ini, bukan nilai awal yang mungkin terlihat di editor environment. Ini sesuai untuk signature karena nilainya harus dibuat ulang setiap request.&lt;/p&gt;

&lt;p&gt;Untuk pola serupa dengan istilah Postman, lihat panduan &lt;a href="https://apidog.com/id/blog/postman-pre-request-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;skrip pra-permintaan Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contoh Post Processor: Mengekstrak Token dan Menambahkan Assertion
&lt;/h2&gt;

&lt;p&gt;Sekarang, misalkan endpoint login mengembalikan respons berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4812&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expires_in"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buka tab &lt;strong&gt;Post Processor&lt;/strong&gt;, pilih &lt;strong&gt;tambahkan Skrip Kustom&lt;/strong&gt;, lalu tambahkan kode berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Post Processor: verifikasi respons, lalu ekstrak token&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Status adalah 200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Respons mengembalikan token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;and&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;not&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ID pengguna ada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Simpan token agar bisa digunakan request lain&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Token tersimpan untuk pengguna &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skrip ini melakukan dua pekerjaan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Menjalankan assertion dengan &lt;code&gt;pm.test()&lt;/code&gt; dan &lt;code&gt;pm.expect()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Menyimpan token ke environment melalui &lt;code&gt;pm.environment.set()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Request terautentikasi berikutnya dapat menggunakan token tersebut secara langsung:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer {{auth_token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan begitu, Anda tidak perlu lagi menyalin token login secara manual.&lt;/p&gt;

&lt;p&gt;Untuk pola assertion yang lebih lengkap, lihat panduan &lt;a href="https://apidog.com/id/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penegasan API di Apidog&lt;/a&gt;. Jika Anda membutuhkan data dummy realistis, &lt;a href="https://apidog.com/id/blog/faker-js-and-how-to-use-it-in-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Faker.js di Apidog&lt;/a&gt; dapat digunakan bersama variabel yang sama.&lt;/p&gt;

&lt;p&gt;Beberapa perilaku penting di Post Processor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pm.iterationData&lt;/code&gt; bersifat hanya-baca. Anda dapat membaca data uji, tetapi tidak dapat menulis kembali ke sana.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pm.cookies&lt;/code&gt; berisi cookie dari respons server, bukan cookie yang dikirim bersama request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Menggunakan Kembali Logika dengan Public Scripts
&lt;/h2&gt;

&lt;p&gt;Jangan salin-tempel blok HMAC ke banyak endpoint. Jika algoritma berubah, Anda harus memperbaiki semua salinan skrip tersebut.&lt;/p&gt;

&lt;p&gt;Gunakan &lt;strong&gt;Skrip Publik&lt;/strong&gt; untuk menyimpan logika yang dapat digunakan ulang.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;Settings &amp;gt; Public Scripts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Buat skrip bersama, misalnya untuk signing HMAC.&lt;/li&gt;
&lt;li&gt;Tambahkan skrip tersebut ke tab &lt;strong&gt;Pre Processor&lt;/strong&gt; atau &lt;strong&gt;Post Processor&lt;/strong&gt; pada request yang membutuhkan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Urutan eksekusi penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public Script dijalankan sebelum Custom Script dalam daftar yang sama.&lt;/li&gt;
&lt;li&gt;Jika ada beberapa Public Script, skrip dijalankan dari atas ke bawah.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Custom Script perlu memanggil fungsi dari Public Script, deklarasikan fungsi tersebut sebagai global.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Jangan gunakan var, let, atau const agar fungsi bersifat global&lt;/span&gt;
&lt;span class="nx"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto-js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HmacSHA256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CryptoJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Hex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Custom Script yang diletakkan di bawahnya:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payments_api_secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x_timestamp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x_signature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan Public Script berada sebelum Custom Script. Jika urutannya terbalik, atau fungsi dideklarasikan dengan &lt;code&gt;const&lt;/code&gt;, Anda akan mendapatkan error bahwa fungsi tidak terdefinisi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pustaka, Paket Eksternal, dan Debugging
&lt;/h2&gt;

&lt;p&gt;Apidog menyediakan beberapa pustaka bawaan yang dapat dipanggil dengan &lt;code&gt;require()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/brix/crypto-js" rel="noopener noreferrer"&gt;&lt;code&gt;crypto-js&lt;/code&gt;&lt;/a&gt; (v3.1.9-1) untuk hashing dan HMAC.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jsrsasign&lt;/code&gt; (v10.3.0) untuk JWT dan RSA; membutuhkan Apidog 1.4.5 atau lebih baru.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.chaijs.com/" rel="noopener noreferrer"&gt;&lt;code&gt;chai&lt;/code&gt;&lt;/a&gt; (v4.2.0) untuk assertion.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lodash&lt;/code&gt;, &lt;code&gt;moment&lt;/code&gt;, &lt;code&gt;uuid&lt;/code&gt;, &lt;code&gt;xml2js&lt;/code&gt;, &lt;code&gt;cheerio&lt;/code&gt;, &lt;code&gt;postman-collection&lt;/code&gt;, &lt;code&gt;atob&lt;/code&gt;, &lt;code&gt;btoa&lt;/code&gt;, &lt;code&gt;csv-parse/lib/sync&lt;/code&gt;, &lt;code&gt;tv4&lt;/code&gt;, dan &lt;code&gt;ajv&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Modul Node bawaan seperti &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;assert&lt;/code&gt;, &lt;code&gt;buffer&lt;/code&gt;, &lt;code&gt;util&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;querystring&lt;/code&gt;, &lt;code&gt;stream&lt;/code&gt;, dan &lt;code&gt;events&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika paket yang dibutuhkan tidak tersedia, gunakan &lt;code&gt;$$.liveRequire()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;liveRequire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nanoid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nanoid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nanoid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nanoid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$$.liveRequire()&lt;/code&gt; membutuhkan koneksi internet karena Apidog mengunduh paket saat runtime. Pustaka bawaan tidak membutuhkan koneksi tambahan.&lt;/p&gt;

&lt;p&gt;Untuk debugging, gunakan salah satu dari berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nilai signature:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Token:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jsonData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keduanya mencetak output ke konsol Apidog. Gunakan log untuk memeriksa payload, signature, token, atau nilai variabel sebelum mempercayainya dalam skenario otomatisasi.&lt;/p&gt;

&lt;p&gt;Perhatikan juga dua batasan berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pm.sendRequest()&lt;/code&gt; menggunakan callback, bukan Promise. Jangan gunakan &lt;code&gt;await&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pm.nextRequest()&lt;/code&gt; dari Postman tidak didukung.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda membutuhkan percabangan, kondisi, atau urutan request yang lebih kompleks, gunakan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Skenario Uji&lt;/a&gt;. Di sana Anda dapat menyusun request secara visual dengan langkah Kondisi dan If-Else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan Alur Kerja dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Pre Processor dan Post Processor tidak hanya berjalan saat Anda menekan tombol Send. Ketika request dan assertion dikemas ke dalam Skenario Uji, Anda dapat menjalankannya secara headless melalui Apidog CLI, termasuk semua skrip pra dan pasca request.&lt;/p&gt;

&lt;p&gt;Instal CLI, autentikasi, lalu jalankan skenario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;TOKEN_AKSES_ANDA&amp;gt;
apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;ID_SKENARIO&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;ID_LINGKUNGAN&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arti flag yang digunakan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID skenario uji&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reporter: &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anda dapat menggunakan beberapa reporter dengan pemisah koma.&lt;/p&gt;

&lt;p&gt;Buat access token dari pengaturan akun Apidog, simpan sebagai &lt;code&gt;APIDOG_ACCESS_TOKEN&lt;/code&gt;, lalu jalankan skenario yang sama di CI.&lt;/p&gt;

&lt;p&gt;Hindari skrip yang bergantung pada file lokal atau paket yang hanya tersedia di komputer Anda. Skrip semacam itu dapat berjalan di aplikasi desktop tetapi gagal di CLI. Gunakan pustaka bawaan atau &lt;code&gt;$$.liveRequire()&lt;/code&gt; agar perilakunya konsisten.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah skrip Apidog kompatibel dengan skrip Postman saya?
&lt;/h3&gt;

&lt;p&gt;Sebagian besar kompatibel. Apidog menggunakan API objek &lt;code&gt;pm&lt;/code&gt; yang sama, sehingga pola berikut tetap dapat digunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perbedaan utama adalah nama tab—&lt;strong&gt;Pre Processor&lt;/strong&gt; dan &lt;strong&gt;Post Processor&lt;/strong&gt;—serta beberapa panggilan seperti &lt;code&gt;pm.nextRequest()&lt;/code&gt; yang tidak didukung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa &lt;code&gt;pm.response&lt;/code&gt; mengembalikan &lt;code&gt;undefined&lt;/code&gt; di skrip pra-permintaan?
&lt;/h3&gt;

&lt;p&gt;Karena respons belum ada. Pre Processor berjalan sebelum request dikirim.&lt;/p&gt;

&lt;p&gt;Pindahkan kode yang membaca status, header, atau body respons ke Post Processor. Jika Anda membutuhkan data saat tahap pra-request, gunakan &lt;code&gt;pm.request&lt;/code&gt;, variabel, atau pustaka. Anda juga dapat &lt;a href="https://apidog.com/id/blog/retrieve-request-params-in-pre-post-request-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengambil parameter request di skrip pre/post&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara membagikan satu skrip ke banyak request?
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;strong&gt;Settings &amp;gt; Public Scripts&lt;/strong&gt;. Buat logika sekali, lalu tambahkan ke Pre Processor atau Post Processor pada setiap request yang relevan.&lt;/p&gt;

&lt;p&gt;Public Script berjalan sebelum Custom Script dalam daftar yang sama. Jika Custom Script perlu memanggil fungsi dari Public Script, deklarasikan fungsi secara global tanpa &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, atau &lt;code&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah saya mengimpor paket npm yang tidak dibundel Apidog?
&lt;/h3&gt;

&lt;p&gt;Bisa, gunakan pola berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;liveRequire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nama-paket&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Gunakan pkg di sini&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Metode ini membutuhkan koneksi internet. Untuk pustaka bawaan seperti &lt;code&gt;crypto-js&lt;/code&gt;, &lt;code&gt;moment&lt;/code&gt;, atau &lt;code&gt;uuid&lt;/code&gt;, gunakan &lt;code&gt;require()&lt;/code&gt; biasa.&lt;/p&gt;

&lt;p&gt;Gunakan nama modul lengkap, bukan jalur submodul.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di mana saya melihat output dari skrip?
&lt;/h3&gt;

&lt;p&gt;Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian buka konsol Apidog setelah request dikirim. Ini adalah cara cepat untuk memastikan signature sudah dihitung atau token sudah diekstrak dengan benar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Pre Processor dan Post Processor mengubah request statis menjadi request yang dapat menyiapkan dan memvalidasi dirinya sendiri.&lt;/p&gt;

&lt;p&gt;Gunakan pola berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat timestamp, signature, atau nilai dinamis di &lt;strong&gt;Pre Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Validasi respons dan ekstrak data di &lt;strong&gt;Post Processor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Simpan logika berulang sebagai &lt;strong&gt;Public Scripts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan skenario melalui CLI untuk otomatisasi CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;API &lt;code&gt;pm&lt;/code&gt; dan pustaka bawaan membuat sebagian besar pengetahuan Postman dapat langsung digunakan di Apidog. Buka &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, pilih request, lalu tambahkan Custom Script pertama Anda untuk menjalankan kedua tahap dalam satu pengiriman.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Mengatur Parameter Global di Apidog (Kirim Header Otentikasi Otomatis di Setiap Permintaan)</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:46:08 +0000</pubDate>
      <link>https://dev.to/walse/cara-mengatur-parameter-global-di-apidog-kirim-header-otentikasi-otomatis-di-setiap-permintaan-3k24</link>
      <guid>https://dev.to/walse/cara-mengatur-parameter-global-di-apidog-kirim-header-otentikasi-otomatis-di-setiap-permintaan-3k24</guid>
      <description>&lt;p&gt;Anda memiliki 40 endpoint dalam satu proyek, dan setiap endpoint memerlukan header &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; serta &lt;code&gt;X-Api-Version&lt;/code&gt;. Menambahkan keduanya secara manual ke setiap request memang lambat dan rawan inkonsistensi: satu endpoint memakai token yang benar, endpoint lain terlupakan, lalu error 401 hanya muncul pada beberapa rute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog sekarang&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, Anda dapat mendefinisikan parameter sekali lalu menerapkannya otomatis ke request yang sesuai. Artikel ini membahas tiga pendekatan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parameter global untuk seluruh proyek.&lt;/li&gt;
&lt;li&gt;Variabel lingkungan untuk menyimpan token.&lt;/li&gt;
&lt;li&gt;Skrip pra-permintaan pada folder untuk header dengan cakupan terbatas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk pembahasan variabel yang lebih mendalam, baca &lt;a href="https://apidog.com/id/blog/mastering-variables?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan menguasai variabel di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Konsep ini mengikuti pola header HTTP standar: pasangan key/value yang dikirim bersama request, seperti dijelaskan dalam &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" rel="noopener noreferrer"&gt;referensi header HTTP MDN&lt;/a&gt;. Perbedaannya, Apidog memungkinkan Anda mengelola header tersebut dari satu tempat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa Arti “Parameter Global”?
&lt;/h2&gt;

&lt;p&gt;Parameter global di Apidog adalah parameter request yang berlaku pada seluruh proyek, bukan hanya pada satu endpoint. Setelah didefinisikan, Apidog akan melampirkannya ke request yang cocok secara otomatis.&lt;/p&gt;

&lt;p&gt;Parameter global tersedia untuk empat lokasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headers&lt;/strong&gt; — untuk &lt;code&gt;Authorization&lt;/code&gt;, &lt;code&gt;X-Api-Version&lt;/code&gt;, dan header lain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookies&lt;/strong&gt; — untuk cookie sesi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query&lt;/strong&gt; — untuk nilai seperti &lt;code&gt;?api_key=...&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Body&lt;/strong&gt; — untuk field yang harus ada pada body request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk autentikasi bearer token, gunakan &lt;strong&gt;Headers&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Parameter global memiliki prioritas lebih rendah daripada parameter pada endpoint. Jika endpoint sudah mendefinisikan header &lt;code&gt;Authorization&lt;/code&gt;, nilai endpoint tersebut akan digunakan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dengan kata lain, parameter global berfungsi sebagai default proyek, bukan penimpaan paksa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atur Header Global untuk Semua Request
&lt;/h2&gt;

&lt;p&gt;Targetnya adalah menambahkan header berikut ke semua endpoint tanpa mengedit endpoint satu per satu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{token}}
X-Api-Version: 2024-08-01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 1: Buka Manajemen Lingkungan
&lt;/h3&gt;

&lt;p&gt;Buka &lt;strong&gt;Manajemen Lingkungan&lt;/strong&gt; dari bagian kanan atas halaman Apidog.&lt;/p&gt;

&lt;p&gt;Area ini digunakan untuk mengelola parameter yang berlaku di seluruh proyek. Lihat juga &lt;a href="https://docs.apidog.com" rel="noopener noreferrer"&gt;dokumentasi Apidog&lt;/a&gt; untuk referensi konfigurasi parameter dan environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Pilih Headers
&lt;/h3&gt;

&lt;p&gt;Pilih lokasi &lt;strong&gt;Headers&lt;/strong&gt; atau &lt;strong&gt;Header Permintaan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gunakan lokasi lain hanya jika nilai default Anda memang harus dikirim sebagai cookie, query parameter, atau body parameter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: Tambahkan Header &lt;code&gt;Authorization&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Tambahkan parameter global pertama dengan konfigurasi berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Properti&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Authorization&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default Value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Bearer {{token}}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Bearer token untuk semua endpoint yang diautentikasi.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jangan menyimpan token mentah langsung pada &lt;code&gt;Default Value&lt;/code&gt;. Gunakan &lt;code&gt;{{token}}&lt;/code&gt; agar token diambil dari variabel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 4: Tambahkan Header Versi API
&lt;/h3&gt;

&lt;p&gt;Tambahkan parameter global kedua:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Properti&lt;/th&gt;
&lt;th&gt;Nilai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-Api-Version&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Default Value&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2024-08-01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Versi API yang dipatok untuk setiap request.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Langkah 5: Aktifkan dan Simpan
&lt;/h3&gt;

&lt;p&gt;Aktifkan sakelar pada setiap parameter, lalu simpan konfigurasi.&lt;/p&gt;

&lt;p&gt;Setelah tersimpan, setiap request dalam proyek akan membawa header berikut, kecuali endpoint tersebut mendefinisikan nilai header sendiri:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{token}}
X-Api-Version: 2024-08-01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 6: Verifikasi Header yang Terkirim
&lt;/h3&gt;

&lt;p&gt;Jangan hanya mengandalkan konfigurasi. Kirim request apa pun, lalu buka tab &lt;strong&gt;Actual Request&lt;/strong&gt; di konsol respons.&lt;/p&gt;

&lt;p&gt;Tab ini menunjukkan request persis seperti yang dikirim, setelah variabel diganti dengan nilai aslinya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/v1/orders/8842&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.yourservice.com&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer sk_live_7f3a9c2e1b8d4056&lt;/span&gt;
&lt;span class="na"&gt;X-Api-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2024-08-01&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika kedua header terlihat di &lt;strong&gt;Actual Request&lt;/strong&gt;, berarti konfigurasi Anda sudah diterapkan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simpan Token dengan Variabel, Bukan Teks Biasa
&lt;/h2&gt;

&lt;p&gt;Nilai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bearer {{token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lebih aman daripada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bearer sk_live_7f3a9c2e1b8d4056
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sintaks &lt;code&gt;{{token}}&lt;/code&gt; merujuk ke variabel. Header bearer sendiri mengikuti skema yang dijelaskan pada &lt;a href="https://www.rfc-editor.org/rfc/rfc6750" rel="noopener noreferrer"&gt;RFC 6750&lt;/a&gt;, sedangkan cara server membaca header tersebut dapat dilihat di &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Authorization" rel="noopener noreferrer"&gt;referensi Authorization MDN&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Buat Variabel &lt;code&gt;token&lt;/code&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Klik ikon environment &lt;code&gt;≡&lt;/code&gt; di kanan atas.&lt;/li&gt;
&lt;li&gt;Buka bagian &lt;strong&gt;Global Variables&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan variabel bernama &lt;code&gt;token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Isi nilainya dengan bearer token Anda.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Header global Anda tetap menggunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bearer {{token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saat request dikirim, Apidog akan menggantinya menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bearer &amp;lt;your-real-secret&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan tab &lt;strong&gt;Actual Request&lt;/strong&gt; untuk memastikan substitusi variabel berjalan seperti yang diharapkan.&lt;/p&gt;

&lt;p&gt;Pola yang disarankan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parameter global&lt;/strong&gt; menyimpan struktur header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variabel environment&lt;/strong&gt; menyimpan nilai rahasia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk praktik pengelolaan token yang lebih lengkap, baca &lt;a href="https://apidog.com/id/blog/api-client-environment-and-secrets-management?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan manajemen environment dan rahasia klien API&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ganti Token per Environment
&lt;/h3&gt;

&lt;p&gt;Dalam proyek nyata, Anda biasanya memiliki beberapa environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setiap environment dapat menyimpan nilai &lt;code&gt;token&lt;/code&gt; yang berbeda. Pilih environment melalui &lt;strong&gt;dropdown Lingkungan&lt;/strong&gt; di dekat ikon &lt;code&gt;≡&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Header global tidak perlu diubah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer {{token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yang berubah hanya nilai &lt;code&gt;token&lt;/code&gt; berdasarkan environment aktif.&lt;/p&gt;

&lt;p&gt;Jika Anda juga mengatur bearer auth, API key, atau OAuth, lihat &lt;a href="https://apidog.com/id/blog/security-schemes?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan skema keamanan Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menambahkan Header Hanya pada Satu Folder
&lt;/h2&gt;

&lt;p&gt;Parameter global berlaku untuk seluruh proyek. Jika Anda hanya perlu header pada folder tertentu, gunakan skrip pra-permintaan di folder tersebut.&lt;/p&gt;

&lt;p&gt;Contoh: hanya endpoint dalam folder &lt;code&gt;/admin&lt;/code&gt; yang memerlukan &lt;code&gt;X-Admin-Scope&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Apidog tidak menyediakan field header bawaan pada pengaturan folder. Sebagai gantinya, tambahkan skrip pra-permintaan berikut pada folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Admin-Scope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;full&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setiap request dalam folder akan menerima header tersebut, sedangkan request di luar folder tidak akan terpengaruh.&lt;/p&gt;

&lt;p&gt;Gunakan pendekatan ini untuk kebutuhan header dengan cakupan folder. Untuk detail skrip &lt;code&gt;pm.*&lt;/code&gt;, lihat &lt;a href="https://apidog.com/id/blog/how-to-use-pre-post-request-scripts-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan skrip pra-permintaan dan pasca-permintaan di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pilih Pendekatan Berdasarkan Cakupan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kebutuhan&lt;/th&gt;
&lt;th&gt;Pendekatan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Header berlaku untuk semua endpoint&lt;/td&gt;
&lt;td&gt;Parameter global di &lt;strong&gt;Headers&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token berbeda pada Development, Testing, dan Production&lt;/td&gt;
&lt;td&gt;Variabel environment seperti &lt;code&gt;{{token}}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header hanya berlaku untuk satu kelompok endpoint&lt;/td&gt;
&lt;td&gt;Skrip pra-permintaan tingkat folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Beberapa hal yang perlu diperiksa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hindari nama parameter global yang duplikat.&lt;/li&gt;
&lt;li&gt;Pastikan tipe parameter sesuai dengan penggunaannya.&lt;/li&gt;
&lt;li&gt;Ingat bahwa nilai header pada endpoint akan mengalahkan nilai parameter global.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;Actual Request&lt;/strong&gt; untuk memverifikasi header dan nilai variabel yang benar-benar dikirim.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Otomatiskan dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Parameter global dan environment tidak hanya berlaku di GUI. Konfigurasi yang sama juga digunakan saat menjalankan skenario otomatis melalui Apidog CLI.&lt;/p&gt;

&lt;p&gt;Instal CLI dengan Node.js v16+:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario terhadap environment tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasan flag:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID skenario pengujian.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporter, misalnya &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan flag &lt;code&gt;-e&lt;/code&gt;, CLI memakai variabel environment yang sama, termasuk &lt;code&gt;{{token}}&lt;/code&gt;. Jadi header global dan token yang bekerja di GUI juga dapat digunakan dalam CI.&lt;/p&gt;

&lt;p&gt;Baca &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan instalasi Apidog CLI&lt;/a&gt; untuk setup CLI, serta &lt;a href="https://apidog.com/id/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan Apidog CLI di GitHub Actions&lt;/a&gt; untuk integrasi pipeline otomatisasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah parameter global menimpa header pada endpoint tertentu?
&lt;/h3&gt;

&lt;p&gt;Tidak. Parameter global memiliki prioritas lebih rendah. Jika endpoint mendefinisikan &lt;code&gt;Authorization&lt;/code&gt; sendiri, nilai pada endpoint tersebut yang digunakan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Di mana token harus disimpan?
&lt;/h3&gt;

&lt;p&gt;Simpan token pada variabel environment atau global, bukan sebagai teks biasa di &lt;code&gt;Default Value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gunakan pola berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer {{token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk mengambil token dari respons login dan menggunakannya kembali, lihat &lt;a href="https://apidog.com/id/blog/set-assertions-extract-variables-json-path?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan ekstraksi variabel dengan JSONPath&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara memastikan header global terkirim?
&lt;/h3&gt;

&lt;p&gt;Kirim request, lalu buka tab &lt;strong&gt;Actual Request&lt;/strong&gt;. Jika header terlihat di sana, header sudah terkirim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah header default diterapkan hanya ke satu folder?
&lt;/h3&gt;

&lt;p&gt;Bisa, menggunakan skrip pra-permintaan folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Admin-Scope&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;full&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apakah parameter global dan variabel environment memerlukan paket berbayar?
&lt;/h3&gt;

&lt;p&gt;Dokumentasi fitur ini tidak mencantumkan batasan tingkatan untuk parameter global, variabel environment, atau skrip pra-permintaan tingkat folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Untuk menerapkan header konsisten ke seluruh proyek:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat &lt;code&gt;Authorization&lt;/code&gt; dan &lt;code&gt;X-Api-Version&lt;/code&gt; sebagai parameter global di &lt;strong&gt;Manajemen Lingkungan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Simpan token sebagai variabel &lt;code&gt;{{token}}&lt;/code&gt;, bukan nilai teks biasa.&lt;/li&gt;
&lt;li&gt;Periksa tab &lt;strong&gt;Actual Request&lt;/strong&gt; untuk memastikan header benar-benar dikirim.&lt;/li&gt;
&lt;li&gt;Gunakan skrip pra-permintaan jika header hanya diperlukan pada satu folder.&lt;/li&gt;
&lt;li&gt;Gunakan environment yang sama saat menjalankan skenario melalui Apidog CLI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk mencoba konfigurasi ini di proyek Anda, &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;unduh Apidog&lt;/a&gt; dan buat header global pertama Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI Kini Menulis Kode. Tapi Siapa yang Mengelola API?</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:43:57 +0000</pubDate>
      <link>https://dev.to/walse/ai-kini-menulis-kode-tapi-siapa-yang-mengelola-api-444c</link>
      <guid>https://dev.to/walse/ai-kini-menulis-kode-tapi-siapa-yang-mengelola-api-444c</guid>
      <description>&lt;p&gt;Agen coding AI mengubah cara perangkat lunak dibangun: pengembang kini dapat meminta Claude Code, Cursor, Codex, GitHub Copilot, Windsurf, Trae, Cline, atau agen lain untuk membuat fitur lengkap dalam hitungan menit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Agen dapat menghasilkan rute, pengendali, validasi, kueri basis data, pengujian, hingga integrasi frontend. Namun, kecepatan implementasi ini memunculkan pertanyaan penting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI dapat menulis kode. Tetapi siapa yang mengelola API?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;API bukan sekadar kumpulan endpoint. API adalah kontrak antara frontend, backend, aplikasi seluler, layanan internal, sistem pihak ketiga, dan terkadang pelanggan eksternal. Jika agen AI mengubah kode tanpa memperbarui dokumentasi, mock, skema, pengujian, lingkungan, dan proses review, tim Anda dapat bergerak lebih cepat tetapi kehilangan konsistensi.&lt;/p&gt;

&lt;p&gt;Di sinilah &lt;a href="https://apidog.com/apidog-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; berperan. Apidog CLI menyediakan antarmuka baris perintah untuk desain API, dokumentasi, mock, pengujian, environment, variabel, laporan, impor, ekspor, dan kolaborasi cabang.&lt;/p&gt;

&lt;p&gt;Artikel ini membahas cara menjadikan manajemen API sebagai bagian dari alur kerja coding AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Agen AI dapat menghasilkan kode API dengan cepat, tetapi tetap membutuhkan proses untuk menjaga kontrak API tetap jelas dan dapat diuji.&lt;/p&gt;

&lt;p&gt;Gunakan Apidog CLI untuk membantu tim dan agen AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mendesain atau memperbarui kontrak API&lt;/li&gt;
&lt;li&gt;Mendokumentasikan endpoint&lt;/li&gt;
&lt;li&gt;Menjaga mock tetap selaras&lt;/li&gt;
&lt;li&gt;Menjalankan pengujian API dari terminal&lt;/li&gt;
&lt;li&gt;Mengelola environment dan variabel&lt;/li&gt;
&lt;li&gt;Menambahkan validasi API ke CI/CD&lt;/li&gt;
&lt;li&gt;Meninjau perubahan API sebagai kontrak produk, bukan hanya perubahan kode&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Generasi Kode Bukan Manajemen API
&lt;/h2&gt;

&lt;p&gt;Agen AI dapat membuat banyak artefak implementasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rute Express&lt;/li&gt;
&lt;li&gt;Pengendali FastAPI&lt;/li&gt;
&lt;li&gt;Pengontrol Spring Boot&lt;/li&gt;
&lt;li&gt;Kueri basis data&lt;/li&gt;
&lt;li&gt;Validator request&lt;/li&gt;
&lt;li&gt;Objek respons&lt;/li&gt;
&lt;li&gt;Pemanggilan API frontend&lt;/li&gt;
&lt;li&gt;Pengujian unit dan integrasi&lt;/li&gt;
&lt;li&gt;Deskripsi mirip OpenAPI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun, API yang siap digunakan tim membutuhkan lebih dari berkas kode.&lt;/p&gt;

&lt;p&gt;Checklist manajemen API yang perlu dipertahankan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desain endpoint dan konvensi penamaan&lt;/li&gt;
&lt;li&gt;Parameter request dan query&lt;/li&gt;
&lt;li&gt;Skema request dan response&lt;/li&gt;
&lt;li&gt;Format error&lt;/li&gt;
&lt;li&gt;Aturan autentikasi dan otorisasi&lt;/li&gt;
&lt;li&gt;Dokumentasi API&lt;/li&gt;
&lt;li&gt;Mock API&lt;/li&gt;
&lt;li&gt;Kasus uji, skenario, dan suite pengujian&lt;/li&gt;
&lt;li&gt;Environment dan variabel&lt;/li&gt;
&lt;li&gt;Laporan pengujian&lt;/li&gt;
&lt;li&gt;Validasi CI/CD&lt;/li&gt;
&lt;li&gt;Review tim, version control, dan kolaborasi cabang&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saat seorang pengembang membuat satu endpoint secara manual, biasanya ia juga ingat untuk mendokumentasikan dan mengujinya. Namun, saat agen AI membuat sepuluh endpoint dalam satu sesi, langkah-langkah lanjutan tersebut mudah terlewat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risiko Tersembunyi dari API yang Dihasilkan AI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Endpoint tidak terdokumentasi
&lt;/h3&gt;

&lt;p&gt;Agen AI dapat menambahkan endpoint seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/orders/refund
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint mungkin berfungsi dengan baik, tetapi tanpa dokumentasi tim lain tidak tahu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payload apa yang wajib dikirim&lt;/li&gt;
&lt;li&gt;Field mana yang opsional&lt;/li&gt;
&lt;li&gt;Status code yang mungkin dikembalikan&lt;/li&gt;
&lt;li&gt;Format respons error&lt;/li&gt;
&lt;li&gt;Apakah autentikasi diperlukan&lt;/li&gt;
&lt;li&gt;Apakah frontend atau aplikasi seluler dapat langsung menggunakannya&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Endpoint ada, tetapi kontraknya tidak terlihat.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Skema respons tidak konsisten
&lt;/h3&gt;

&lt;p&gt;Contoh endpoint pertama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fullName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alex Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alex@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endpoint lain mungkin mengembalikan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alex Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alex@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keduanya mungkin valid secara teknis. Namun, inkonsistensi seperti ini menimbulkan biaya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend membutuhkan mapping tambahan&lt;/li&gt;
&lt;li&gt;SDK menjadi lebih rumit&lt;/li&gt;
&lt;li&gt;Pengujian lebih rapuh&lt;/li&gt;
&lt;li&gt;Dokumentasi membingungkan&lt;/li&gt;
&lt;li&gt;Konsumen API kehilangan kepercayaan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Konsistensi API memerlukan kontrak dan alur kerja bersama.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mock API usang
&lt;/h3&gt;

&lt;p&gt;Mock diperlukan ketika frontend dan backend dikembangkan secara paralel. Masalah muncul saat implementasi backend berubah, tetapi mock tetap menggunakan kontrak lama.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mock mengembalikan &lt;code&gt;status: "success"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;API produksi mengembalikan &lt;code&gt;state: "completed"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Frontend terlihat berfungsi dalam mode mock, lalu gagal saat terhubung ke API sebenarnya&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Karena itu, mock harus diperlakukan sebagai bagian dari kontrak API, bukan sekadar JSON contoh.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Pengujian hanya mencakup happy path
&lt;/h3&gt;

&lt;p&gt;Agen AI dapat membuat pengujian unit yang baik, tetapi pengujian API perlu memverifikasi perilaku eksternal endpoint.&lt;/p&gt;

&lt;p&gt;Minimal, pengujian API perlu mencakup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Field wajib&lt;/li&gt;
&lt;li&gt;Input tidak valid&lt;/li&gt;
&lt;li&gt;Autentikasi&lt;/li&gt;
&lt;li&gt;Otorisasi&lt;/li&gt;
&lt;li&gt;Status code&lt;/li&gt;
&lt;li&gt;Skema respons&lt;/li&gt;
&lt;li&gt;Respons error&lt;/li&gt;
&lt;li&gt;Skenario multi-langkah&lt;/li&gt;
&lt;li&gt;Perilaku per environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jangan hanya memastikan fungsi internal berjalan. Pastikan konsumen API menerima perilaku yang dijanjikan kontrak.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Titik buta CI/CD
&lt;/h3&gt;

&lt;p&gt;Perubahan AI dapat masuk ke pull request dengan cepat, misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint baru&lt;/li&gt;
&lt;li&gt;Payload yang berubah&lt;/li&gt;
&lt;li&gt;Field respons yang ditambahkan atau dihapus&lt;/li&gt;
&lt;li&gt;Perubahan autentikasi&lt;/li&gt;
&lt;li&gt;Format error baru&lt;/li&gt;
&lt;li&gt;Breaking change yang tidak ditandai&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tanpa validasi API dari command line, perubahan tersebut dapat digabungkan sebelum perilaku API diperiksa sebagai kontrak produk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pertanyaan Baru untuk Tim Engineering
&lt;/h2&gt;

&lt;p&gt;Pertanyaannya bukan lagi:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bisakah AI menulis kode?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jawabannya: bisa.&lt;/p&gt;

&lt;p&gt;Pertanyaan yang lebih berguna adalah:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bisakah tim Anda mengelola perubahan API yang dibuat AI?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Untuk setiap perubahan API, pastikan tim dapat menjawab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apakah kontrak API jelas?&lt;/li&gt;
&lt;li&gt;Apakah dokumentasi sudah diperbarui?&lt;/li&gt;
&lt;li&gt;Apakah mock masih selaras?&lt;/li&gt;
&lt;li&gt;Apakah pengujian API berhasil?&lt;/li&gt;
&lt;li&gt;Apakah environment sudah dikonfigurasi?&lt;/li&gt;
&lt;li&gt;Apakah CI/CD dapat memvalidasinya?&lt;/li&gt;
&lt;li&gt;Apakah perubahan dapat direview oleh tim?&lt;/li&gt;
&lt;li&gt;Apakah agen AI berikutnya dapat memahami konteks API tersebut?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apidog CLI: Manajemen API untuk Pengembangan Native AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com/apidog-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; membawa alur kerja inti &lt;a href="https://docs.apidog.com/collaboration-workflow-646333m0" rel="noopener noreferrer"&gt;Apidog&lt;/a&gt; ke terminal, agen AI, dan pipeline CI/CD.&lt;/p&gt;

&lt;p&gt;Dengan CLI, pengembang dan agen AI dapat bekerja dengan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dokumentasi API&lt;/li&gt;
&lt;li&gt;Skema data&lt;/li&gt;
&lt;li&gt;Mock API&lt;/li&gt;
&lt;li&gt;Environment&lt;/li&gt;
&lt;li&gt;Variabel&lt;/li&gt;
&lt;li&gt;Kasus uji API&lt;/li&gt;
&lt;li&gt;Skenario dan suite pengujian&lt;/li&gt;
&lt;li&gt;Laporan pengujian&lt;/li&gt;
&lt;li&gt;Impor dan ekspor&lt;/li&gt;
&lt;li&gt;Kolaborasi cabang&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini penting karena agen coding AI bekerja efektif ketika dapat menjalankan perintah yang dapat diulang.&lt;/p&gt;

&lt;p&gt;Alih-alih memberi instruksi:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Buat endpoint baru untuk refund.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gunakan instruksi yang mencakup siklus hidup API:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Buat endpoint refund, perbarui kontrak dan dokumentasi API, periksa mock, lalu jalankan pengujian API terkait.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Untuk daftar kemampuan CLI, lihat &lt;a href="https://docs.apidog.com/apidog-cli-commands-options-609656m0" rel="noopener noreferrer"&gt;dokumentasi Perintah &amp;amp; Opsi Apidog CLI&lt;/a&gt;. Untuk memulai, baca &lt;a href="https://docs.apidog.com/installing-and-running-apidog-cli-605135m0" rel="noopener noreferrer"&gt;panduan Menginstal dan Menjalankan Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jika proyek Anda di-host di Apidog Europe, tentukan URL dasar API UE:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--api-base-url&lt;/span&gt; https://api.eu.apidog.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Alur Kerja Coding AI yang Lebih Aman untuk API
&lt;/h2&gt;

&lt;p&gt;Berikut alur kerja praktis untuk menggabungkan agen coding AI dan Apidog CLI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: Berikan tugas fitur kepada agen AI
&lt;/h3&gt;

&lt;p&gt;Contoh tugas:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tambahkan endpoint untuk membuat permintaan pengembalian dana.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agen dapat memeriksa struktur proyek, membuat logika backend, menambahkan validasi, dan memperbarui berkas terkait.&lt;/p&gt;

&lt;p&gt;Namun, jangan berhenti pada implementasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Rancang atau perbarui kontrak API
&lt;/h3&gt;

&lt;p&gt;Sebelum endpoint dipakai tim lain, definisikan kontraknya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Path&lt;/li&gt;
&lt;li&gt;HTTP method&lt;/li&gt;
&lt;li&gt;Header&lt;/li&gt;
&lt;li&gt;Query parameter&lt;/li&gt;
&lt;li&gt;Request body&lt;/li&gt;
&lt;li&gt;Response body&lt;/li&gt;
&lt;li&gt;Error response&lt;/li&gt;
&lt;li&gt;Aturan autentikasi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk mengelola desain dari command line, baca &lt;a href="https://apidog.com/id/blog/how-to-design-apis-in-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Mendesain API di CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: Perbarui dokumentasi API
&lt;/h3&gt;

&lt;p&gt;Dokumentasi harus menjawab pertanyaan konsumen API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apa fungsi endpoint ini?&lt;/li&gt;
&lt;li&gt;Bagaimana cara memanggilnya?&lt;/li&gt;
&lt;li&gt;Field apa yang harus dikirim?&lt;/li&gt;
&lt;li&gt;Apa arti setiap field respons?&lt;/li&gt;
&lt;li&gt;Error apa yang perlu ditangani?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan dokumentasi sebagai bagian dari definition of done, bukan pekerjaan tambahan setelah endpoint selesai.&lt;/p&gt;

&lt;p&gt;Panduan terkait: &lt;a href="https://apidog.com/id/blog/how-to-document-apis-in-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Mendokumentasikan API di CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 4: Sinkronkan mock dengan kontrak
&lt;/h3&gt;

&lt;p&gt;Pastikan frontend, backend, QA, dan agen AI bekerja menggunakan respons yang sama.&lt;/p&gt;

&lt;p&gt;Saat kontrak berubah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Perbarui skema request dan response.&lt;/li&gt;
&lt;li&gt;Perbarui mock.&lt;/li&gt;
&lt;li&gt;Jalankan pengujian terhadap perilaku yang diharapkan.&lt;/li&gt;
&lt;li&gt;Beri tahu konsumen API jika ada breaking change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Baca &lt;a href="https://apidog.com/id/blog/how-to-mock-apis-in-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Membuat Mock API di CLI&lt;/a&gt; untuk alur kerja mock dari terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 5: Jalankan pengujian API dari terminal
&lt;/h3&gt;

&lt;p&gt;Periksa endpoint sebagai API, bukan hanya sebagai fungsi dalam kode.&lt;/p&gt;

&lt;p&gt;Contoh checklist pengujian endpoint refund:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Request valid menghasilkan status code yang diharapkan
- Request tanpa orderId ditolak
- Request tanpa autentikasi ditolak
- User tidak berwenang tidak dapat melakukan refund
- Respons sukses mengikuti skema yang disepakati
- Respons error memiliki format yang konsisten
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog CLI dapat digunakan untuk menjalankan kasus uji, skenario, dan suite dari command line. Ini cocok untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pengembangan lokal&lt;/li&gt;
&lt;li&gt;Tugas agen AI&lt;/li&gt;
&lt;li&gt;Pemeriksaan pull request&lt;/li&gt;
&lt;li&gt;Pipeline CI/CD&lt;/li&gt;
&lt;li&gt;Validasi rilis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mulai dengan &lt;a href="https://apidog.com/id/blog/apidog-cli-complete-guide/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Panduan Lengkap Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 6: Jalankan alur kerja secara headless
&lt;/h3&gt;

&lt;p&gt;Agen AI dan CI/CD tidak menggunakan UI browser. Mereka membutuhkan perintah yang dapat dijalankan ulang dalam lingkungan apa pun.&lt;/p&gt;

&lt;p&gt;Alur kerja headless dapat dijalankan di:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminal lokal&lt;/li&gt;
&lt;li&gt;Pipeline build&lt;/li&gt;
&lt;li&gt;Kontainer&lt;/li&gt;
&lt;li&gt;Environment development jarak jauh&lt;/li&gt;
&lt;li&gt;Sesi coding AI&lt;/li&gt;
&lt;li&gt;Tugas otomatisasi terjadwal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pelajari pendekatannya di &lt;a href="https://apidog.com/id/blog/headless-api-management-tool/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Alat Manajemen API Tanpa Kepala&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gunakan Apidog CLI dengan Agen Coding AI
&lt;/h2&gt;

&lt;p&gt;Apidog CLI dapat diintegrasikan ke berbagai lingkungan coding AI karena menyediakan jalur command line untuk manajemen API.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Alat coding AI&lt;/th&gt;
&lt;th&gt;Panduan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-claude-code/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Claude Code&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-cursor/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Cursor&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-codex/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Codex&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-github-copilot/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di GitHub Copilot&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windsurf&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-windsurf/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Windsurf&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trae&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-trae/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Trae&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-cline/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Cline&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Antigravity&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-antigravity/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Antigravity&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-openclaw/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di OpenClaw&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hermes Agent&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-in-hermes-agent/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara Menggunakan Apidog CLI di Hermes Agent&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prinsipnya sama untuk semua alat:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agen AI tidak seharusnya hanya menghasilkan kode. Agen juga harus membantu menjaga kontrak, dokumentasi, mock, dan pengujian API tetap sehat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Mengapa Manajemen API Semakin Penting dengan AI
&lt;/h2&gt;

&lt;p&gt;AI meningkatkan jumlah kode yang dapat dibuat tim. Konsekuensinya, AI juga meningkatkan jumlah perubahan API yang harus dipahami, direview, diuji, dan didokumentasikan.&lt;/p&gt;

&lt;p&gt;Saat AI membantu menghasilkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lebih banyak endpoint&lt;/li&gt;
&lt;li&gt;Lebih banyak layanan&lt;/li&gt;
&lt;li&gt;Lebih banyak model request&lt;/li&gt;
&lt;li&gt;Lebih banyak kode integrasi frontend&lt;/li&gt;
&lt;li&gt;Lebih banyak pengujian&lt;/li&gt;
&lt;li&gt;Lebih banyak eksperimen&lt;/li&gt;
&lt;li&gt;Lebih banyak cabang&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...koordinasi menjadi semakin penting.&lt;/p&gt;

&lt;p&gt;Tanpa alur kerja API yang terpusat, percepatan tersebut berubah menjadi kebisingan. Dengan CLI dan proses yang dapat diulang, pekerjaan API tetap terlihat, dapat diuji, dan dapat diaudit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tambahkan Validasi API ke CI/CD
&lt;/h2&gt;

&lt;p&gt;Kode yang dihasilkan AI tidak boleh langsung berpindah dari editor ke produksi. Kode tersebut harus melewati validasi yang sama seperti kode yang ditulis manusia.&lt;/p&gt;

&lt;p&gt;Contoh pemeriksaan yang dapat dimasukkan ke pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jalankan skenario pengujian API setelah pull request dibuat&lt;/li&gt;
&lt;li&gt;Validasi endpoint penting sebelum deployment&lt;/li&gt;
&lt;li&gt;Verifikasi perilaku berdasarkan environment&lt;/li&gt;
&lt;li&gt;Buat laporan pengujian API&lt;/li&gt;
&lt;li&gt;Jadikan hasil pengujian API sebagai syarat rilis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secara konseptual, pipeline Anda dapat memiliki tahap seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build application&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run unit tests&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run API validation&lt;/span&gt;
    &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apidog-cli &amp;lt;perintah-pengujian-API-anda&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sesuaikan perintah dengan konfigurasi proyek dan dokumentasi CLI Anda. Lihat juga &lt;a href="https://docs.apidog.com/cicd-in-apidog-609698m0" rel="noopener noreferrer"&gt;Integrasi dengan CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Praktik Terbaik Saat AI Menulis Kode API
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Jadikan dokumentasi bagian dari prompt AI
&lt;/h3&gt;

&lt;p&gt;Jangan gunakan prompt yang hanya meminta implementasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buat endpoint baru untuk pengembalian dana.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan prompt yang menyebutkan kontrak API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buat endpoint baru untuk pengembalian dana. Perbarui dokumentasi API, definisikan skema request dan response, periksa mock, lalu jalankan pengujian API terkait.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Perlakukan pengujian API sebagai wajib
&lt;/h3&gt;

&lt;p&gt;Untuk setiap endpoint baru atau perubahan kontrak, verifikasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status code&lt;/li&gt;
&lt;li&gt;Skema respons&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Autentikasi&lt;/li&gt;
&lt;li&gt;Otorisasi&lt;/li&gt;
&lt;li&gt;Skenario end-to-end&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Jaga mock dekat dengan kontrak API
&lt;/h3&gt;

&lt;p&gt;Jangan biarkan mock menjadi data statis yang terpisah dari implementasi dan dokumentasi. Saat kontrak berubah, mock juga harus berubah.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Gunakan CLI untuk langkah yang berulang
&lt;/h3&gt;

&lt;p&gt;Langkah manual mudah dilupakan. Perintah CLI lebih mudah:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Didokumentasikan&lt;/li&gt;
&lt;li&gt;Diulang secara lokal&lt;/li&gt;
&lt;li&gt;Dijalankan agen AI&lt;/li&gt;
&lt;li&gt;Dimasukkan ke CI/CD&lt;/li&gt;
&lt;li&gt;Diaudit dalam proses tim&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Tambahkan pemeriksaan API ke CI/CD
&lt;/h3&gt;

&lt;p&gt;Jika perilaku API penting, jangan bergantung pada ingatan reviewer. Otomatiskan pemeriksaan sebelum rilis.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Review perilaku API, bukan hanya diff kode
&lt;/h3&gt;

&lt;p&gt;Saat meninjau pull request yang dibuat atau dibantu AI, tanyakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apakah kontrak API berubah?&lt;/li&gt;
&lt;li&gt;Apakah dokumentasi sudah diperbarui?&lt;/li&gt;
&lt;li&gt;Apakah mock masih valid?&lt;/li&gt;
&lt;li&gt;Apakah pengujian mencakup kontrak baru?&lt;/li&gt;
&lt;li&gt;Apakah konsumen API terdampak?&lt;/li&gt;
&lt;li&gt;Apakah breaking change ditandai dengan jelas?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Masa Depan Agen AI Membutuhkan Alat API
&lt;/h2&gt;

&lt;p&gt;Agen coding AI akan terus membaik dalam menulis kode. Namun, agen juga membutuhkan akses ke sistem di sekitar kode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform API&lt;/li&gt;
&lt;li&gt;Alat pengujian&lt;/li&gt;
&lt;li&gt;Sistem dokumentasi&lt;/li&gt;
&lt;li&gt;Server mock&lt;/li&gt;
&lt;li&gt;Pipeline CI/CD&lt;/li&gt;
&lt;li&gt;Sistem deployment&lt;/li&gt;
&lt;li&gt;Alat monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tahap berikutnya dari pengembangan native AI bukan sekadar meminta AI menghasilkan lebih banyak kode. Tahap berikutnya adalah menghubungkan AI ke alur kerja yang membuat perangkat lunak tetap andal.&lt;/p&gt;

&lt;p&gt;Untuk API, itu berarti memberikan agen kemampuan untuk bekerja dengan kontrak, dokumentasi, mock, pengujian, environment, dan laporan.&lt;/p&gt;

&lt;p&gt;Jika Anda ingin memahami latar belakang produknya, baca &lt;a href="https://apidog.com/id/blog/apidog-cli-journey-workflow?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Perjalanan Pengembangan Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;AI kini dapat menulis kode API dengan cepat. Namun, kode hanyalah satu bagian dari pengembangan perangkat lunak.&lt;/p&gt;

&lt;p&gt;API tetap membutuhkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kontrak yang jelas&lt;/li&gt;
&lt;li&gt;Dokumentasi&lt;/li&gt;
&lt;li&gt;Mock&lt;/li&gt;
&lt;li&gt;Pengujian&lt;/li&gt;
&lt;li&gt;Environment&lt;/li&gt;
&lt;li&gt;Laporan&lt;/li&gt;
&lt;li&gt;Review tim&lt;/li&gt;
&lt;li&gt;Validasi CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com/apidog-cli/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; membantu membawa manajemen API ke command line, sehingga dapat digunakan oleh pengembang, agen AI, dan sistem CI/CD.&lt;/p&gt;

&lt;p&gt;AI dapat menulis kode. Apidog CLI membantu tim mengelola API di baliknya.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ tentang Apidog CLI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa itu Apidog CLI?
&lt;/h3&gt;

&lt;p&gt;Apidog CLI adalah alat baris perintah yang memungkinkan pengembang dan agen AI menggunakan kemampuan Apidog di luar aplikasi browser. Ini mendukung dokumentasi API, skema, mock, environment, variabel, kasus uji, skenario, suite, laporan, impor, ekspor, dan kolaborasi cabang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa manajemen API penting ketika AI menulis kode?
&lt;/h3&gt;

&lt;p&gt;Agen AI dapat membuat kode API dengan cepat, tetapi tim tetap membutuhkan kontrak yang jelas, dokumentasi terbaru, mock yang akurat, pengujian yang andal, dan validasi CI/CD. Tanpa proses tersebut, endpoint yang dihasilkan AI dapat menjadi tidak konsisten, tidak terdokumentasi, atau tidak teruji.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah Apidog CLI bekerja dengan agen coding AI?
&lt;/h3&gt;

&lt;p&gt;Ya. Apidog CLI dirancang untuk alur kerja command line dan agen AI. CLI dapat digunakan bersama Claude Code, Cursor, Codex, GitHub Copilot, Windsurf, Trae, Cline, Antigravity, OpenClaw, dan Hermes Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah saya menjalankan pengujian API dengan Apidog CLI?
&lt;/h3&gt;

&lt;p&gt;Ya. Apidog CLI mendukung menjalankan kasus uji API, skenario, suite, dan laporan dari command line. Ini berguna untuk pengembangan lokal, alur kerja agen AI, serta pipeline CI/CD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah Apidog CLI membantu dokumentasi API?
&lt;/h3&gt;

&lt;p&gt;Ya. Apidog CLI mendukung alur kerja dokumentasi API dari command line, sehingga tim dapat menjaga dokumen API tetap selaras dengan perubahan pengembangan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah Apidog CLI membuat atau mengelola mock API?
&lt;/h3&gt;

&lt;p&gt;Ya. Apidog CLI mendukung alur kerja mock API, sehingga frontend, backend, QA, dan agen AI dapat bekerja dengan perilaku API yang konsisten.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah Apidog CLI berguna untuk CI/CD?
&lt;/h3&gt;

&lt;p&gt;Ya. Karena berjalan dari command line, Apidog CLI dapat digunakan dalam pipeline CI/CD untuk menjalankan pengujian API, menghasilkan laporan, dan memvalidasi perilaku API secara otomatis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara menggunakan Apidog CLI dengan Apidog Europe?
&lt;/h3&gt;

&lt;p&gt;Jika proyek Anda di-host di Apidog Europe, tentukan URL dasar API UE saat menjalankan perintah CLI:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
--api-base-url https://api.eu.apidog.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Cara Membuat Kode Klien dari API Spec di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:25:45 +0000</pubDate>
      <link>https://dev.to/walse/cara-membuat-kode-klien-dari-api-spec-di-apidog-3dlk</link>
      <guid>https://dev.to/walse/cara-membuat-kode-klien-dari-api-spec-di-apidog-3dlk</guid>
      <description>&lt;p&gt;Anda memiliki &lt;em&gt;endpoint&lt;/em&gt; yang sudah didefinisikan dan ingin memanggilnya dari aplikasi. Bagian yang sering memakan waktu adalah menerjemahkan spesifikasi menjadi kode yang benar: URL, &lt;em&gt;header&lt;/em&gt;, token autentikasi, &lt;em&gt;query string&lt;/em&gt;, dan pemanggilan &lt;code&gt;requests&lt;/code&gt; atau &lt;code&gt;fetch&lt;/code&gt;. Satu karakter yang salah dapat berujung pada respons &lt;code&gt;401&lt;/code&gt; dan proses debugging yang tidak perlu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Anda tidak perlu menulis &lt;em&gt;boilerplate&lt;/em&gt; tersebut secara manual. Jika API dirancang di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, platform ini membaca spesifikasi &lt;em&gt;endpoint&lt;/em&gt; dan menghasilkan potongan kode permintaan siap tempel, seperti cURL, Python &lt;code&gt;requests&lt;/code&gt;, JavaScript &lt;code&gt;fetch&lt;/code&gt;, atau Axios. Artikel ini menunjukkan cara menghasilkan kode dari &lt;em&gt;endpoint&lt;/em&gt;, kapan harus mengirim permintaan terlebih dahulu agar kode berisi nilai aktual, serta cara menjaga hasilnya tetap sinkron dengan spesifikasi. Untuk pilihan yang lebih luas, lihat rangkuman &lt;a href="https://apidog.com/id/blog/api-code-generation-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pembuatan kode API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prinsip utamanya adalah menjadikan spesifikasi sebagai satu-satunya sumber kebenaran, sejalan dengan &lt;a href="https://www.openapis.org/" rel="noopener noreferrer"&gt;Spesifikasi OpenAPI&lt;/a&gt;. Perbarui definisi API sekali, lalu hasilkan ulang kode permintaan dari definisi tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang dilakukan generator kode klien?
&lt;/h2&gt;

&lt;p&gt;Apidog mengubah definisi &lt;em&gt;endpoint&lt;/em&gt; menjadi potongan kode untuk satu permintaan HTTP dalam bahasa dan pustaka yang Anda pilih.&lt;/p&gt;

&lt;p&gt;Misalnya, untuk &lt;code&gt;GET /orders&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;em&gt;endpoint&lt;/em&gt; tersebut.&lt;/li&gt;
&lt;li&gt;Pilih Python.&lt;/li&gt;
&lt;li&gt;Pilih varian &lt;code&gt;Requests&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Salin kode yang dihasilkan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Generator akan membuat panggilan yang menggunakan path, &lt;em&gt;header&lt;/em&gt;, dan parameter yang dideklarasikan pada spesifikasi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fitur ini menghasilkan kode permintaan per &lt;em&gt;endpoint&lt;/em&gt;, bukan SDK lengkap dengan model, &lt;em&gt;pagination helper&lt;/em&gt;, atau paket klien berversi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gunakan hasil generator saat Anda membutuhkan cURL, &lt;code&gt;fetch&lt;/code&gt;, Axios, atau &lt;code&gt;requests.get&lt;/code&gt; yang sesuai dengan kontrak API saat ini. Pendekatan ini cocok untuk &lt;a href="https://apidog.com/id/blog/design-first-api-development?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengembangan API yang mengutamakan desain&lt;/a&gt;: definisikan kontrak, lalu turunkan kode klien dari kontrak yang sama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dua cara membuka generator
&lt;/h2&gt;

&lt;p&gt;Apidog menyediakan dua titik masuk untuk generator kode klien.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dari tab Dokumentasi
&lt;/h3&gt;

&lt;p&gt;Gunakan jalur ini saat Anda sedang membaca dokumentasi &lt;em&gt;endpoint&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;tab Dokumentasi&lt;/strong&gt; API.&lt;/li&gt;
&lt;li&gt;Pilih &lt;em&gt;endpoint&lt;/em&gt; yang ingin digunakan.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Hasilkan Kode Klien&lt;/strong&gt; di sisi kanan.&lt;/li&gt;
&lt;li&gt;Pilih bahasa dan varian pustaka.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dari tab Jalankan
&lt;/h3&gt;

&lt;p&gt;Gunakan jalur ini saat Anda sudah menguji permintaan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;tab Jalankan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Isi parameter, &lt;em&gt;header&lt;/em&gt;, dan &lt;em&gt;body&lt;/em&gt; jika diperlukan.&lt;/li&gt;
&lt;li&gt;Klik ikon kode &lt;code&gt;&amp;lt;/&amp;gt;&lt;/code&gt; di area pembuat permintaan.&lt;/li&gt;
&lt;li&gt;Pilih bahasa dan varian pustaka.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Kedua jalur membuka panel generator yang sama. Perbedaannya hanya pada konteks kerja Anda: dokumentasi untuk melihat kontrak, atau &lt;em&gt;runner&lt;/em&gt; untuk menghasilkan kode dari permintaan yang sudah diuji.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hasilkan panggilan Python untuk &lt;code&gt;GET /orders&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Contoh berikut menggunakan &lt;code&gt;GET /orders&lt;/code&gt; untuk mengambil daftar pesanan berdasarkan status dan halaman.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: pilih bahasa dan pustaka
&lt;/h3&gt;

&lt;p&gt;Buka &lt;strong&gt;tab Dokumentasi&lt;/strong&gt;, klik &lt;strong&gt;Hasilkan Kode Klien&lt;/strong&gt;, lalu pilih &lt;strong&gt;Python&lt;/strong&gt; dan &lt;strong&gt;Requests&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apidog menyediakan beberapa target, termasuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shell&lt;/strong&gt;: cURL, cURL-Windows, Httpie, wget, PowerShell&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript&lt;/strong&gt;: Fetch, Axios, jQuery, XHR, Native, Request, Unirest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt;: &lt;code&gt;http.client&lt;/code&gt;, Requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java&lt;/strong&gt;: Unirest, OkHttp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt;: Native&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP&lt;/strong&gt;: cURL, Guzzle, pecl_http, HTTP_Request2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lainnya&lt;/strong&gt;: Swift, C, C#, Objective-C, Ruby, OCaml, Dart, R, dan HTTP mentah&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh hasil untuk Python Requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;querystring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;querystring&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sebelum memasukkan kode ke aplikasi, sesuaikan tiga bagian berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt;: gunakan base URL lingkungan yang benar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;querystring&lt;/code&gt;: isi parameter yang benar untuk kasus penggunaan Anda.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;headers&lt;/code&gt;: tambahkan autentikasi bila &lt;em&gt;endpoint&lt;/em&gt; membutuhkannya.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 2: pahami batas kode dari spesifikasi
&lt;/h3&gt;

&lt;p&gt;Kode yang dihasilkan langsung dari spesifikasi biasanya mencakup struktur permintaan, tetapi tidak selalu menyertakan nilai runtime aktual seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token Bearer;&lt;/li&gt;
&lt;li&gt;API key;&lt;/li&gt;
&lt;li&gt;nilai variabel lingkungan;&lt;/li&gt;
&lt;li&gt;parameter yang Anda isi manual saat pengujian.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan kata lain, generator dari dokumentasi memberikan &lt;em&gt;template&lt;/em&gt; yang sesuai kontrak. Ini cukup untuk &lt;em&gt;endpoint&lt;/em&gt; publik atau saat Anda akan mengisi kredensial sendiri melalui konfigurasi aplikasi.&lt;/p&gt;

&lt;p&gt;Untuk &lt;em&gt;endpoint&lt;/em&gt; terlindungi seperti &lt;code&gt;GET /orders&lt;/code&gt;, hasil yang paling praktis biasanya berasal dari permintaan yang sudah dikirim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: kirim permintaan untuk menangkap nilai aktual
&lt;/h3&gt;

&lt;p&gt;Agar kode mencerminkan nilai parameter dan &lt;em&gt;header&lt;/em&gt; yang benar-benar dikirim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;tab Jalankan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pastikan metode dan URL &lt;em&gt;endpoint&lt;/em&gt; benar.&lt;/li&gt;
&lt;li&gt;Isi parameter &lt;code&gt;status&lt;/code&gt; dan &lt;code&gt;page&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan autentikasi, misalnya &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Kirim&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Setelah respons diterima, buka &lt;strong&gt;tab Permintaan Aktual&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Salin kode klien dari bagian tersebut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh hasilnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;querystring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer sk_live_51H8xY2...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;querystring&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika Anda bekerja dengan pendekatan &lt;em&gt;design-first&lt;/em&gt;, parameter awal dapat terisi dari spesifikasi. Dalam mode &lt;em&gt;request-first&lt;/em&gt;, Anda dapat menambahkan parameter secara manual di tab Jalankan. Setelah menekan &lt;strong&gt;Kirim&lt;/strong&gt;, keduanya dapat menghasilkan kode dari &lt;strong&gt;Permintaan Aktual&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jangan &lt;em&gt;commit&lt;/em&gt; token asli ke Git. Gunakan variabel lingkungan atau &lt;em&gt;secret manager&lt;/em&gt;. Praktik ini sama pentingnya dengan rekomendasi pada &lt;a href="https://docs.stripe.com/keys" rel="noopener noreferrer"&gt;dokumentasi Stripe untuk kunci live&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Versi yang lebih aman untuk aplikasi Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Menangani &lt;em&gt;request body&lt;/em&gt; untuk POST dan PUT
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /orders&lt;/code&gt; tidak memiliki &lt;em&gt;body&lt;/em&gt;. Namun, &lt;code&gt;POST /orders&lt;/code&gt; atau &lt;code&gt;PUT /orders/{id}&lt;/code&gt; memerlukan &lt;em&gt;request body&lt;/em&gt; yang sesuai dengan skema API.&lt;/p&gt;

&lt;p&gt;Di &lt;strong&gt;tab Jalankan&lt;/strong&gt;, Anda dapat membuat &lt;em&gt;body&lt;/em&gt; JSON atau XML dari:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;contoh yang sudah didefinisikan pada spesifikasi; atau&lt;/li&gt;
&lt;li&gt;opsi &lt;strong&gt;Hasilkan Otomatis&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dropdown &lt;strong&gt;Hasilkan Otomatis&lt;/strong&gt; menyediakan dua mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contoh&lt;/strong&gt;: gunakan contoh &lt;em&gt;request body&lt;/em&gt; yang telah didefinisikan secara manual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hasilkan Setiap Kali&lt;/strong&gt;: buat nilai baru setiap kali digunakan mengikuti aturan &lt;em&gt;mock&lt;/em&gt; dan skema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anda juga dapat mengatur &lt;strong&gt;Preferensi Hasilkan Otomatis&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gunakan Nilai Contoh Terlebih Dahulu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gunakan Nilai Default Terlebih Dahulu&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gunakan Nilai Mock&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hasilkan Nama Bidang Saja&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gunakan Contoh Permintaan&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan &lt;strong&gt;Gunakan Nilai Contoh Terlebih Dahulu&lt;/strong&gt; jika spesifikasi sudah memiliki contoh yang representatif. Gunakan &lt;strong&gt;Gunakan Nilai Mock&lt;/strong&gt; jika Anda perlu data uji yang realistis untuk setiap bidang.&lt;/p&gt;

&lt;p&gt;Contoh &lt;em&gt;body&lt;/em&gt; untuk &lt;code&gt;POST /orders&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"product_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod_456"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"shipping_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jakarta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"postal_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10110"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah &lt;em&gt;body&lt;/em&gt; siap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;Kirim&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Verifikasi respons API.&lt;/li&gt;
&lt;li&gt;Buka &lt;strong&gt;tab Permintaan Aktual&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Salin kode dalam bahasa pilihan Anda.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Saat nilai harus berubah setiap permintaan, seperti &lt;em&gt;timestamp&lt;/em&gt; atau ID acak, gunakan nilai dinamis alih-alih &lt;em&gt;hard-code&lt;/em&gt;. Klik ikon &lt;strong&gt;tongkat ajaib&lt;/strong&gt; di samping input parameter, atau gunakan &lt;strong&gt;Sisipkan Nilai Dinamis&lt;/strong&gt; dalam &lt;em&gt;body&lt;/em&gt; JSON/XML.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Opsi &lt;strong&gt;Hasilkan Otomatis&lt;/strong&gt; untuk &lt;em&gt;request body&lt;/em&gt; memerlukan Apidog versi 2.7.0 atau lebih baru. Jika opsi belum muncul, perbarui aplikasi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Spesifikasi dengan skema dan contoh yang baik—misalnya dari &lt;a href="https://apidog.com/id/blog/auto-generate-api-docs-swagger-openapi?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pembuatan otomatis dokumentasi API dari OpenAPI&lt;/a&gt;—akan menghasilkan &lt;em&gt;body&lt;/em&gt; yang memerlukan lebih sedikit pengeditan manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan memakai potongan permintaan vs kode aplikasi?
&lt;/h2&gt;

&lt;p&gt;Gunakan potongan kode tunggal seperti cURL, &lt;code&gt;fetch&lt;/code&gt;, atau &lt;code&gt;requests.get&lt;/code&gt; untuk pekerjaan &lt;em&gt;one-off&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memeriksa penyebab respons &lt;code&gt;403&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;membagikan permintaan yang dapat direproduksi dalam tiket;&lt;/li&gt;
&lt;li&gt;menjalankan pemeriksaan cepat dari terminal;&lt;/li&gt;
&lt;li&gt;menambahkan contoh API ke dokumentasi internal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh cURL yang cocok untuk debugging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://api.example.com/orders?status=shipped&amp;amp;page=1'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$API_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan bentuk kode yang lebih terstruktur saat panggilan akan menjadi bagian aplikasi. Misalnya, bungkus &lt;code&gt;GET /orders&lt;/code&gt; dalam fungsi layanan agar penanganan kesalahan, autentikasi, dan penggunaan ulang tidak tersebar di banyak file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrdersClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;API_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;list_orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika banyak &lt;em&gt;endpoint&lt;/em&gt; memakai autentikasi yang sama, pusatkan konfigurasi tersebut. Panduan &lt;a href="https://apidog.com/id/blog/how-to-set-global-parameters-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengatur parameter global di Apidog&lt;/a&gt; menjelaskan cara mendefinisikan &lt;em&gt;header&lt;/em&gt; dan variabel sekali agar permintaan dapat mewarisinya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jaga akurasi dengan kebiasaan &lt;em&gt;spec-first&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Kode yang dihasilkan hanya akan akurat jika spesifikasinya akurat.&lt;/p&gt;

&lt;p&gt;Misalnya, Anda menambahkan parameter query &lt;code&gt;region&lt;/code&gt; ke &lt;code&gt;GET /orders&lt;/code&gt;, tetapi tetap memakai potongan kode lama. Klien Anda tidak akan mengirim parameter baru tersebut meskipun kontrak API telah berubah.&lt;/p&gt;

&lt;p&gt;Terapkan alur berikut setiap kali ada perubahan &lt;em&gt;endpoint&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Perbarui spesifikasi API.&lt;/li&gt;
&lt;li&gt;Simpan dan tinjau perubahan kontrak.&lt;/li&gt;
&lt;li&gt;Jalankan permintaan di tab Jalankan.&lt;/li&gt;
&lt;li&gt;Verifikasi respons.&lt;/li&gt;
&lt;li&gt;Hasilkan ulang potongan kode.&lt;/li&gt;
&lt;li&gt;Perbarui kode aplikasi dan pengujian bila diperlukan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/id/blog/apidog-spec-first-mode-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Mode &lt;em&gt;spec-first&lt;/em&gt; Apidog&lt;/a&gt; membantu menjaga definisi tetap otoritatif sehingga kode yang dihasilkan mencerminkan kontrak terbaru.&lt;/p&gt;

&lt;p&gt;Untuk memahami atau menyesuaikan kode JavaScript yang dihasilkan, gunakan &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" rel="noopener noreferrer"&gt;dokumentasi MDN tentang Fetch API&lt;/a&gt; sebagai referensi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan validasi dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Pembuatan kode klien dilakukan dari GUI; tidak ada perintah CLI terpisah yang mengeluarkan kode klien. Namun, &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; berguna untuk menjaga fondasi kode tersebut: spesifikasi yang mutakhir dan pengujian API yang lulus.&lt;/p&gt;

&lt;p&gt;Instal CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog CLI memerlukan Node.js v16+.&lt;/p&gt;

&lt;p&gt;Kemudian autentikasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario pengujian tersimpan untuk memverifikasi &lt;em&gt;endpoint&lt;/em&gt; yang digunakan klien:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang digunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID skenario pengujian&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID lingkungan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: &lt;em&gt;reporter&lt;/em&gt; seperti &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tambahkan perintah ini ke pipeline CI. Panduan &lt;a href="https://apidog.com/id/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI GitHub Actions&lt;/a&gt; menunjukkan cara menjalankannya saat ada &lt;em&gt;push&lt;/em&gt;. Dengan begitu, perubahan kontrak yang merusak dapat terdeteksi sebelum tim menghasilkan ulang atau memperbarui kode klien.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah kode yang dihasilkan menyertakan API key dan token?
&lt;/h3&gt;

&lt;p&gt;Tidak secara &lt;em&gt;default&lt;/em&gt;. Kode dari spesifikasi umumnya berisi struktur permintaan, bukan nilai autentikasi aktual. Untuk mendapatkan kode yang mencerminkan token dan parameter yang benar-benar dikirim, jalankan permintaan terlebih dahulu lalu salin dari &lt;strong&gt;tab Permintaan Aktual&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tetap perlakukan token di potongan kode sebagai rahasia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bahasa dan pustaka apa yang didukung?
&lt;/h3&gt;

&lt;p&gt;Apidog mendukung banyak target, termasuk Shell, JavaScript, Python, Java, Go, PHP, Swift, C, C#, Ruby, Dart, R, dan lainnya. Untuk beberapa bahasa, Anda juga dapat memilih varian pustaka seperti Fetch, Axios, Requests, OkHttp, atau cURL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa opsi Hasilkan Otomatis tidak muncul untuk &lt;em&gt;request body&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;Opsi tersebut memerlukan Apidog versi 2.7.0 atau lebih baru. Setelah aplikasi diperbarui, opsi akan tersedia di &lt;strong&gt;tab Jalankan&lt;/strong&gt; saat Anda menyusun &lt;em&gt;body&lt;/em&gt; JSON atau XML.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah pembuatan kode klien merupakan fitur berbayar?
&lt;/h3&gt;

&lt;p&gt;Dokumentasi Apidog tidak membedakan ketersediaan pembuatan kode klien berdasarkan gratis atau berbayar, maupun &lt;em&gt;cloud&lt;/em&gt; atau &lt;em&gt;self-hosted&lt;/em&gt;. Persyaratan versi yang disebutkan adalah Apidog 2.7.0 atau lebih baru untuk opsi &lt;strong&gt;Hasilkan Otomatis&lt;/strong&gt; pada &lt;em&gt;request body&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Anda dapat &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt; dan mencoba generatornya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara memastikan kode yang dihasilkan benar-benar berfungsi?
&lt;/h3&gt;

&lt;p&gt;Gunakan proses berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hasilkan potongan kode.&lt;/li&gt;
&lt;li&gt;Jalankan permintaan di Apidog.&lt;/li&gt;
&lt;li&gt;Buat skenario pengujian untuk &lt;em&gt;endpoint&lt;/em&gt; tersebut.&lt;/li&gt;
&lt;li&gt;Jalankan skenario secara lokal atau di CI menggunakan CLI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Panduan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;menulis skenario pengujian dengan Apidog&lt;/a&gt; menjelaskan cara membuat skenario tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Generator kode klien di Apidog mengubah spesifikasi &lt;em&gt;endpoint&lt;/em&gt; menjadi permintaan siap pakai dalam bahasa dan pustaka pilihan Anda. Gunakan generator dari dokumentasi untuk mendapatkan struktur permintaan dari kontrak API, atau gunakan &lt;strong&gt;tab Permintaan Aktual&lt;/strong&gt; setelah mengirim permintaan untuk mendapatkan parameter dan &lt;em&gt;header&lt;/em&gt; aktual.&lt;/p&gt;

&lt;p&gt;Pertahankan spesifikasi sebagai sumber kebenaran, hasilkan ulang kode setelah kontrak berubah, dan jalankan pengujian tersimpan untuk memverifikasi bahwa &lt;em&gt;endpoint&lt;/em&gt; masih bekerja seperti yang diharapkan. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, definisikan &lt;code&gt;GET /orders&lt;/code&gt;, lalu hasilkan panggilan klien yang dapat langsung Anda gunakan.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menguji API dengan Sertifikat Klien (mTLS) di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:15:28 +0000</pubDate>
      <link>https://dev.to/walse/cara-menguji-api-dengan-sertifikat-klien-mtls-di-apidog-3glc</link>
      <guid>https://dev.to/walse/cara-menguji-api-dengan-sertifikat-klien-mtls-di-apidog-3glc</guid>
      <description>&lt;p&gt;Anda mengakses API mitra, mengirim permintaan yang valid dengan token yang benar, tetapi koneksi tetap gagal pada tahap TLS handshake. Penyebabnya bisa jadi endpoint tersebut meminta sertifikat klien untuk membuktikan identitas aplikasi Anda sebelum permintaan HTTP dikirim. Mekanisme ini disebut mutual TLS (mTLS).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog sekarang&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Panduan ini menunjukkan cara mengonfigurasi sertifikat klien dan sertifikat CA di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk menguji API yang dilindungi mTLS. Anda akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mengikat sertifikat klien ke host API.&lt;/li&gt;
&lt;li&gt;Menambahkan CA privat atau self-signed agar server dapat dipercaya.&lt;/li&gt;
&lt;li&gt;Mengirim permintaan HTTPS yang otomatis menggunakan sertifikat tersebut.&lt;/li&gt;
&lt;li&gt;Menjalankan pengujian mTLS dari CLI dan pipeline CI/CD.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika Anda baru menangani error sertifikat, baca juga panduan &lt;a href="https://apidog.com/id/blog/ssl-certificate-verification?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;verifikasi sertifikat SSL&lt;/a&gt;. Untuk konsep protokolnya, lihat &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Transport_Layer_Security" rel="noopener noreferrer"&gt;referensi TLS dari MDN&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu mutual TLS dan kapan digunakan?
&lt;/h2&gt;

&lt;p&gt;Pada HTTPS biasa, validasi identitas berjalan satu arah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Server mengirim sertifikatnya.&lt;/li&gt;
&lt;li&gt;Klien memverifikasi sertifikat server.&lt;/li&gt;
&lt;li&gt;Koneksi terenkripsi dibuat.&lt;/li&gt;
&lt;li&gt;Klien mengirim token, API key, atau kredensial lain di dalam request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pada mutual TLS, server juga meminta sertifikat dari klien. Jika sertifikat klien tidak valid atau tidak dipercaya server, TLS handshake gagal sebelum header dan body HTTP dikirim.&lt;/p&gt;

&lt;p&gt;mTLS umum digunakan pada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perbankan dan pembayaran&lt;/strong&gt; — API open banking atau pemrosesan kartu sering menggabungkan sertifikat klien dengan OAuth. Lihat &lt;a href="https://docs.stripe.com/" rel="noopener noreferrer"&gt;dokumentasi Stripe&lt;/a&gt; untuk contoh model kredensial berlapis pada endpoint sensitif.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Komunikasi service-to-service&lt;/strong&gt; — arsitektur zero-trust dapat menggunakan sertifikat untuk memverifikasi identitas setiap layanan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API mitra B2B&lt;/strong&gt; — mitra dapat menerbitkan sertifikat klien saat onboarding agar hanya sistem terdaftar yang dapat mengakses API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika API memakai OAuth sekaligus mTLS, keduanya tetap terpisah:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sertifikat klien&lt;/strong&gt;: membuktikan identitas pada lapisan TLS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token OAuth atau Bearer token&lt;/strong&gt;: membuktikan identitas pemanggil pada lapisan aplikasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc8705" rel="noopener noreferrer"&gt;RFC 8705&lt;/a&gt; menjelaskan pengikatan token OAuth dengan sertifikat klien melalui mTLS.&lt;/p&gt;

&lt;p&gt;Di Apidog:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tab &lt;strong&gt;Sertifikat&lt;/strong&gt; digunakan untuk mTLS.&lt;/li&gt;
&lt;li&gt;Tab &lt;strong&gt;Otorisasi&lt;/strong&gt; digunakan untuk API key, Bearer token, OAuth, dan Basic Auth.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cara Apidog mencocokkan sertifikat berdasarkan host
&lt;/h2&gt;

&lt;p&gt;Apidog menyimpan konfigurasi sertifikat secara global dan menerapkannya berdasarkan host tujuan request. Anda tidak perlu menambahkan sertifikat secara manual pada setiap request.&lt;/p&gt;

&lt;p&gt;Saat request HTTPS dikirim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apidog membaca hostname dari URL.&lt;/li&gt;
&lt;li&gt;Apidog mencari konfigurasi sertifikat klien yang cocok.&lt;/li&gt;
&lt;li&gt;Jika cocok, Apidog melampirkan sertifikat saat TLS handshake.&lt;/li&gt;
&lt;li&gt;Request HTTP baru dikirim setelah handshake berhasil.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ada dua jenis sertifikat yang perlu dibedakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sertifikat klien&lt;/strong&gt;: dikirim ke server untuk membuktikan identitas Anda pada mTLS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sertifikat CA&lt;/strong&gt;: digunakan Apidog untuk mempercayai sertifikat server dari CA internal atau self-signed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Misalnya, error berikut menunjukkan masalah kepercayaan terhadap sertifikat server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSL Error: Self signed certificate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solusinya bukan menambahkan Bearer token, melainkan menambahkan sertifikat CA yang tepat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menyiapkan sertifikat klien untuk API mTLS
&lt;/h2&gt;

&lt;p&gt;Contoh berikut menggunakan API mitra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mitra memberikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sertifikat klien, misalnya &lt;code&gt;client.crt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kunci privat, misalnya &lt;code&gt;client.key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Atau satu bundle &lt;code&gt;client.pfx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Passphrase, jika kunci privat dilindungi kata sandi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Target request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://partner-api.acmebank.com/v1/settlements
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Buka pengaturan Sertifikat
&lt;/h3&gt;

&lt;p&gt;Di Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Klik ikon &lt;strong&gt;Settings&lt;/strong&gt; di kanan atas.&lt;/li&gt;
&lt;li&gt;Buka tab &lt;strong&gt;Sertifikat&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cari bagian &lt;strong&gt;Sertifikat Klien&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Konfigurasi di halaman ini tidak hanya berlaku untuk satu request. Apidog akan menggunakannya untuk semua request yang host-nya cocok.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tambahkan sertifikat klien
&lt;/h3&gt;

&lt;p&gt;Pada bagian &lt;strong&gt;Sertifikat Klien&lt;/strong&gt;, klik &lt;strong&gt;Tambah Sertifikat&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isi field &lt;strong&gt;Host&lt;/strong&gt; dengan domain tanpa protokol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jangan memasukkan nilai seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Host harus berupa nama domain mentah.&lt;/p&gt;

&lt;p&gt;Jika sertifikat yang sama berlaku untuk banyak subdomain, gunakan wildcard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Konfigurasi ini dapat mencakup host seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;partner-api.acmebank.com
sandbox-api.acmebank.com
settlements-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Atur port jika endpoint tidak menggunakan 443
&lt;/h3&gt;

&lt;p&gt;Secara default, HTTPS menggunakan port &lt;code&gt;443&lt;/code&gt;. Biarkan field port kosong jika endpoint Anda menggunakan port standar.&lt;/p&gt;

&lt;p&gt;Jika API mTLS berjalan pada port lain, tentukan port tersebut, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ini penting karena host dan port harus cocok dengan request yang dikirim. Jika konfigurasi tidak cocok, Apidog tidak akan mengirim sertifikat klien.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Pilih format sertifikat
&lt;/h3&gt;

&lt;p&gt;Apidog mendukung dua format umum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opsi A: CRT + Key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pilih file sertifikat dan kunci privat secara terpisah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client.crt
client.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Opsi B: PFX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pilih satu file bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client.pfx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika file atau kunci privat memiliki passphrase, isi field &lt;strong&gt;frasa sandi&lt;/strong&gt;. Jika tidak, biarkan kosong.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Simpan konfigurasi
&lt;/h3&gt;

&lt;p&gt;Klik &lt;strong&gt;Tambah&lt;/strong&gt; untuk menyimpan.&lt;/p&gt;

&lt;p&gt;Setelah disimpan, sertifikat akan terikat ke host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mulai sekarang, Apidog akan otomatis menggunakannya untuk request HTTPS ke host tersebut.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Kirim request yang membutuhkan mTLS
&lt;/h3&gt;

&lt;p&gt;Buat request seperti biasa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://partner-api.acmebank.com/v1/settlements
Authorization: Bearer &amp;lt;your_oauth_token&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada proses pengiriman request, Apidog akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mencocokkan host &lt;code&gt;partner-api.acmebank.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mengirim sertifikat klien saat TLS handshake.&lt;/li&gt;
&lt;li&gt;Memvalidasi koneksi mTLS.&lt;/li&gt;
&lt;li&gt;Mengirim header &lt;code&gt;Authorization&lt;/code&gt; setelah koneksi TLS berhasil dibuat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh respons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"settlements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stl_88213"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cleared"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"settled_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-14T09:31:00Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"next_cursor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Menambahkan sertifikat CA untuk root internal atau self-signed
&lt;/h2&gt;

&lt;p&gt;Sertifikat klien hanya menyelesaikan sisi autentikasi klien. Anda juga perlu menambahkan CA jika sertifikat server ditandatangani oleh CA internal atau self-signed.&lt;/p&gt;

&lt;p&gt;Gejalanya biasanya berupa error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SSL Error: Self signed certificate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk memperbaikinya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Sertifikat&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Aktifkan &lt;strong&gt;Sertifikat CA&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih file CA berformat PEM.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;File PEM dapat memuat satu atau beberapa sertifikat dalam satu chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEFTCCAv2gAwIBAgIQeM8V5x8B3QksZ4b2VqkJTANBgkqhkiG9w0BAQ...
-----END CERTIFICATE-----
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anda dapat menggabungkan root CA dan intermediate CA dalam satu file PEM jika diperlukan.&lt;/p&gt;

&lt;p&gt;Dengan konfigurasi ini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sertifikat CA membuat Apidog mempercayai server.&lt;/li&gt;
&lt;li&gt;Sertifikat klien membuat server mempercayai Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keduanya diperlukan untuk banyak layanan internal yang menggunakan mTLS dan PKI privat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting mTLS di Apidog
&lt;/h2&gt;

&lt;p&gt;Gunakan checklist berikut ketika sertifikat tidak terkirim atau handshake gagal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pastikan URL menggunakan HTTPS
&lt;/h3&gt;

&lt;p&gt;Sertifikat klien hanya dikirim untuk request HTTPS.&lt;/p&gt;

&lt;p&gt;Benar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://partner-api.acmebank.com/v1/settlements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://partner-api.acmebank.com/v1/settlements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada URL &lt;code&gt;http://&lt;/code&gt;, tidak ada TLS handshake dan sertifikat klien tidak akan digunakan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pastikan host tidak menyertakan protokol
&lt;/h3&gt;

&lt;p&gt;Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jangan gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://partner-api.acmebank.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pastikan port cocok
&lt;/h3&gt;

&lt;p&gt;Jika endpoint menggunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://partner-api.acmebank.com:8443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambahkan port &lt;code&gt;8443&lt;/code&gt; pada konfigurasi sertifikat. Konfigurasi dengan default &lt;code&gt;443&lt;/code&gt; tidak akan cocok.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gunakan satu sertifikat untuk satu domain
&lt;/h3&gt;

&lt;p&gt;Jangan mendaftarkan beberapa sertifikat klien untuk domain yang sama. Konfigurasi duplikat dapat membuat pemilihan sertifikat menjadi ambigu.&lt;/p&gt;

&lt;p&gt;Jika Anda perlu merotasi sertifikat:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hapus sertifikat lama.&lt;/li&gt;
&lt;li&gt;Tambahkan sertifikat baru.&lt;/li&gt;
&lt;li&gt;Uji request HTTPS kembali.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sertifikat yang telah ditambahkan tidak dapat diedit langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pisahkan mTLS dan otorisasi request
&lt;/h3&gt;

&lt;p&gt;mTLS bukan pengganti OAuth atau API key.&lt;/p&gt;

&lt;p&gt;Gunakan tab &lt;strong&gt;Sertifikat&lt;/strong&gt; untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sertifikat klien&lt;/li&gt;
&lt;li&gt;Kunci privat&lt;/li&gt;
&lt;li&gt;Sertifikat CA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan tab &lt;strong&gt;Otorisasi&lt;/strong&gt; untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Key&lt;/li&gt;
&lt;li&gt;Bearer Token&lt;/li&gt;
&lt;li&gt;OAuth 2.0&lt;/li&gt;
&lt;li&gt;Basic Auth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otorisasi dapat diterapkan pada level request, folder, atau collection. Untuk detailnya, baca panduan &lt;a href="https://apidog.com/id/blog/security-schemes?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;skema keamanan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk pola autentikasi berbasis gateway, lihat panduan &lt;a href="https://apidog.com/id/blog/api-gateway-authentication?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;autentikasi gateway API&lt;/a&gt;. Jika Anda bekerja dengan lingkungan Windows dan Kerberos, lihat juga &lt;a href="https://apidog.com/id/blog/how-to-configure-kerberos-authentication-in-apidog-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;konfigurasi autentikasi Kerberos di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menjalankan pengujian mTLS dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Setelah request mTLS berhasil di GUI, simpan request atau skenario pengujian lalu jalankan secara headless menggunakan &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instal CLI dan autentikasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario pada environment tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk menjalankan mTLS dari CLI, gunakan parameter sertifikat yang sesuai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ssl-client-cert&lt;/span&gt; ./client.crt &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ssl-client-key&lt;/span&gt; ./client.key &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ssl-client-passphrase&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CLIENT_CERT_PASSPHRASE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ssl-extra-ca-certs&lt;/span&gt; ./internal-ca.pem &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang relevan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ssl-client-cert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path ke sertifikat klien PEM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ssl-client-key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path ke kunci privat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ssl-client-passphrase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Passphrase kunci privat, jika ada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ssl-extra-ca-certs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path ke CA tambahan yang dipercaya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--ssl-client-cert-list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Konfigurasi beberapa sertifikat berdasarkan pola URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r html,cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Menghasilkan laporan HTML dan output CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tambahkan perintah tersebut ke job CI/CD agar API mTLS diuji pada setiap push atau deployment. Lihat panduan &lt;a href="https://apidog.com/id/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI di CI/CD&lt;/a&gt; untuk integrasi pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pertanyaan yang sering diajukan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apakah saya selalu membutuhkan sertifikat klien dan sertifikat CA?
&lt;/h3&gt;

&lt;p&gt;Tidak selalu.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anda membutuhkan &lt;strong&gt;sertifikat klien&lt;/strong&gt; jika server meminta mTLS.&lt;/li&gt;
&lt;li&gt;Anda membutuhkan &lt;strong&gt;sertifikat CA&lt;/strong&gt; jika sertifikat server ditandatangani oleh CA yang belum dipercaya, misalnya CA internal atau self-signed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;API publik dengan sertifikat dari CA publik biasanya hanya membutuhkan sertifikat klien untuk mTLS. Layanan internal dengan root CA privat sering membutuhkan keduanya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa Apidog tidak mengirim sertifikat klien saya?
&lt;/h3&gt;

&lt;p&gt;Periksa tiga hal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Host di konfigurasi sertifikat harus sama dengan host request.&lt;/li&gt;
&lt;li&gt;Jangan memasukkan &lt;code&gt;https://&lt;/code&gt; pada field host.&lt;/li&gt;
&lt;li&gt;Pastikan URL request menggunakan HTTPS.&lt;/li&gt;
&lt;li&gt;Jika endpoint memakai port non-standar, pastikan port konfigurasi cocok.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Apakah satu sertifikat dapat digunakan untuk beberapa subdomain?
&lt;/h3&gt;

&lt;p&gt;Ya, jika sertifikat dan kebijakan mitra mendukungnya. Gunakan pola wildcard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sertifikat tersebut akan diterapkan ke subdomain seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api.example.com
sandbox.example.com
partner.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bagaimana cara memperbarui sertifikat?
&lt;/h3&gt;

&lt;p&gt;Hapus sertifikat lama, lalu tambahkan sertifikat baru. Tidak ada opsi edit langsung untuk konfigurasi sertifikat yang sudah tersimpan.&lt;/p&gt;

&lt;p&gt;Untuk menjaga nilai environment tetap konsisten di banyak request, gunakan &lt;a href="https://apidog.com/id/blog/how-to-set-global-parameters-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;parameter global di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rangkuman
&lt;/h2&gt;

&lt;p&gt;Untuk menguji API yang dilindungi mTLS di Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan sertifikat klien dan ikat ke host yang benar.&lt;/li&gt;
&lt;li&gt;Tambahkan sertifikat CA jika server memakai CA privat atau self-signed.&lt;/li&gt;
&lt;li&gt;Pastikan request menggunakan HTTPS dan port yang sesuai.&lt;/li&gt;
&lt;li&gt;Konfigurasikan OAuth, API key, atau Bearer token secara terpisah di tab &lt;strong&gt;Otorisasi&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan skenario yang sama melalui Apidog CLI untuk CI/CD.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, tambahkan sertifikat mitra Anda, lalu uji request mTLS pertama Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Tes API Upload File (multipart/form-data) di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:05:49 +0000</pubDate>
      <link>https://dev.to/walse/cara-tes-api-upload-file-multipartform-data-di-apidog-4bfa</link>
      <guid>https://dev.to/walse/cara-tes-api-upload-file-multipartform-data-di-apidog-4bfa</guid>
      <description>&lt;p&gt;Anda membuat endpoint yang menerima file. Pengguna mengunggah gambar profil ke &lt;code&gt;POST /avatars&lt;/code&gt;, atau aplikasi Anda mengirim PDF yang ditandatangani ke &lt;code&gt;POST /documents&lt;/code&gt;. Rute tersebut mungkin sudah jelas, tetapi Anda tetap perlu membuktikannya melalui HTTP: pilih file nyata, lampirkan ke field formulir, kirim permintaan, lalu periksa responsnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Unggahan file menggunakan &lt;a href="https://datatracker.ietf.org/doc/html/rfc7578" rel="noopener noreferrer"&gt;&lt;code&gt;multipart/form-data&lt;/code&gt;&lt;/a&gt;, bukan JSON. Karena itu, Anda tidak bisa sekadar menempel body JSON lalu mengirimnya. Anda memerlukan pembuat request yang memahami field file, serta test runner yang dapat menemukan file saat pengujian berjalan. &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; menangani keduanya.&lt;/p&gt;

&lt;p&gt;Panduan ini membahas cara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengirim satu file.&lt;/li&gt;
&lt;li&gt;Mengirim file bersama JSON.&lt;/li&gt;
&lt;li&gt;Menambahkan assertion pada respons.&lt;/li&gt;
&lt;li&gt;Menjalankan upload di Runner atau CLI tanpa gagal karena file tidak ditemukan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda ingin memahami format multipart lebih dulu, baca panduan &lt;a href="https://apidog.com/id/blog/file-upload-in-apis?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;unggah file di API&lt;/a&gt;. Untuk sisi browser, gunakan &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/FormData" rel="noopener noreferrer"&gt;referensi MDN tentang FormData&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu &lt;code&gt;multipart/form-data&lt;/code&gt; dan mengapa unggahan memerlukannya
&lt;/h2&gt;

&lt;p&gt;Body request API dapat memiliki beberapa format. Di bagian &lt;strong&gt;Body&lt;/strong&gt; Apidog, Anda dapat memilih &lt;code&gt;form-data&lt;/code&gt;, &lt;code&gt;x-www-form-urlencoded&lt;/code&gt;, JSON, XML, raw, atau binary.&lt;/p&gt;

&lt;p&gt;Sebagian besar endpoint menggunakan JSON. Upload file adalah pengecualian.&lt;/p&gt;

&lt;p&gt;Tipe body &lt;code&gt;form-data&lt;/code&gt; memetakan ke header berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: multipart/form-data
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format ini dibuat untuk mengirim file bersama data lain dalam satu request. Body dibagi menjadi beberapa bagian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Satu bagian dapat berisi string, misalnya &lt;code&gt;title&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bagian lain dapat berisi byte mentah file, misalnya gambar PNG atau PDF.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Karena itu, Anda dapat mengirim foto dan metadata dalam request yang sama.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;x-www-form-urlencoded&lt;/code&gt; terlihat mirip karena sama-sama menggunakan pasangan key-value. Namun, format itu hanya cocok untuk field skalar sederhana dan tidak membawa byte file.&lt;/p&gt;

&lt;p&gt;Jika endpoint menerima file, gunakan &lt;code&gt;form-data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Di Apidog, setiap parameter &lt;code&gt;form-data&lt;/code&gt; memiliki tipe, misalnya &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;integer&lt;/code&gt;, atau &lt;code&gt;file&lt;/code&gt;. Atur tipe parameter menjadi &lt;code&gt;file&lt;/code&gt; agar Apidog melampirkan file, bukan mengirim path-nya sebagai teks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kirim unggahan file tunggal dan tambahkan assertion respons
&lt;/h2&gt;

&lt;p&gt;Misalnya Anda menguji &lt;code&gt;POST /avatars&lt;/code&gt;. Endpoint menerima satu field bernama &lt;code&gt;avatar&lt;/code&gt; dan mengembalikan JSON berisi URL file yang tersimpan.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pilih body &lt;code&gt;form-data&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Buat atau buka endpoint Anda, lalu atur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;URL: endpoint avatar Anda, misalnya &lt;code&gt;/avatars&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Body type: &lt;code&gt;form-data&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog akan mengatur &lt;code&gt;Content-Type: multipart/form-data&lt;/code&gt; secara otomatis.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tambahkan parameter file
&lt;/h3&gt;

&lt;p&gt;Tambahkan parameter dengan konfigurasi berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;avatar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ubah tipe parameter dari &lt;code&gt;string&lt;/code&gt; menjadi &lt;code&gt;file&lt;/code&gt;. Kolom nilai akan berubah menjadi pemilih file.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pilih file lokal
&lt;/h3&gt;

&lt;p&gt;Klik &lt;strong&gt;Upload&lt;/strong&gt; pada baris &lt;code&gt;avatar&lt;/code&gt;, lalu pilih file lokal, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jane-profile.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog menyimpan path file tersebut untuk digunakan saat request dikirim.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Kirim request
&lt;/h3&gt;

&lt;p&gt;Klik &lt;strong&gt;Send&lt;/strong&gt;. Apidog membaca file dari path lokal, membangun body multipart, lalu mengirim request.&lt;/p&gt;

&lt;p&gt;Perlu diperhatikan: Apidog mengirim file dalam request, tetapi tidak menyimpan byte file di cloud. Yang disimpan adalah path lokal file tersebut. Detail ini penting saat Anda menjalankan request di Runner, CLI, atau mesin lain.&lt;/p&gt;

&lt;p&gt;Respons yang berhasil dapat terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_8842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatarUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://cdn.example.com/avatars/usr_8842.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sizeBytes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;48210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Tambahkan assertion
&lt;/h3&gt;

&lt;p&gt;Status &lt;code&gt;200&lt;/code&gt; saja belum cukup untuk menyatakan pengujian berhasil. Tambahkan assertion pasca-request untuk memvalidasi respons.&lt;/p&gt;

&lt;p&gt;Contoh assertion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status code == 200
$.avatarUrl exists
$.contentType == "image/png"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assertion tersebut memeriksa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Respons memiliki status &lt;code&gt;200&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Field &lt;code&gt;avatarUrl&lt;/code&gt; ada.&lt;/li&gt;
&lt;li&gt;Field &lt;code&gt;contentType&lt;/code&gt; bernilai &lt;code&gt;image/png&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Di Apidog, tambahkan assertion ini pada endpoint atau langkah scenario. Untuk daftar operator dan penggunaan JSONPath, lihat panduan &lt;a href="https://apidog.com/id/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;assertion API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sebagai pembanding, request yang sama dengan curl terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.example.com/avatars &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"avatar=@jane-profile.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flag &lt;code&gt;-F&lt;/code&gt; membuat bagian multipart, sedangkan &lt;code&gt;@&lt;/code&gt; memberi tahu curl untuk membaca isi file. Field &lt;code&gt;form-data&lt;/code&gt; bertipe &lt;code&gt;file&lt;/code&gt; di Apidog menjalankan fungsi yang sama melalui UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kirim file dan JSON bersamaan
&lt;/h2&gt;

&lt;p&gt;Endpoint nyata biasanya menerima file dan metadata. Misalnya, &lt;code&gt;POST /documents&lt;/code&gt; dapat menerima PDF, judul, kategori, serta daftar tag.&lt;/p&gt;

&lt;p&gt;Ada dua pola umum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tambahkan field skalar untuk metadata sederhana
&lt;/h3&gt;

&lt;p&gt;Untuk metadata sederhana, tambahkan parameter &lt;code&gt;form-data&lt;/code&gt; di samping field file:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Contoh nilai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q3-invoice.pdf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Q3 Invoice&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;billing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Semua field dikirim dalam request multipart yang sama.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kirim metadata terstruktur sebagai string JSON
&lt;/h3&gt;

&lt;p&gt;Jika metadata berisi objek bersarang atau array, tambahkan field &lt;code&gt;metadata&lt;/code&gt; bertipe &lt;code&gt;string&lt;/code&gt;, lalu isi nilainya dengan JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Q3 Invoice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"invoice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"paid"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Struktur request menjadi:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Isi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q3-invoice.pdf&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;metadata&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Server membaca file dari satu bagian multipart dan mengurai JSON dari bagian lainnya.&lt;/p&gt;

&lt;p&gt;Pola ini umum pada API publik. Contohnya dapat dilihat pada &lt;a href="https://docs.stripe.com/api/files/create" rel="noopener noreferrer"&gt;dokumentasi unggahan file Stripe&lt;/a&gt;. Jika Anda bermigrasi dari Postman, panduan &lt;a href="https://apidog.com/id/blog/how-to-upload-a-file-and-json-data-in-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunggah file dan data JSON di Postman&lt;/a&gt; menjelaskan pemetaannya ke field &lt;code&gt;form-data&lt;/code&gt; Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kirim lebih dari satu file
&lt;/h3&gt;

&lt;p&gt;Tambahkan satu parameter &lt;code&gt;file&lt;/code&gt; untuk setiap file yang diharapkan endpoint.&lt;/p&gt;

&lt;p&gt;Contoh untuk endpoint yang menerima dokumen utama dan thumbnail:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;thumbnail&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tidak ada mode multi-file khusus. Tambahkan saja parameter bertipe &lt;code&gt;file&lt;/code&gt; hingga seluruh bagian yang diharapkan endpoint tercakup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ubah request menjadi scenario pengujian yang dapat diulang
&lt;/h2&gt;

&lt;p&gt;Mengirim request sekali hanya membuktikan endpoint berfungsi pada saat itu. Untuk mendeteksi regresi, simpan upload sebagai scenario pengujian.&lt;/p&gt;

&lt;p&gt;Contoh alur scenario:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kirim &lt;code&gt;POST /avatars&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Simpan &lt;code&gt;id&lt;/code&gt; dari respons.&lt;/li&gt;
&lt;li&gt;Kirim &lt;code&gt;GET /users/{id}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pastikan URL avatar masih ada pada respons.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bangun langkah upload seperti request biasa, lalu simpan sebagai langkah scenario. Panduan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menulis scenario pengujian dengan Apidog&lt;/a&gt; membahas perangkaian langkah dan pengiriman nilai antar-langkah.&lt;/p&gt;

&lt;p&gt;Setelah upload masuk ke scenario, Anda dapat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menjalankannya terhadap staging setiap deployment.&lt;/li&gt;
&lt;li&gt;Menambahkan cabang dengan &lt;a href="https://apidog.com/id/blog/how-to-add-conditional-logic-api-test-scenarios-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;logika bersyarat dalam scenario pengujian API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Menjalankannya secara berkala dengan &lt;a href="https://apidog.com/id/blog/how-to-schedule-api-tests-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian API terjadwal&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Namun, ada satu hal yang perlu Anda siapkan saat scenario dijalankan di luar laptop Anda: file upload harus tersedia di mesin eksekusi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesalahan umum: unggahan berjalan di mesin lain
&lt;/h2&gt;

&lt;p&gt;Apidog menyimpan path file, bukan file itu sendiri.&lt;/p&gt;

&lt;p&gt;Di laptop Anda, hal ini biasanya tidak terlihat karena path tersebut menunjuk ke file yang benar. Tetapi ketika request atau scenario dijalankan di mesin lain, path yang sama mungkin tidak ada.&lt;/p&gt;

&lt;p&gt;Anda akan menemukannya dalam dua situasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kolaborasi tim
&lt;/h3&gt;

&lt;p&gt;Misalnya Anda memilih file berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/jane/pics/jane-profile.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rekan tim dapat melihat parameter file dan path tersebut, tetapi tidak dapat mengirim request jika file hanya ada di laptop Anda.&lt;/p&gt;

&lt;p&gt;Solusinya: setiap anggota tim harus menyediakan salinan file di mesin mereka sendiri dan mengganti path file sesuai lokasi lokal mereka.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eksekusi Runner dan CLI
&lt;/h3&gt;

&lt;p&gt;Masalah yang sama terjadi dalam otomatisasi.&lt;/p&gt;

&lt;p&gt;Scenario berhasil saat dijalankan lokal, tetapi gagal di Runner atau CLI karena host tersebut tidak memiliki file pada path yang tersimpan dari laptop Anda.&lt;/p&gt;

&lt;p&gt;Penyebabnya bukan assertion atau endpoint. Runner atau CLI hanya tidak dapat menemukan file.&lt;/p&gt;

&lt;p&gt;Perbaikannya sederhana:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pastikan file tersedia di mesin yang menjalankan scenario.&lt;/li&gt;
&lt;li&gt;Ubah path pada langkah upload agar menunjuk ke lokasi file di mesin tersebut.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Konfigurasi file untuk Runner
&lt;/h3&gt;

&lt;p&gt;Runner membaca file dari direktori host yang dipasang sebagai volume saat deployment menggunakan flag &lt;code&gt;-v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Langkahnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Salin file upload ke direktori host yang dipasang ke Runner.&lt;/li&gt;
&lt;li&gt;Buka detail langkah upload pada scenario.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Batch Edit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ganti nilai field file dengan path yang tersedia di Runner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/runner/jane-profile.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Konfigurasi file untuk CLI
&lt;/h3&gt;

&lt;p&gt;Untuk CLI, gunakan pola yang sama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Letakkan file di mesin yang menjalankan CLI.&lt;/li&gt;
&lt;li&gt;Buka langkah upload.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;strong&gt;Batch Edit&lt;/strong&gt; untuk mengganti path file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/apidog/runner/jane-profile.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gunakan variabel agar path tidak di-hardcode
&lt;/h3&gt;

&lt;p&gt;Jangan simpan path literal langsung pada langkah scenario jika Anda menjalankan scenario di banyak environment.&lt;/p&gt;

&lt;p&gt;Gunakan variabel, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{upload_file_path}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu atur nilai variabel sesuai environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Lokal
/Users/jane/pics/jane-profile.png

# Runner
/opt/runner/jane-profile.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan pendekatan ini, langkah scenario tidak perlu diubah setiap kali dijalankan di laptop, Runner, atau CI.&lt;/p&gt;

&lt;p&gt;Runner hanya dapat membaca file yang berada di bawah direktori host yang dipasang menggunakan &lt;code&gt;-v&lt;/code&gt;. Jika file berada di luar direktori tersebut, path apa pun tidak akan dapat mengaksesnya.&lt;/p&gt;

&lt;p&gt;Untuk langkah deployment dan pengeditan massal, lihat &lt;a href="https://docs.apidog.com/how-do-i-upload-a-file-on-an-endpoint-request-882872m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;dokumentasi Apidog tentang request unggahan file&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan alur kerja dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Setelah scenario upload disimpan, jalankan scenario tersebut di CI tanpa UI.&lt;/p&gt;

&lt;p&gt;Instal CLI dan autentikasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian jalankan scenario berdasarkan ID dan environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang digunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID scenario pengujian.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reporter yang tersedia meliputi &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, dan &lt;code&gt;junit&lt;/code&gt;. Gunakan beberapa reporter dengan pemisah koma.&lt;/p&gt;

&lt;p&gt;CLI menjalankan scenario tersimpan dari proyek cloud dan mengembalikan status berhasil atau gagal melalui exit code. Karena itu, perintah ini dapat digunakan untuk mengontrol pipeline CI.&lt;/p&gt;

&lt;p&gt;Lihat &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan instalasi Apidog CLI&lt;/a&gt; untuk konfigurasi lebih lanjut.&lt;/p&gt;

&lt;p&gt;Satu hal tetap berlaku: file upload harus tersedia di mesin CLI, dan path pada langkah scenario harus menunjuk ke file tersebut. Gunakan &lt;strong&gt;Batch Edit&lt;/strong&gt; atau variabel environment sebelum menjalankan scenario.&lt;/p&gt;

&lt;p&gt;Untuk pengujian CI yang menggunakan input per baris, lihat &lt;a href="https://apidog.com/id/blog/apidog-cli-data-driven-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian berbasis data dengan Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mengapa rekan tim saya tidak dapat mengirim request upload file saya?
&lt;/h3&gt;

&lt;p&gt;Apidog menyimpan path file lokal, bukan file itu sendiri. Rekan tim dapat melihat request dan path yang Anda pilih, tetapi path tersebut mengarah ke disk Anda, bukan ke disk mereka.&lt;/p&gt;

&lt;p&gt;Minta mereka menyalin file ke mesin mereka dan memilih path lokal mereka sendiri. Hal yang sama berlaku untuk &lt;a href="https://apidog.com/id/blog/how-to-schedule-api-tests-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian terjadwal&lt;/a&gt; dan tugas Runner.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara mengirim JSON bersama file dalam request yang sama?
&lt;/h3&gt;

&lt;p&gt;Gunakan body &lt;code&gt;form-data&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan field file dengan tipe &lt;code&gt;file&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan field lain dengan tipe &lt;code&gt;string&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tempel JSON pada nilai field string tersebut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Server akan menerima file dan string JSON sebagai dua bagian dalam satu request multipart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Path apa yang harus digunakan untuk file di Runner?
&lt;/h3&gt;

&lt;p&gt;Gunakan path di dalam direktori yang dipasang ke volume Runner dengan flag &lt;code&gt;-v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/runner/yourfile.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salin file ke direktori tersebut, buka langkah upload, klik &lt;strong&gt;Batch Edit&lt;/strong&gt;, lalu set nilai field ke path tersebut.&lt;/p&gt;

&lt;p&gt;Untuk CLI, path dapat terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/apidog/runner/yourfile.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apakah ada batas ukuran file atau tipe file yang diizinkan?
&lt;/h3&gt;

&lt;p&gt;Apidog membangun request dan membaca file dari path yang Anda pilih. Batas ukuran serta tipe file ditentukan oleh API yang Anda uji.&lt;/p&gt;

&lt;p&gt;Periksa aturan validasi pada server Anda, lalu tambahkan assertion terhadap respons untuk kasus file terlalu besar atau tipe file yang ditolak.&lt;/p&gt;

&lt;h3&gt;
  
  
  Haruskah menggunakan &lt;code&gt;form-data&lt;/code&gt; atau &lt;code&gt;x-www-form-urlencoded&lt;/code&gt; untuk upload?
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;form-data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;form-data&lt;/code&gt; memetakan ke &lt;code&gt;multipart/form-data&lt;/code&gt; dan mendukung file. &lt;code&gt;x-www-form-urlencoded&lt;/code&gt; hanya cocok untuk form sederhana yang berisi field skalar tanpa file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Pengujian upload file memiliki dua bagian utama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bangun request multipart dengan benar.&lt;/li&gt;
&lt;li&gt;Pastikan file tersedia di setiap mesin tempat pengujian dijalankan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, pilih Body &lt;code&gt;form-data&lt;/code&gt;, ubah tipe field menjadi &lt;code&gt;file&lt;/code&gt;, pilih file melalui &lt;strong&gt;Upload&lt;/strong&gt;, tambahkan metadata JSON sebagai field &lt;code&gt;string&lt;/code&gt;, lalu kirim request dan tambahkan assertion.&lt;/p&gt;

&lt;p&gt;Saat menjalankan scenario di Runner atau CLI, siapkan file pada mesin eksekusi dan arahkan path menggunakan &lt;strong&gt;Batch Edit&lt;/strong&gt; atau variabel environment.&lt;/p&gt;

&lt;p&gt;Ingin mencobanya pada endpoint Anda sendiri? &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt;, buat request &lt;code&gt;form-data&lt;/code&gt; ke endpoint upload Anda, lalu periksa responsnya.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menangkap dan Memvalidasi Webhook Stripe di CI dengan Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 05:55:42 +0000</pubDate>
      <link>https://dev.to/walse/cara-menangkap-dan-memvalidasi-webhook-stripe-di-ci-dengan-apidog-5fe4</link>
      <guid>https://dev.to/walse/cara-menangkap-dan-memvalidasi-webhook-stripe-di-ci-dengan-apidog-5fe4</guid>
      <description>&lt;p&gt;Seorang pelanggan membayar, Stripe mengirimkan peristiwa &lt;code&gt;payment_intent.succeeded&lt;/code&gt; ke backend Anda, dan endpoint Anda harus menandai pesanan sebagai lunas. Bagian terakhir ini sering gagal tanpa terdeteksi: webhook tiba, penangan mengalami error, lalu masalah baru terlihat ketika pengguna melapor bahwa pembayaran berhasil tetapi status akun masih belum lunas. Solusinya adalah pengujian CI yang memverifikasi bahwa peristiwa benar-benar tiba dan diproses dengan benar pada setiap pengiriman kode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Tantangannya, webhook adalah panggilan HTTP masuk dari Stripe ke aplikasi Anda, bukan request yang Anda kirim sendiri. Banyak alat pengujian API dirancang untuk mengirim request dan memeriksa respons, sehingga model webhook terlihat terbalik. Panduan ini menjelaskan pendekatan yang didukung dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;: tangkap webhook di backend Anda, simpan hasilnya, lalu validasi data tersebut dari skenario CI. Untuk konteks lebih umum, baca panduan &lt;a href="https://apidog.com/id/blog/how-to-test-webhooks?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menguji webhook&lt;/a&gt; dan &lt;a href="https://docs.stripe.com/webhooks" rel="noopener noreferrer"&gt;dokumentasi webhook Stripe&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batasan yang harus Anda rancang
&lt;/h2&gt;

&lt;p&gt;Menurut &lt;a href="https://docs.apidog.com/how-can-i-capture-and-validate-stripe-webhooks-in-apidog-during-cicd-838545m0" rel="noopener noreferrer"&gt;dokumentasi Apidog&lt;/a&gt;, Apidog tidak secara bawaan mendukung pendengaran webhook masuk secara real-time. Anda tidak dapat mengarahkan Stripe ke URL Apidog lalu menunggu peristiwa masuk di sana.&lt;/p&gt;

&lt;p&gt;Namun, ini bukan jalan buntu. Ubah desain pengujian menjadi pola &lt;strong&gt;tangkap lalu kueri&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Backend Anda menerima webhook dari Stripe.&lt;/li&gt;
&lt;li&gt;Backend menyimpan data peristiwa ke database.&lt;/li&gt;
&lt;li&gt;Apidog mengkueri data tersimpan tersebut.&lt;/li&gt;
&lt;li&gt;Skenario pengujian memvalidasi bahwa peristiwa dan efek bisnisnya sesuai harapan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pola ini cocok untuk CI karena kueri database dapat diulang dan hasilnya deterministik.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seperti apa pola tangkap-lalu-kueri itu
&lt;/h2&gt;

&lt;p&gt;Implementasinya memiliki empat bagian:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat endpoint backend untuk menerima webhook Stripe.&lt;/li&gt;
&lt;li&gt;Simpan peristiwa webhook ke tabel &lt;code&gt;stripe_event_logs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Konfigurasikan koneksi database pada environment Apidog.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;Post-Request Processor&lt;/code&gt; untuk mengkueri dan memvalidasi data peristiwa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Endpoint dan tabel log adalah tanggung jawab aplikasi Anda. Setelah peristiwa tersimpan, Apidog dapat membaca baris tersebut untuk memverifikasi apakah webhook sudah diproses seperti yang diharapkan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 1: buat endpoint penangkapan
&lt;/h2&gt;

&lt;p&gt;Backend membutuhkan rute yang dapat di-&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" rel="noopener noreferrer"&gt;POST&lt;/a&gt; oleh Stripe. Berikut contoh minimal dengan Express:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Stripe&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stripe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stripe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;endpointSecret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/webhooks/stripe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webhooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constructEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stripe-signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nx"&gt;endpointSecret&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Signature check failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Simpan event agar dapat diverifikasi oleh pengujian.&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`INSERT INTO stripe_event_logs (event_id, type, payload, handled_at)
       VALUES ($1, $2, $3, now())
       ON CONFLICT (event_id) DO NOTHING`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;payment_intent.succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;markOrderPaid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhatikan dua hal penting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifikasi tanda tangan Stripe dengan &lt;code&gt;constructEvent&lt;/code&gt; sebelum memproses payload. Ini wajib untuk memastikan request benar-benar berasal dari Stripe. Lihat panduan &lt;a href="https://apidog.com/id/blog/webhook-signature-verification?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;verifikasi tanda tangan webhook&lt;/a&gt; untuk pembahasan lebih lanjut.&lt;/li&gt;
&lt;li&gt;Simpan event ke &lt;code&gt;stripe_event_logs&lt;/code&gt;. Baris ini menjadi bukti yang akan dibaca oleh Apidog.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;ON CONFLICT (event_id) DO NOTHING&lt;/code&gt; untuk menjaga proses tetap idempoten karena Stripe dapat mengirim ulang event yang sama.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Langkah 2: hubungkan database di environment Apidog
&lt;/h2&gt;

&lt;p&gt;Konfigurasikan koneksi database pada environment Apidog yang dipakai oleh CI, misalnya database staging atau database pengujian khusus.&lt;/p&gt;

&lt;p&gt;Pastikan environment aplikasi dan environment Apidog mengarah ke database yang sama:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pengujian terhadap staging harus membaca database staging.&lt;/li&gt;
&lt;li&gt;Pengujian terhadap database test harus memicu webhook ke aplikasi test.&lt;/li&gt;
&lt;li&gt;Jangan gunakan database produksi untuk skenario ini.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ketidaksesuaian environment adalah penyebab umum pengujian gagal meskipun endpoint webhook sebenarnya sudah menerima event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 3: tambahkan Post-Request Processor untuk mengkueri log
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Post-Request Processor&lt;/code&gt; memungkinkan Apidog menjalankan kueri database setelah request dalam skenario pengujian selesai.&lt;/p&gt;

&lt;p&gt;Alur untuk memvalidasi &lt;code&gt;payment_intent.succeeded&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Skenario memicu pembayaran, misalnya membuat dan mengonfirmasi &lt;code&gt;payment intent&lt;/code&gt; dalam mode test Stripe.&lt;/li&gt;
&lt;li&gt;Stripe mengirim webhook ke &lt;code&gt;/webhooks/stripe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Endpoint memverifikasi signature dan menyimpan event ke &lt;code&gt;stripe_event_logs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Langkah berikutnya menjalankan &lt;code&gt;Post-Request Processor&lt;/code&gt; untuk mengambil event tersebut.&lt;/li&gt;
&lt;li&gt;Skenario memvalidasi event dan perubahan status pesanan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh kueri SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;event_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handled_at&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;stripe_event_logs&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'payment_intent.succeeded'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;handled_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validasi minimal yang sebaiknya dilakukan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;type&lt;/code&gt; harus bernilai &lt;code&gt;payment_intent.succeeded&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;event_id&lt;/code&gt; harus cocok dengan event yang dipicu oleh skenario.&lt;/li&gt;
&lt;li&gt;Nilai dalam &lt;code&gt;payload&lt;/code&gt;, seperti jumlah pembayaran atau ID pesanan, harus sesuai.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handled_at&lt;/code&gt; harus terisi untuk membuktikan penangan benar-benar berjalan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jangan hanya mengambil event terbaru tanpa membandingkan &lt;code&gt;event_id&lt;/code&gt;. Jika tabel log berisi data dari eksekusi sebelumnya, pengujian dapat memberikan hasil positif palsu.&lt;/p&gt;

&lt;p&gt;Karena webhook bersifat asinkron, tambahkan jeda singkat atau mekanisme polling sebelum menjalankan kueri. Contohnya, ulangi kueri beberapa kali dalam interval singkat hingga event ditemukan atau batas waktu tercapai.&lt;/p&gt;

&lt;h2&gt;
  
  
  Catatan tentang penerusan real-time selama pengembangan lokal
&lt;/h2&gt;

&lt;p&gt;Pola tangkap-lalu-kueri ideal untuk CI. Namun, saat pengembangan lokal, Stripe tidak dapat mengakses &lt;code&gt;localhost&lt;/code&gt; secara langsung. Anda memerlukan layanan penerusan webhook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.stripe.com/stripe-cli" rel="noopener noreferrer"&gt;Stripe CLI&lt;/a&gt; dapat meneruskan event ke endpoint lokal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stripe listen &lt;span class="nt"&gt;--forward-to&lt;/span&gt; localhost:3000/webhooks/stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatifnya, gunakan Ngrok untuk mengekspos port lokal sebagai URL publik yang dapat didaftarkan pada Stripe.&lt;/p&gt;

&lt;p&gt;Gunakan pendekatan berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pengembangan lokal:&lt;/strong&gt; Stripe CLI atau Ngrok untuk melihat event secara langsung.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI:&lt;/strong&gt; database log dan &lt;code&gt;Post-Request Processor&lt;/code&gt; untuk validasi otomatis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Jangan keliru dengan fitur Webhook bawaan Apidog
&lt;/h2&gt;

&lt;p&gt;Apidog memiliki fitur bernama &lt;code&gt;Webhook&lt;/code&gt;, tetapi fitur ini bukan listener untuk menerima event Stripe masuk.&lt;/p&gt;

&lt;p&gt;Fitur &lt;code&gt;Webhook&lt;/code&gt; bawaan digunakan untuk mendefinisikan dan mendokumentasikan &lt;strong&gt;outbound webhook&lt;/strong&gt;: webhook yang dikirim oleh sistem Anda ke URL eksternal ketika suatu event terjadi.&lt;/p&gt;

&lt;p&gt;Untuk membuat dokumentasi outbound webhook di Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Klik ikon &lt;code&gt;+&lt;/code&gt; di sidebar kiri.&lt;/li&gt;
&lt;li&gt;Pilih &lt;code&gt;New Other Protocol APIs&lt;/code&gt;, lalu &lt;code&gt;Webhook&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Isi &lt;code&gt;Request Method&lt;/code&gt;, &lt;code&gt;Webhook Name&lt;/code&gt;, &lt;code&gt;Debug URL&lt;/code&gt;, serta konfigurasi body dan header.&lt;/li&gt;
&lt;li&gt;Klik &lt;code&gt;Save&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anda dapat memasukkan URL pada &lt;code&gt;Debug URL&lt;/code&gt; lalu menekan &lt;code&gt;Send&lt;/code&gt; untuk mensimulasikan request. Perlu diingat, &lt;code&gt;Debug URL&lt;/code&gt; hanya digunakan saat pengujian dan tidak muncul pada dokumentasi yang diterbitkan atau ekspor OpenAPI.&lt;/p&gt;

&lt;p&gt;Untuk pembahasan desain callback, baca &lt;a href="https://apidog.com/id/blog/webhooks-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;webhook dalam desain API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ringkasnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fitur &lt;code&gt;Webhook&lt;/code&gt; Apidog: dokumentasi dan simulasi webhook &lt;strong&gt;outbound&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pola tangkap-lalu-kueri: validasi webhook Stripe &lt;strong&gt;inbound&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variasi dan penguatan
&lt;/h2&gt;

&lt;p&gt;Setelah validasi dasar berjalan, tambahkan pengujian berikut.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Validasi event secara end-to-end
&lt;/h3&gt;

&lt;p&gt;Jangan hanya memeriksa jenis event. Cocokkan juga &lt;code&gt;event_id&lt;/code&gt; agar Anda tahu event yang divalidasi adalah event yang dipicu oleh test saat ini.&lt;/p&gt;

&lt;p&gt;Jika tabel log terus bertambah, pertimbangkan untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menghapus data test sebelum skenario dijalankan.&lt;/li&gt;
&lt;li&gt;Menambahkan &lt;code&gt;test_run_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Membatasi kueri berdasarkan ID pesanan atau metadata unik.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Uji jalur kegagalan
&lt;/h3&gt;

&lt;p&gt;Uji kondisi yang seharusnya ditolak, misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signature tidak valid.&lt;/li&gt;
&lt;li&gt;Jenis event tidak didukung.&lt;/li&gt;
&lt;li&gt;Payload tidak memiliki data pesanan yang diperlukan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk event yang ditolak, pastikan aplikasi tidak menulis &lt;code&gt;handled_at&lt;/code&gt; dan tidak mengubah status pesanan. Pengujian hanya pada jalur sukses tidak cukup untuk menangkap masalah yang dapat muncul di produksi.&lt;/p&gt;

&lt;p&gt;Lihat juga &lt;a href="https://apidog.com/id/blog/payment-webhook-best-practices?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;praktik terbaik webhook pembayaran&lt;/a&gt; untuk idempotensi dan perilaku percobaan ulang.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Validasi hasil bisnis
&lt;/h3&gt;

&lt;p&gt;“Webhook diterima” belum berarti proses pembayaran berhasil secara bisnis.&lt;/p&gt;

&lt;p&gt;Jika handler memperbarui tabel &lt;code&gt;orders&lt;/code&gt;, tambahkan kueri kedua:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payment_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;paid_at&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian verifikasi bahwa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;payment_status&lt;/code&gt; berubah menjadi status lunas yang diharapkan.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;paid_at&lt;/code&gt; terisi.&lt;/li&gt;
&lt;li&gt;Pesanan yang tepat diperbarui.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan begitu, test membuktikan seluruh rantai: Stripe mengirim event, handler memprosesnya, dan status pesanan berubah.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Jadwalkan validasi
&lt;/h3&gt;

&lt;p&gt;Selain menjadikannya merge gate, Anda dapat menjalankan skenario secara berkala. Setelah skenario tersimpan di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, jadwalkan eksekusinya untuk mendeteksi handler rusak di antara deployment.&lt;/p&gt;

&lt;p&gt;Panduan &lt;a href="https://apidog.com/id/blog/how-to-schedule-api-tests-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menjadwalkan pengujian API di Apidog&lt;/a&gt; membahas pengaturan tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan alur kerja dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Agar pengujian berjalan tanpa pengawasan, jalankan skenario dengan Apidog CLI di pipeline CI.&lt;/p&gt;

&lt;p&gt;Instal CLI dan autentikasi dengan token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario validasi webhook terhadap environment yang benar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;SCENARIO_ID&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;ENV_ID&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keterangan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID skenario pengujian.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporter output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika Anda membutuhkan laporan HTML sebagai artifact CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;SCENARIO_ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;ENV_ID&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skenario tersebut membawa konfigurasi &lt;code&gt;Post-Request Processor&lt;/code&gt; dan kueri database. Jika validasi gagal, perintah mengembalikan kode keluar non-nol sehingga pipeline dapat memblokir merge.&lt;/p&gt;

&lt;p&gt;Lihat &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan instalasi Apidog CLI&lt;/a&gt; dan &lt;a href="https://apidog.com/id/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan alur kerja CI/CD pipeline&lt;/a&gt; untuk contoh integrasi lebih lengkap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pertanyaan yang Sering Diajukan
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bisakah Apidog menerima webhook Stripe secara langsung?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tidak. Apidog tidak secara bawaan mendengarkan webhook masuk. Tangkap event di endpoint backend Anda, simpan ke database, lalu validasi menggunakan &lt;code&gt;Post-Request Processor&lt;/code&gt;. Untuk pengembangan lokal, gunakan Stripe CLI atau Ngrok.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Di mana verifikasi terjadi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verifikasi terjadi di &lt;code&gt;Post-Request Processor&lt;/code&gt; dalam skenario pengujian Apidog. Prosesor mengkueri tabel &lt;code&gt;stripe_event_logs&lt;/code&gt; melalui koneksi database environment, lalu membandingkan hasilnya dengan nilai yang diharapkan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah saya perlu paket berbayar untuk alur validasi database?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dokumentasi alur kerja ini tidak menyatakan pembatasan paket tertentu. Periksa detail paket terbaru di halaman harga. Anda juga dapat &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt; untuk meninjau konfigurasi &lt;code&gt;Post-Request Processor&lt;/code&gt; dan koneksi database environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bagaimana menangani jeda antara pemicuan pembayaran dan pengiriman webhook?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tambahkan delay singkat atau polling retry sebelum menjalankan kueri. Ulangi kueri beberapa kali selama beberapa detik hingga event ditemukan. Untuk konsep dasarnya, baca &lt;a href="https://apidog.com/id/blog/how-to-test-webhooks?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menguji webhook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah fitur Webhook bawaan Apidog berguna untuk menangkap event Stripe?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tidak. Fitur tersebut digunakan untuk mendefinisikan webhook outbound dari sistem Anda. Untuk event Stripe inbound, gunakan pola tangkap-lalu-kueri.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Anda tidak dapat mengarahkan Stripe ke Apidog untuk menangkap webhook secara langsung. Pendekatan yang didukung adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Terima webhook Stripe di endpoint backend Anda.&lt;/li&gt;
&lt;li&gt;Verifikasi signature.&lt;/li&gt;
&lt;li&gt;Catat event ke tabel &lt;code&gt;stripe_event_logs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;Post-Request Processor&lt;/code&gt; Apidog untuk mengkueri event.&lt;/li&gt;
&lt;li&gt;Validasi event dan perubahan status pesanan.&lt;/li&gt;
&lt;li&gt;Jalankan skenario dengan &lt;code&gt;apidog run&lt;/code&gt; di pipeline CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan pola ini, setiap merge dapat membuktikan bahwa event pembayaran benar-benar mengubah pesanan menjadi lunas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menguji API GraphQL di Apidog (Kueri, Mutasi, dan Otomatisasi)</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 05:45:03 +0000</pubDate>
      <link>https://dev.to/walse/cara-menguji-api-graphql-di-apidog-kueri-mutasi-dan-otomatisasi-23nn</link>
      <guid>https://dev.to/walse/cara-menguji-api-graphql-di-apidog-kueri-mutasi-dan-otomatisasi-23nn</guid>
      <description>&lt;p&gt;Anda memiliki endpoint GraphQL dan perlu memastikan endpoint tersebut benar-benar bekerja: kueri &lt;code&gt;user&lt;/code&gt; mengembalikan bidang yang dipakai aplikasi, mutasi &lt;code&gt;createOrder&lt;/code&gt; menyimpan pesanan, dan bentuk respons tetap konsisten saat variabel berubah. Alat REST yang berfokus pada URL dan HTTP method sering terasa kurang nyaman untuk GraphQL karena semua operasi biasanya dikirim ke satu endpoint melalui body &lt;code&gt;POST&lt;/code&gt;. Anda memerlukan klien yang memahami sintaks kueri, dapat membaca skema, memberi saran bidang, dan memvalidasi respons JSON.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mendukung GraphQL sebagai tipe permintaan khusus, bersama HTTP, gRPC, WebSocket, SSE, dan SOAP. Dalam panduan ini, Anda akan membuat permintaan GraphQL dari nol: menulis kueri, mengambil skema untuk pelengkapan kode, memakai variabel, menjalankan mutasi, menambahkan assertion, lalu menyimpannya sebagai skenario pengujian. Contohnya menggunakan API e-commerce untuk mengambil pengguna dan pesanan, kemudian membuat pesanan baru. Untuk konsep dasar GraphQL, gunakan &lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;dokumentasi resmi GraphQL&lt;/a&gt;. Untuk memilih pendekatan API yang tepat, lihat perbandingan &lt;a href="https://apidog.com/id/blog/rest-vs-graphql?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST vs GraphQL&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa yang diuji dan mengapa GraphQL berbeda
&lt;/h2&gt;

&lt;p&gt;REST biasanya memiliki banyak endpoint dengan struktur respons tetap. GraphQL biasanya menggunakan satu endpoint, tetapi pemanggil menentukan sendiri bidang yang ingin diambil.&lt;/p&gt;

&lt;p&gt;Contoh REST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Padanan GraphQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dua perbedaan penting saat menguji GraphQL:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Operasi dikirim sebagai dokumen kueri di body request&lt;/strong&gt;, bukan sebagai variasi URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 200 tidak selalu berarti operasi berhasil.&lt;/strong&gt; GraphQL dapat mengembalikan &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200" rel="noopener noreferrer"&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/a&gt; meskipun terjadi kesalahan validasi atau kesalahan bisnis. Kesalahan tersebut biasanya muncul dalam array &lt;code&gt;errors&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh respons yang gagal secara logika, tetapi tetap menggunakan HTTP 200:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User tidak ditemukan"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena itu, assertion GraphQL harus memeriksa body respons, bukan hanya status HTTP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buat permintaan GraphQL di Apidog
&lt;/h2&gt;

&lt;p&gt;Mulai dengan &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt; atau membukanya melalui browser. Buat atau buka proyek agar permintaan dapat disimpan dan digunakan ulang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: buat request GraphQL
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Klik tombol &lt;code&gt;+&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;code&gt;New Request&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Atur method menjadi &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Masukkan URL endpoint GraphQL Anda.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.yourstore.com/graphql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Buka tab &lt;code&gt;Body&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pilih tipe body &lt;code&gt;GraphQL&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog akan menampilkan editor GraphQL dengan area &lt;code&gt;Query&lt;/code&gt;. Jika endpoint memerlukan autentikasi, buka bagian &lt;code&gt;Authorization&lt;/code&gt; dan tambahkan token, misalnya Bearer token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;your-token&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GraphQL tetap berjalan melalui HTTP, sehingga konfigurasi autentikasinya sama seperti request HTTP lain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: tulis kueri pertama
&lt;/h3&gt;

&lt;p&gt;Di tab &lt;code&gt;Run&lt;/code&gt;, masukkan kueri untuk mengambil pengguna beserta pesanan mereka:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetUserWithOrders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_1024"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;createdAt&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kueri ini meminta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data pengguna;&lt;/li&gt;
&lt;li&gt;daftar pesanan terkait;&lt;/li&gt;
&lt;li&gt;detail setiap pesanan, termasuk status dan waktu pembuatan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nama bidang harus sesuai dengan skema server. Jika skema menggunakan &lt;code&gt;emailAddress&lt;/code&gt;, bukan &lt;code&gt;email&lt;/code&gt;, kueri akan gagal. Untuk menghindari menebak nama bidang, ambil skema endpoint pada langkah berikutnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: ambil skema untuk pelengkapan kode
&lt;/h3&gt;

&lt;p&gt;Klik &lt;code&gt;Fetch Schema&lt;/code&gt; pada editor GraphQL. Apidog akan menjalankan introspeksi terhadap endpoint dan mengambil informasi tipe, query, mutation, serta bidang yang tersedia.&lt;/p&gt;

&lt;p&gt;Setelah skema berhasil diambil, editor dapat memberi saran bidang dan tipe saat Anda menulis kueri.&lt;/p&gt;

&lt;p&gt;Gunakan alur berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pastikan URL endpoint sudah benar.&lt;/li&gt;
&lt;li&gt;Konfigurasikan autentikasi bila diperlukan.&lt;/li&gt;
&lt;li&gt;Klik &lt;code&gt;Fetch Schema&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mulai tulis kueri dan pilih bidang dari saran editor.&lt;/li&gt;
&lt;li&gt;Jalankan ulang &lt;code&gt;Fetch Schema&lt;/code&gt; setelah ada perubahan skema.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Perlu diingat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pelengkapan kode tidak aktif otomatis; Anda harus memilih &lt;code&gt;Fetch Schema&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Jika introspeksi dinonaktifkan di server produksi, skema tidak dapat diambil.&lt;/li&gt;
&lt;li&gt;Dalam kasus tersebut, gunakan dokumentasi internal atau skema GraphQL yang disediakan tim backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 4: jalankan dan baca respons
&lt;/h3&gt;

&lt;p&gt;Klik &lt;code&gt;Send&lt;/code&gt;. Respons yang berhasil dapat terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_1024"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dana Whitfield"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ord_5001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SHIPPED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-01T09:14:00Z"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ord_5002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PENDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-12T16:03:00Z"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perhatikan struktur respons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hasil operasi berada di bawah &lt;code&gt;data&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;kesalahan GraphQL berada di bawah &lt;code&gt;errors&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;assertion nilai harus menggunakan jalur seperti &lt;code&gt;$.data.user.orders&lt;/code&gt;, bukan &lt;code&gt;$.user.orders&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Meneruskan variabel agar request dapat digunakan ulang
&lt;/h2&gt;

&lt;p&gt;Jangan meng-hardcode nilai seperti &lt;code&gt;"usr_1024"&lt;/code&gt; jika request akan dipakai ulang. Gunakan variabel GraphQL agar Anda dapat menjalankan kueri yang sama untuk pengguna, environment, atau data pengujian yang berbeda.&lt;/p&gt;

&lt;p&gt;Referensi sintaksnya tersedia di &lt;a href="https://graphql.org/learn/queries/#variables" rel="noopener noreferrer"&gt;dokumentasi GraphQL tentang variables&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ubah kueri menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GetUserWithOrders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian masukkan nilai variabel sebagai JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_1024"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan pola ini, Anda hanya perlu mengubah nilai di object variables tanpa mengedit dokumen kueri.&lt;/p&gt;

&lt;p&gt;Untuk environment yang berbeda, gunakan kombinasi variabel GraphQL dan environment variables Apidog. Misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{test_user_id}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan demikian, request yang sama dapat dijalankan terhadap staging dan produksi dengan konfigurasi environment yang berbeda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tulis mutasi untuk membuat pesanan
&lt;/h2&gt;

&lt;p&gt;Mutasi digunakan untuk mengubah data. Di Apidog, mutasi ditulis pada editor &lt;code&gt;Query&lt;/code&gt; yang sama; cukup gunakan keyword &lt;code&gt;mutation&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contoh mutasi untuk membuat pesanan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CreateOrderInput&lt;/span&gt;&lt;span class="p"&gt;!)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;createdAt&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Masukkan payload melalui variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_1024"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TSHIRT-BLK-M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MUG-CERAMIC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Klik &lt;code&gt;Send&lt;/code&gt;. Respons yang berhasil dapat berbentuk seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"createOrder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ord_5003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PENDING"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-15T10:22:11Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena mutasi menulis data, jalankan mutasi pada environment testing atau staging, bukan produksi.&lt;/p&gt;

&lt;p&gt;Pola pengujian end-to-end yang praktis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Jalankan query pengguna.&lt;/li&gt;
&lt;li&gt;Jalankan mutasi &lt;code&gt;CreateOrder&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Simpan &lt;code&gt;id&lt;/code&gt; pesanan dari respons mutasi.&lt;/li&gt;
&lt;li&gt;Jalankan kembali query pengguna.&lt;/li&gt;
&lt;li&gt;Pastikan pesanan baru muncul pada daftar &lt;code&gt;orders&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tegaskan respons, jangan periksa JSON secara manual
&lt;/h2&gt;

&lt;p&gt;Saat eksplorasi, memeriksa JSON secara manual masih cukup. Namun, pengujian regresi memerlukan assertion yang dapat menentukan lulus atau gagal secara otomatis.&lt;/p&gt;

&lt;p&gt;Apidog memungkinkan Anda menambahkan assertion ke request, seperti yang dijelaskan pada panduan &lt;a href="https://apidog.com/id/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penegasan API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Untuk request GraphQL, tambahkan minimal tiga pemeriksaan berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Status HTTP adalah &lt;code&gt;200&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ini memastikan transport HTTP berhasil.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Field &lt;code&gt;errors&lt;/code&gt; tidak ada&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ini adalah pemeriksaan utama GraphQL. Status &lt;code&gt;200&lt;/code&gt; tetap dapat berisi kegagalan operasi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nilai di bawah &lt;code&gt;data&lt;/code&gt; sesuai harapan&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Gunakan JSONPath untuk memvalidasi struktur dan isi respons.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Contoh assertion yang berguna:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code equals 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.errors does not exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.data.createOrder.status equals PENDING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.data.user.orders length is greater than 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kombinasi tersebut menangkap masalah yang tidak terlihat jika hanya memeriksa status HTTP, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bidang GraphQL tidak valid;&lt;/li&gt;
&lt;li&gt;user tidak ditemukan;&lt;/li&gt;
&lt;li&gt;respons mengandung &lt;code&gt;errors&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;mutasi berhasil dipanggil tetapi mengembalikan status pesanan yang tidak sesuai;&lt;/li&gt;
&lt;li&gt;struktur respons berubah setelah pembaruan skema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Simpan alur ke dalam skenario pengujian
&lt;/h2&gt;

&lt;p&gt;Satu request dengan assertion cocok untuk smoke test. Untuk pengujian alur bisnis, rangkai beberapa request menjadi skenario.&lt;/p&gt;

&lt;p&gt;Contoh skenario:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query pengguna.&lt;/li&gt;
&lt;li&gt;Buat pesanan melalui mutasi.&lt;/li&gt;
&lt;li&gt;Ekstrak &lt;code&gt;id&lt;/code&gt; pesanan dari respons mutasi.&lt;/li&gt;
&lt;li&gt;Query ulang pengguna atau pesanan.&lt;/li&gt;
&lt;li&gt;Pastikan pesanan yang dibuat benar-benar tersimpan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Skenario pengujian Apidog dapat menjalankan langkah-langkkah tersebut secara berurutan, meneruskan data antar-step, dan menjalankan seluruh alur dengan satu aksi. Lihat panduan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menulis skenario pengujian dengan Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Implementasikan skenario dengan langkah berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat test scenario baru.&lt;/li&gt;
&lt;li&gt;Tambahkan query &lt;code&gt;GetUserWithOrders&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan mutasi &lt;code&gt;CreateOrder&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ekstrak nilai berikut dari respons mutasi:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   $.data.createOrder.id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Simpan hasil ekstraksi sebagai variabel skenario.&lt;/li&gt;
&lt;li&gt;Gunakan variabel tersebut pada query verifikasi.&lt;/li&gt;
&lt;li&gt;Tambahkan assertion pada setiap langkah.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan pendekatan ini, Anda memiliki tes regresi yang dapat digunakan kembali saat skema, resolver, atau logika bisnis berubah.&lt;/p&gt;

&lt;p&gt;Untuk membandingkan GraphQL dengan protokol lain, lihat &lt;a href="https://apidog.com/id/blog/rest-vs-graphql-vs-grpc-which-api-protocol?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST vs GraphQL vs gRPC&lt;/a&gt; dan ringkasan &lt;a href="https://apidog.com/id/blog/graphql-testing-mocking-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat pengujian dan mocking GraphQL&lt;/a&gt;. Jika stack Anda juga menggunakan SOAP, pola request dan assertion yang sama dapat diterapkan melalui panduan &lt;a href="https://apidog.com/id/blog/how-to-test-soap-apis-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menguji API SOAP di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan alur kerja dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Setelah skenario berada dalam proyek, Anda dapat menjalankan skenario pengujian yang tersimpan dari terminal atau CI runner menggunakan Apidog CLI.&lt;/p&gt;

&lt;p&gt;Instal CLI dan login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;your-token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian jalankan skenario berdasarkan ID dan environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang digunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID skenario pengujian;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporter, misalnya &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk memakai lebih dari satu reporter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; html,cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI menjalankan skenario dan test suite yang disimpan di proyek cloud, lalu melaporkan hasil lulus atau gagal. Ini membuatnya sesuai untuk integrasi build dan pipeline.&lt;/p&gt;

&lt;p&gt;Namun, dokumentasi CLI mengonfirmasi eksekusi skenario HTTP dan tidak secara eksplisit menyatakan apakah skenario dengan langkah GraphQL dapat berjalan tanpa kepala. Gunakan CLI untuk regresi HTTP dan sinkronisasi spesifikasi melalui perintah &lt;code&gt;import&lt;/code&gt; untuk OpenAPI, HAR, Postman, dan format lainnya. Untuk pekerjaan query, mutation, dan assertion GraphQL, gunakan aplikasi Apidog.&lt;/p&gt;

&lt;p&gt;Baca &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan instalasi Apidog CLI&lt;/a&gt; untuk setup token dan &lt;a href="https://apidog.com/id/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI dalam pipeline GitHub Actions&lt;/a&gt; untuk integrasi CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apakah saya memerlukan paket berbayar untuk menguji GraphQL di Apidog?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dokumen request GraphQL tidak membatasi fitur ini pada paket tertentu dan tidak membedakan dukungan cloud maupun self-hosted. Anda dapat mulai dari paket gratis tanpa kartu kredit. Lihat &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk detail paket terbaru.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mengapa request GraphQL mengembalikan 200 tetapi tetap gagal?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Itu adalah perilaku normal GraphQL. Transport HTTP berhasil sehingga server mengembalikan status 200, tetapi operasi dapat gagal karena validasi atau kesalahan bisnis. Selalu assert bahwa &lt;code&gt;errors&lt;/code&gt; tidak ada, selain memeriksa status HTTP. Lihat panduan &lt;a href="https://apidog.com/id/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;penegasan API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bagaimana cara mendapatkan saran bidang saat menulis kueri?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Klik &lt;code&gt;Fetch Schema&lt;/code&gt; di editor GraphQL. Apidog akan mengintrospeksi endpoint dan mengaktifkan pelengkapan kode untuk bidang dan tipe yang valid. Jalankan kembali pengambilan skema setelah skema API berubah.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Di mana tab khusus untuk mutation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tidak ada tab terpisah. Tulis mutasi pada kotak &lt;code&gt;Query&lt;/code&gt; yang sama menggunakan keyword &lt;code&gt;mutation&lt;/code&gt;, lalu kirim payload melalui variables dan klik &lt;code&gt;Send&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bagaimana cara mengganti nilai tanpa menulis ulang kueri?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gunakan variabel GraphQL. Deklarasikan variabel dengan prefiks &lt;code&gt;$&lt;/code&gt; pada signature operasi, lalu masukkan nilainya sebagai object JSON. Sintaks ini mengikuti &lt;a href="https://graphql.org/learn/queries/#variables" rel="noopener noreferrer"&gt;spesifikasi variables GraphQL&lt;/a&gt; dan dapat dipadukan dengan environment variables Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Pengujian GraphQL yang efektif bergantung pada beberapa kebiasaan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tulis operasi pada editor &lt;code&gt;Query&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;ambil skema agar editor dapat memberi saran bidang valid;&lt;/li&gt;
&lt;li&gt;gunakan variables untuk data yang berubah;&lt;/li&gt;
&lt;li&gt;periksa &lt;code&gt;errors&lt;/code&gt;, bukan hanya status HTTP;&lt;/li&gt;
&lt;li&gt;tambahkan assertion pada nilai di bawah &lt;code&gt;data&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;rangkai query dan mutation ke dalam skenario pengujian.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mulai dengan &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt;, buat alur query pengguna dan pembuatan pesanan, lalu simpan sebagai tes regresi yang dapat dijalankan kembali setiap kali skema berubah.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menguji Layanan Web SOAP dan WSDL di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 05:35:22 +0000</pubDate>
      <link>https://dev.to/walse/cara-menguji-layanan-web-soap-dan-wsdl-di-apidog-1m42</link>
      <guid>https://dev.to/walse/cara-menguji-layanan-web-soap-dan-wsdl-di-apidog-1m42</guid>
      <description>&lt;p&gt;Anda menerima endpoint SOAP—misalnya konverter mata uang lama untuk tim penagihan atau layanan manajemen pesanan dari mitra .NET. Anda perlu memanggilnya, memverifikasi responsnya sesuai kontrak, dan menjalankan pengujian berulang saat kode di sekitarnya berubah. Tidak seperti REST, SOAP memerlukan amplop XML lengkap, &lt;code&gt;Content-Type&lt;/code&gt; yang tepat, serta WSDL yang mendefinisikan operasi dan parameternya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mendukung SOAP dan WebService bersama REST, GraphQL, serta gRPC dalam satu workspace. Artikel ini membahas dua cara kerja: mengirim permintaan SOAP secara manual dan mengimpor WSDL agar endpoint serta environment dibuat dari kontrak layanan. Untuk konteks protokol, lihat perbandingan &lt;a href="https://apidog.com/id/blog/rest-vs-graphql-vs-grpc-vs-soap?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;REST, GraphQL, gRPC, dan SOAP&lt;/a&gt;. Untuk struktur amplop formal, gunakan &lt;a href="https://www.w3.org/TR/soap/" rel="noopener noreferrer"&gt;spesifikasi W3C SOAP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu SOAP, dan mengapa penanganannya berbeda?
&lt;/h2&gt;

&lt;p&gt;SOAP (&lt;em&gt;Simple Object Access Protocol&lt;/em&gt;) adalah protokol komunikasi berbasis XML yang memungkinkan sistem dari platform dan bahasa berbeda saling berkomunikasi melalui kontrak yang sama. Contohnya, klien Java dapat berkomunikasi dengan layanan .NET tanpa mengetahui implementasi internal masing-masing.&lt;/p&gt;

&lt;p&gt;Saat menguji SOAP, perhatikan tiga hal berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Format pesan adalah XML.&lt;/strong&gt; Permintaan dan respons berupa dokumen XML terstruktur, bukan JSON. Jika Anda belum familiar dengan XML, gunakan &lt;a href="https://developer.mozilla.org/en-US/docs/Web/XML" rel="noopener noreferrer"&gt;referensi XML MDN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transport biasanya HTTP atau HTTPS.&lt;/strong&gt; SOAP dapat menggunakan transport lain, tetapi HTTP/HTTPS adalah yang paling umum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kontraknya ketat.&lt;/strong&gt; Struktur amplop, namespace, nama operasi, dan parameter harus cocok dengan definisi layanan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Karena itu, Anda tidak dapat mengirim permintaan REST biasa ke endpoint SOAP. Anda memerlukan header yang benar, body XML di dalam amplop SOAP, serta validasi terhadap XML respons. Untuk memahami struktur amplop lebih lanjut, lihat &lt;a href="https://apidog.com/id/blog/soap-api-xml?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;API SOAP dan XML&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sebelum memulai
&lt;/h2&gt;

&lt;p&gt;Untuk mengirim permintaan SOAP atau WebService, gunakan Apidog versi &lt;strong&gt;2.1.31 atau lebih baru&lt;/strong&gt;. Periksa versi aplikasi Anda dan lakukan pembaruan bila diperlukan.&lt;/p&gt;

&lt;p&gt;Siapkan juga informasi berikut dari layanan target:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL endpoint&lt;/li&gt;
&lt;li&gt;Nama operasi SOAP&lt;/li&gt;
&lt;li&gt;Parameter operasi&lt;/li&gt;
&lt;li&gt;File WSDL, jika tersedia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simpan file &lt;a href="https://www.w3.org/TR/wsdl20/" rel="noopener noreferrer"&gt;WSDL&lt;/a&gt; di lokasi yang mudah diakses karena Anda dapat mengimpornya langsung ke Apidog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jalur A: Kirim permintaan SOAP secara manual
&lt;/h2&gt;

&lt;p&gt;Pilih jalur ini jika Anda sudah mengetahui URL endpoint dan operasi yang akan dipanggil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: Atur header &lt;code&gt;Content-Type&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;SOAP tidak secara otomatis menentukan &lt;code&gt;Content-Type&lt;/code&gt;. Tambahkan header berikut secara manual di tab &lt;strong&gt;Headers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: text/xml; charset=utf-8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;atau:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: application/soap+xml
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan panduan berikut:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Versi SOAP&lt;/th&gt;
&lt;th&gt;Content-Type umum&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SOAP 1.1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;text/xml; charset=utf-8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOAP 1.2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application/soap+xml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Periksa WSDL atau dokumentasi layanan untuk memastikan nilai yang benar. Jika server mengembalikan kesalahan tipe konten, coba nilai yang sesuai dengan versi SOAP lainnya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: Atur body ke &lt;code&gt;xml&lt;/code&gt; dan masukkan amplop SOAP
&lt;/h3&gt;

&lt;p&gt;Pada bagian &lt;strong&gt;Body&lt;/strong&gt;, pilih format &lt;code&gt;xml&lt;/code&gt;. Kemudian masukkan amplop SOAP yang berisi operasi dan parameternya.&lt;/p&gt;

&lt;p&gt;Contoh berikut memanggil operasi &lt;code&gt;NumberToWords&lt;/code&gt; pada layanan publik &lt;em&gt;number-to-words&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;soap:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soap=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;
               &lt;span class="na"&gt;xmlns:web=&lt;/span&gt;&lt;span class="s"&gt;"http://www.dataaccess.com/webservicesserver/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;soap:Body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;web:NumberToWords&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;web:ubiNum&amp;gt;&lt;/span&gt;1234&lt;span class="nt"&gt;&amp;lt;/web:ubiNum&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/web:NumberToWords&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/soap:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Struktur pentingnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;soap:Envelope&lt;/code&gt;: pembungkus seluruh pesan SOAP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;soap:Body&lt;/code&gt;: tempat operasi SOAP ditulis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web:NumberToWords&lt;/code&gt;: nama operasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web:ubiNum&lt;/code&gt;: parameter input.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xmlns:web&lt;/code&gt;: namespace operasi yang harus sesuai dengan kontrak layanan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jangan menebak namespace. Ambil nilai namespace, nama operasi, dan parameter langsung dari WSDL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 3: Kirim dan verifikasi respons XML
&lt;/h3&gt;

&lt;p&gt;Kirim permintaan. Respons SOAP juga berbentuk amplop XML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;soap:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soap=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;soap:Body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;m:NumberToWordsResponse&lt;/span&gt; &lt;span class="na"&gt;xmlns:m=&lt;/span&gt;&lt;span class="s"&gt;"http://www.dataaccess.com/webservicesserver/"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;m:NumberToWordsResult&amp;gt;&lt;/span&gt;one thousand two hundred and thirty four&lt;span class="nt"&gt;&amp;lt;/m:NumberToWordsResult&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/m:NumberToWordsResponse&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/soap:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifikasi setidaknya tiga hal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Respons memiliki elemen &lt;code&gt;soap:Envelope&lt;/code&gt; dan &lt;code&gt;soap:Body&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Operasi respons tersedia, misalnya &lt;code&gt;NumberToWordsResponse&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Nilai hasil, misalnya &lt;code&gt;NumberToWordsResult&lt;/code&gt;, sesuai dengan ekspektasi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk referensi konfigurasi dan contoh amplop tambahan, lihat &lt;a href="https://webservice.apidog.io/" rel="noopener noreferrer"&gt;webservice.apidog.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pola ini dapat diterapkan ke layanan lain. Contohnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ConvertCurrency&lt;/code&gt; dengan parameter &lt;code&gt;fromCurrency&lt;/code&gt;, &lt;code&gt;toCurrency&lt;/code&gt;, dan &lt;code&gt;amount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GetOrderStatus&lt;/code&gt; dengan parameter &lt;code&gt;orderId&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alurnya tetap sama:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Atur header.&lt;/li&gt;
&lt;li&gt;Masukkan amplop XML.&lt;/li&gt;
&lt;li&gt;Kirim permintaan.&lt;/li&gt;
&lt;li&gt;Validasi amplop respons dan nilai hasil.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Jalur B: Impor WSDL untuk menghasilkan endpoint
&lt;/h2&gt;

&lt;p&gt;Menulis amplop secara manual cocok untuk satu atau dua operasi. Jika layanan memiliki banyak operasi, impor WSDL agar Apidog membaca kontrak layanan dan membuat endpoint secara otomatis.&lt;/p&gt;

&lt;p&gt;WSDL mendefinisikan operasi, input, output, dan alamat layanan. Ikuti langkah berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka &lt;strong&gt;Settings&lt;/strong&gt; lalu &lt;strong&gt;Import Data&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;WSDL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Unggah file &lt;code&gt;.wsdl&lt;/code&gt; atau &lt;code&gt;.xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tinjau pratinjau endpoint API yang diurai dari file.&lt;/li&gt;
&lt;li&gt;Buka tab &lt;strong&gt;Environments&lt;/strong&gt; dan verifikasi alamat layanan.&lt;/li&gt;
&lt;li&gt;Klik &lt;strong&gt;Konfirmasi&lt;/strong&gt; untuk membuat environment hasil impor.&lt;/li&gt;
&lt;li&gt;Pilih environment yang diimpor dari sudut kanan atas.&lt;/li&gt;
&lt;li&gt;Kirim permintaan ke endpoint yang dihasilkan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dua langkah yang paling penting adalah memverifikasi environment dan memilih environment aktif.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifikasi alamat layanan sebelum konfirmasi
&lt;/h3&gt;

&lt;p&gt;Alamat layanan di WSDL menjadi endpoint dasar untuk permintaan yang diimpor. Jika WSDL masih menunjuk ke staging, localhost, atau URL placeholder, semua permintaan akan dikirim ke server yang salah.&lt;/p&gt;

&lt;p&gt;Sebelum mengklik &lt;strong&gt;Konfirmasi&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buka tab &lt;strong&gt;Environments&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Periksa Base URL.&lt;/li&gt;
&lt;li&gt;Ganti alamatnya jika diperlukan.&lt;/li&gt;
&lt;li&gt;Baru konfirmasi impor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aktifkan environment yang diimpor
&lt;/h3&gt;

&lt;p&gt;Setelah impor selesai, pilih environment tersebut dari pemilih environment di sudut kanan atas. Base URL endpoint hasil impor bergantung pada environment ini.&lt;/p&gt;

&lt;p&gt;Jika environment tidak aktif, permintaan dapat gagal karena tidak memiliki alamat dasar yang benar.&lt;/p&gt;

&lt;p&gt;Setelah WSDL diimpor, Anda dapat mengirim setiap operasi tanpa menulis amplop dari awal. Tetap tambahkan validasi terhadap respons XML seperti pada Jalur A. Jika Anda memigrasikan proyek dari alat lain, baca panduan &lt;a href="https://apidog.com/id/blog/import-soap-projects?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengimpor proyek SOAP&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Impor WSDL yang didokumentasikan mendukung unggahan file &lt;code&gt;.wsdl&lt;/code&gt; dan &lt;code&gt;.xml&lt;/code&gt;. Impor melalui URL atau menempelkan isi WSDL tidak didokumentasikan, jadi gunakan file lokal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Beralih dari SoapUI
&lt;/h2&gt;

&lt;p&gt;Jika pengujian SOAP Anda saat ini ada di SoapUI, Anda tidak perlu membuat ulang semua operasi dari nol.&lt;/p&gt;

&lt;p&gt;Alur migrasinya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ekspor atau simpan file WSDL dari proyek SoapUI.&lt;/li&gt;
&lt;li&gt;Impor file tersebut melalui jalur WSDL di Apidog.&lt;/li&gt;
&lt;li&gt;Periksa environment dan Base URL.&lt;/li&gt;
&lt;li&gt;Jalankan operasi yang dihasilkan.&lt;/li&gt;
&lt;li&gt;Tambahkan atau pindahkan skenario pengujian sesuai kebutuhan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan pendekatan ini, layanan SOAP, endpoint REST, dokumentasi, mocking, dan skenario pengujian dapat berada dalam satu workspace. Untuk detail perbedaannya, lihat &lt;a href="https://apidog.com/id/blog/apidog-vs-soapui?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog versus SoapUI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tambahkan penegasan pada respons SOAP
&lt;/h2&gt;

&lt;p&gt;Permintaan yang berhasil hanya membuktikan bahwa endpoint dapat dihubungi. Pengujian yang baik juga membuktikan bahwa respons tetap memenuhi kontrak.&lt;/p&gt;

&lt;p&gt;Tambahkan penegasan untuk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memastikan node operasi respons ada.&lt;/li&gt;
&lt;li&gt;Mengekstrak elemen hasil.&lt;/li&gt;
&lt;li&gt;Memverifikasi nilai hasil terhadap aturan bisnis.&lt;/li&gt;
&lt;li&gt;Memastikan struktur XML tidak berubah secara tak terduga.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh aturan validasi:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layanan&lt;/th&gt;
&lt;th&gt;Validasi yang dapat diterapkan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Konversi mata uang&lt;/td&gt;
&lt;td&gt;Nilai hasil berupa angka dan berada dalam rentang yang masuk akal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status pesanan&lt;/td&gt;
&lt;td&gt;Nilai status termasuk dalam daftar status yang diizinkan.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data pelanggan&lt;/td&gt;
&lt;td&gt;Node pelanggan wajib tersedia dan memiliki ID yang valid.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Selanjutnya, rangkai panggilan dalam skenario pengujian. Misalnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat pesanan.&lt;/li&gt;
&lt;li&gt;Simpan ID pesanan dari respons.&lt;/li&gt;
&lt;li&gt;Panggil &lt;code&gt;GetOrderStatus&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Kirim ID pesanan yang diekstrak ke langkah berikutnya.&lt;/li&gt;
&lt;li&gt;Validasi status pesanan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Panduan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;menulis skenario pengujian dengan Apidog&lt;/a&gt; menunjukkan cara meneruskan nilai antarpermintaan. Pola ini tidak bergantung pada protokol, sehingga satu skenario dapat menggabungkan SOAP dan REST.&lt;/p&gt;

&lt;h2&gt;
  
  
  Menangani endpoint SOAP dengan WS-Security
&lt;/h2&gt;

&lt;p&gt;Layanan SOAP yang aman sering menggunakan WS-Security untuk autentikasi dan pengiriman pesan terenkripsi. Dalam SOAP, informasi keamanan biasanya ditambahkan ke bagian header amplop.&lt;/p&gt;

&lt;p&gt;Struktur umumnya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;soap:Envelope&lt;/span&gt; &lt;span class="na"&gt;xmlns:soap=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.xmlsoap.org/soap/envelope/"&lt;/span&gt;
               &lt;span class="na"&gt;xmlns:wsse=&lt;/span&gt;&lt;span class="s"&gt;"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;soap:Header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;wsse:Security&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Header keamanan sesuai kebutuhan layanan --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/wsse:Security&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/soap:Header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;soap:Body&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- Operasi SOAP --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/soap:Body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mekanisme pengirimannya tidak berubah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Atur &lt;code&gt;Content-Type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan body &lt;code&gt;xml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sertakan header keamanan dalam amplop SOAP.&lt;/li&gt;
&lt;li&gt;Kirim dan validasi respons.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Gunakan struktur dan nilai WS-Security yang diwajibkan oleh dokumentasi layanan Anda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan alur kerja dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Setelah permintaan atau hasil impor WSDL disimpan sebagai skenario pengujian, Anda dapat menjalankannya dari command line dengan &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instal CLI menggunakan Node.js v16 atau lebih baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario tersimpan pada environment tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang digunakan:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID skenario pengujian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reporter: &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anda dapat menentukan beberapa reporter dengan pemisah koma.&lt;/p&gt;

&lt;p&gt;Dokumentasi mengonfirmasi bahwa runner dapat menjalankan skenario dan suite pengujian yang disimpan. Namun, dokumentasi tersebut tidak secara eksplisit menyatakan apakah skenario dengan langkah SOAP berjalan secara headless. Gunakan CLI untuk menjalankan skenario HTTP proyek dan integrasikan validasi yang relevan ke CI. Untuk pipeline, lihat &lt;a href="https://apidog.com/id/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan CI/CD Apidog CLI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Content-Type mana yang digunakan untuk SOAP?
&lt;/h3&gt;

&lt;p&gt;Gunakan salah satu dari berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;text/xml; charset=utf-8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;application/soap+xml
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SOAP 1.1 umumnya menggunakan &lt;code&gt;text/xml; charset=utf-8&lt;/code&gt;, sedangkan SOAP 1.2 umumnya menggunakan &lt;code&gt;application/soap+xml&lt;/code&gt;. Periksa WSDL atau dokumentasi layanan jika tidak yakin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah pengujian SOAP memerlukan paket berbayar?
&lt;/h3&gt;

&lt;p&gt;Persyaratan yang didokumentasikan adalah Apidog versi 2.1.31 atau lebih baru. Tidak disebutkan pembatasan tingkatan atau batasan self-hosted khusus untuk dukungan SOAP dan WSDL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah WSDL diimpor dari URL?
&lt;/h3&gt;

&lt;p&gt;Impor WSDL yang didokumentasikan menerima unggahan file &lt;code&gt;.wsdl&lt;/code&gt; dan &lt;code&gt;.xml&lt;/code&gt;. Impor melalui URL atau menempelkan isi WSDL tidak didokumentasikan, jadi unggah file WSDL secara langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana menguji SOAP dan REST dalam proyek yang sama?
&lt;/h3&gt;

&lt;p&gt;Gunakan satu workspace untuk operasi SOAP, endpoint REST, dan permintaan GraphQL. Anda juga dapat merangkai semuanya dalam satu skenario pengujian. Untuk GraphQL, lihat panduan &lt;a href="https://apidog.com/id/blog/how-to-test-graphql-apis-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pengujian API GraphQL di Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa endpoint hasil impor WSDL mengarah ke server yang salah?
&lt;/h3&gt;

&lt;p&gt;Periksa dua hal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Alamat layanan di tab &lt;strong&gt;Environments&lt;/strong&gt; mungkin salah saat impor.&lt;/li&gt;
&lt;li&gt;Environment hasil impor mungkin belum dipilih sebagai environment aktif.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verifikasi Base URL sebelum konfirmasi impor, lalu pastikan environment yang benar dipilih sebelum mengirim permintaan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Pengujian SOAP tidak harus bergantung pada alat terpisah. Dengan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, Anda dapat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengirim amplop SOAP secara manual dengan header dan body XML yang benar.&lt;/li&gt;
&lt;li&gt;Mengimpor WSDL untuk membuat endpoint serta environment otomatis.&lt;/li&gt;
&lt;li&gt;Menambahkan penegasan respons XML.&lt;/li&gt;
&lt;li&gt;Merangkai operasi SOAP dalam skenario pengujian.&lt;/li&gt;
&lt;li&gt;Menjalankan skenario tersimpan dari command line melalui CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog versi 2.1.31 atau lebih baru&lt;/a&gt;, impor WSDL Anda, lalu uji layanan SOAP lama dengan alur validasi yang sama seperti API lain di proyek Anda.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Impor File HAR ke Apidog: Ubah Traffic Jadi Endpoint</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Thu, 16 Jul 2026 05:23:17 +0000</pubDate>
      <link>https://dev.to/walse/cara-impor-file-har-ke-apidog-ubah-traffic-jadi-endpoint-133l</link>
      <guid>https://dev.to/walse/cara-impor-file-har-ke-apidog-ubah-traffic-jadi-endpoint-133l</guid>
      <description>&lt;p&gt;Anda melihat aplikasi membuat permintaan di browser dan responsnya muncul di tab &lt;strong&gt;Network&lt;/strong&gt;. Langkah berikutnya adalah mengubah traffic tersebut menjadi endpoint terdokumentasi yang dapat disimpan, disimulasikan, dan diuji—tanpa mengetik ulang URL, header, atau body JSON secara manual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;File HAR menjembatani traffic yang bisa dilihat dengan endpoint yang bisa digunakan ulang. Browser merekam permintaan dan respons selama sesi berjalan; ekspor rekaman tersebut, lalu impor ke &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; untuk mengubah panggilan yang terekam menjadi endpoint di proyek Anda. Untuk konteks lebih luas, lihat panduan &lt;a href="https://apidog.com/id/blog/packet-capture-tools-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alat penangkap paket dengan Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anda dapat &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;mengunduh Apidog&lt;/a&gt; secara gratis dan mengikuti langkah-langkah berikut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu file HAR dan mengapa traffic yang terekam perlu disimpan
&lt;/h2&gt;

&lt;p&gt;HAR adalah singkatan dari &lt;strong&gt;HTTP Archive&lt;/strong&gt;. File &lt;code&gt;.har&lt;/code&gt; berformat JSON dan mencatat interaksi browser dengan situs, termasuk permintaan, respons, header, body, serta data waktu.&lt;/p&gt;

&lt;p&gt;Secara praktis, HAR adalah transkrip sesi browser. Karena formatnya JSON, file ini dapat dibagikan untuk laporan bug, dianalisis, atau diimpor ke tool API.&lt;/p&gt;

&lt;p&gt;Mengimpor HAR memberi Anda titik awal berbasis traffic nyata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bentuk permintaan aktual&lt;/strong&gt;: URL, query parameter, header, dan body yang benar-benar dikirim aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respons aktual&lt;/strong&gt;: status code dan payload yang dapat digunakan sebagai contoh, mock, atau asersi pengujian.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dokumentasi awal&lt;/strong&gt;: endpoint internal yang belum terdokumentasi dapat diubah menjadi koleksi endpoint yang bisa diberi nama dan anotasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alur ini berguna ketika Anda mewarisi layanan tanpa &lt;a href="https://www.openapis.org/" rel="noopener noreferrer"&gt;spesifikasi OpenAPI&lt;/a&gt;, ingin memahami komunikasi widget pihak ketiga dengan backend, atau perlu mereproduksi bug menggunakan permintaan yang sama persis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 1: Rekam HAR di DevTools browser
&lt;/h2&gt;

&lt;p&gt;Perekaman dilakukan di browser, bukan di Apidog. Chrome dan Edge menggunakan alur DevTools yang serupa.&lt;/p&gt;

&lt;p&gt;Misalnya, Anda ingin merekam traffic pada halaman riwayat pesanan.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka halaman yang ingin direkam. Login terlebih dahulu jika API membutuhkan sesi autentikasi.&lt;/li&gt;
&lt;li&gt;Buka Developer Tools:

&lt;ul&gt;
&lt;li&gt;Windows/Linux: &lt;code&gt;F12&lt;/code&gt; atau &lt;code&gt;Ctrl+Shift+I&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;macOS: &lt;code&gt;Cmd+Opt+I&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Buka tab &lt;strong&gt;Network&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Refresh halaman atau lakukan aksi yang ingin direkam.

&lt;ul&gt;
&lt;li&gt;Contoh: membuka riwayat pesanan dapat memanggil &lt;code&gt;/api/orders&lt;/code&gt;, &lt;code&gt;/api/orders/{id}&lt;/code&gt;, dan endpoint terkait lainnya.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Klik kanan pada salah satu request, lalu pilih &lt;strong&gt;Save all as HAR with content&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Simpan file, misalnya &lt;code&gt;order-history.har&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk detail menu dan alur ekspor, lihat &lt;a href="https://developer.chrome.com/docs/devtools/network" rel="noopener noreferrer"&gt;dokumentasi Chrome DevTools Network&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gunakan opsi &lt;strong&gt;with content&lt;/strong&gt;. Opsi ini menyertakan body respons. Tanpanya, hasil impor dapat memiliki detail request tetapi tidak memiliki contoh respons.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sebelum melanjutkan, Anda dapat membuka file &lt;code&gt;.har&lt;/code&gt; di editor teks. File tersebut berisi JSON dengan array &lt;code&gt;entries&lt;/code&gt;; setiap entri biasanya memiliki objek &lt;code&gt;request&lt;/code&gt; dan &lt;code&gt;response&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Perlu diingat: HAR juga merekam aset halaman seperti gambar, stylesheet, dan JavaScript. Anda tidak perlu memfilter semuanya di browser karena Apidog menyediakan opsi untuk mengecualikan sumber daya statis saat impor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 2: Impor HAR ke Apidog
&lt;/h2&gt;

&lt;p&gt;Setelah file HAR tersimpan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka proyek di Apidog.&lt;/li&gt;
&lt;li&gt;Masuk ke &lt;strong&gt;Settings &amp;gt; Import Data &amp;gt; Manual&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih format &lt;strong&gt;HAR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Unggah file &lt;code&gt;.har&lt;/code&gt;, misalnya &lt;code&gt;order-history.har&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sebelum mengonfirmasi impor, atur tiga opsi berikut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opsi 1: Penanganan BaseURL
&lt;/h3&gt;

&lt;p&gt;Setiap request HAR memiliki URL lengkap, misalnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.shop.example.com/v1/orders/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog menyediakan dua pilihan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardcode&lt;/strong&gt;: mempertahankan BaseURL di setiap endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hapus (Direkomendasikan)&lt;/strong&gt;: menghapus BaseURL sehingga path menjadi:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/v1/orders/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pilih &lt;strong&gt;Hapus&lt;/strong&gt; pada sebagian besar kasus. BaseURL kemudian dapat &lt;a href="https://apidog.com/id/blog/how-to-migrate-swagger-apis-documentation-to-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;dikelola secara global melalui variabel lingkungan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dengan pendekatan ini, endpoint yang sama dapat diarahkan ke production, staging, atau local environment tanpa mengubah path endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opsi 2: Kecualikan sumber daya statis
&lt;/h3&gt;

&lt;p&gt;Aktifkan &lt;strong&gt;Sumber Daya Statis &amp;gt; Kecualikan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Opsi ini mengabaikan file seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gambar&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;aset halaman lain yang bukan endpoint API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tanpa filter ini, satu page load dapat menghasilkan puluhan endpoint yang tidak relevan, misalnya &lt;code&gt;logo.png&lt;/code&gt; atau bundle JavaScript. Dengan filter aktif, hasil impor lebih fokus pada request API seperti &lt;code&gt;/api/orders&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opsi 3: Buat kasus uji untuk setiap endpoint
&lt;/h3&gt;

&lt;p&gt;Aktifkan &lt;strong&gt;Pembuatan Kasus Endpoint&lt;/strong&gt; jika Anda ingin Apidog membuat kasus uji default untuk setiap endpoint hasil impor.&lt;/p&gt;

&lt;p&gt;Kasus uji ini menyimpan invokasi endpoint beserta nilai yang terekam. Aktifkan opsi ini jika Anda ingin segera menjalankan atau mengembangkan pengujian dari hasil capture. Jika fokus Anda hanya dokumentasi, opsi ini dapat dimatikan dan kasus uji ditambahkan nanti.&lt;/p&gt;

&lt;p&gt;Setelah konfigurasi selesai, konfirmasi impor. Apidog akan membaca file HAR dan membuat endpoint di proyek Anda.&lt;/p&gt;

&lt;p&gt;Contoh endpoint hasil impor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/orders/123
Host: api.shop.example.com
Authorization: Bearer &amp;lt;token-from-capture&amp;gt;
Accept: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh respons yang ikut terekam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;48.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TSHIRT-BLK-M"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"qty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;19.25&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-14T09:31:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Respons nyata seperti ini dapat digunakan sebagai dasar simulasi atau asersi pengujian.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah 3: Bersihkan endpoint hasil impor
&lt;/h2&gt;

&lt;p&gt;Impor HAR adalah titik awal, bukan definisi API final. Luangkan waktu untuk merapikan hasilnya.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hapus request yang tidak relevan&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Meski sumber daya statis sudah dikecualikan, Anda mungkin masih menemukan analytics ping, health check, atau request pihak ketiga. Hapus yang tidak dibutuhkan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ganti nama dan kelompokkan endpoint&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Path mentah seperti &lt;code&gt;/v1/orders/123&lt;/code&gt; memang berfungsi, tetapi kurang jelas. Ubah namanya menjadi, misalnya, &lt;strong&gt;Dapatkan pesanan berdasarkan ID&lt;/strong&gt;, lalu kelompokkan endpoint ke folder yang sesuai.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ubah nilai literal menjadi parameter path&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Request hasil capture:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /v1/orders/123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sebaiknya diubah menjadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  /v1/orders/{orderId}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan begitu, endpoint dapat digunakan ulang untuk ID pesanan lain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pindahkan rahasia ke environment variable&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
HAR dapat membawa bearer token, cookie, dan header autentikasi aktif. Sebelum membagikan proyek, pindahkan nilai tersebut ke variabel lingkungan dan hapus kredensial dari contoh request. Prinsip ini sejalan dengan panduan &lt;a href="https://docs.stripe.com/keys" rel="noopener noreferrer"&gt;Stripe tentang pengelolaan API key&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Periksa body request dan response&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jika body kosong padahal seharusnya ada, kemungkinan file diekspor tanpa opsi &lt;strong&gt;Save all as HAR with content&lt;/strong&gt;. Rekam ulang dan impor kembali.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setelah dibersihkan, endpoint hasil impor dapat didokumentasikan, disimulasikan, dan diuji seperti endpoint lain di Apidog. Lanjutkan dengan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan menulis skenario pengujian di Apidog&lt;/a&gt; atau &lt;a href="https://apidog.com/id/blog/how-to-generate-client-code-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menghasilkan kode klien dengan Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variasi dan batasan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Belum ada perekam endpoint otomatis
&lt;/h3&gt;

&lt;p&gt;Apidog tidak berjalan sebagai proxy yang merekam traffic browser secara langsung. Alur yang didukung adalah:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rekam traffic dengan DevTools browser.&lt;/li&gt;
&lt;li&gt;Ekspor file HAR.&lt;/li&gt;
&lt;li&gt;Impor HAR ke Apidog.&lt;/li&gt;
&lt;li&gt;Rapikan endpoint dan buat skenario pengujian bila diperlukan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jadi, prosesnya adalah perekaman manual di browser yang diikuti impor, bukan perekaman live otomatis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ekstensi Browser Apidog adalah tool yang berbeda
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apidog.com/id/blog/packet-capture-tools-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Ekstensi Browser Apidog&lt;/a&gt; tidak digunakan untuk merekam HAR. Ekstensi tersebut memungkinkan pengujian dan debugging API dari browser tanpa membuka klien desktop.&lt;/p&gt;

&lt;p&gt;Untuk merekam traffic yang akan diimpor, tetap gunakan DevTools dan ekspor HAR.&lt;/p&gt;

&lt;p&gt;Saat menggunakan ekstensi browser untuk testing, browser dapat membatasi header tertentu seperti &lt;code&gt;Cookie&lt;/code&gt;, &lt;code&gt;Host&lt;/code&gt;, &lt;code&gt;Origin&lt;/code&gt;, dan &lt;code&gt;Content-Length&lt;/code&gt;. Browser juga tidak mengirim body pada request &lt;code&gt;GET&lt;/code&gt; atau &lt;code&gt;HEAD&lt;/code&gt;, serta tidak dapat menjangkau kode atau database lokal di balik mesin Anda. Untuk kebutuhan debugging dengan kontrol header lebih penuh, gunakan Klien Desktop Apidog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Format lain juga dapat diimpor
&lt;/h3&gt;

&lt;p&gt;Layar &lt;strong&gt;Settings &amp;gt; Import Data &amp;gt; Manual&lt;/strong&gt; juga mendukung format lain seperti OpenAPI, Swagger, Postman, WSDL, dan Insomnia.&lt;/p&gt;

&lt;p&gt;Jika Anda sudah memiliki spesifikasi OpenAPI atau Swagger, impor spesifikasi biasanya menghasilkan endpoint yang lebih rapi daripada capture HAR. Lihat panduan berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/how-to-migrate-swagger-apis-documentation-to-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Migrasi dokumentasi API Swagger ke Apidog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/migrate-postman-enviornments-collection-to-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Migrasi environment dan collection Postman ke Apidog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan HAR saat spesifikasi tidak tersedia dan traffic browser adalah sumber informasi terbaik yang Anda miliki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan impor dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Untuk workflow berbasis skrip atau pipeline, Anda tidak harus mengimpor HAR melalui GUI. &lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI&lt;/a&gt; menyediakan perintah &lt;code&gt;import&lt;/code&gt; untuk membaca HAR secara langsung.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;

&lt;span class="c"&gt;# Turn a captured HAR into endpoints in your project&lt;/span&gt;
apidog import &lt;span class="nt"&gt;--project&lt;/span&gt; &amp;lt;PROJECT_ID&amp;gt; &lt;span class="nt"&gt;--format&lt;/span&gt; har &lt;span class="nt"&gt;--file&lt;/span&gt; ./capture.har
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flag &lt;code&gt;--format&lt;/code&gt; juga mendukung &lt;code&gt;openapi&lt;/code&gt;, &lt;code&gt;postman&lt;/code&gt;, &lt;code&gt;wsdl&lt;/code&gt;, &lt;code&gt;insomnia&lt;/code&gt;, dan format lainnya.&lt;/p&gt;

&lt;p&gt;Setelah endpoint disimpan sebagai skenario pengujian, jalankan skenario tersebut di CI tanpa antarmuka grafis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;SCENARIO_ID&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;ENV_ID&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keterangan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID skenario pengujian&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r cli&lt;/code&gt;: output reporter di terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk menyusun pengujian, gunakan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan skenario pengujian Apidog&lt;/a&gt;, lalu integrasikan ke pipeline melalui &lt;a href="https://apidog.com/id/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;panduan Apidog CLI CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Browser apa yang dapat mengekspor file HAR?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Browser berbasis Chromium seperti Chrome dan Edge mendukung ekspor HAR dari tab &lt;strong&gt;Network&lt;/strong&gt; melalui menu &lt;strong&gt;Save all as HAR with content&lt;/strong&gt;. Browser lain dapat memiliki label menu yang berbeda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mengapa daftar endpoint hasil impor sangat besar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kemungkinan sumber daya statis ikut diimpor. Impor ulang file HAR dengan opsi &lt;strong&gt;Sumber Daya Statis&lt;/strong&gt; diatur ke &lt;strong&gt;Kecualikan&lt;/strong&gt;, lalu hapus request sisa yang tidak relevan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Haruskah memilih Hardcode atau Hapus untuk BaseURL?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pilih &lt;strong&gt;Hapus (Direkomendasikan)&lt;/strong&gt; pada hampir semua kasus. Dengan opsi ini, BaseURL dikelola melalui environment variable sehingga endpoint dapat digunakan di production, staging, maupun local environment tanpa mengedit path. Pendekatan yang sama digunakan oleh &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;skenario pengujian Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apakah HAR menyertakan token autentikasi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ya. HAR merekam header aktual selama sesi browser, termasuk bearer token atau cookie aktif. Perlakukan file HAR sebagai data sensitif: jangan unggah ke issue publik, dan pindahkan kredensial ke environment variable setelah impor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bisakah HAR diimpor dari command line?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ya. Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog import &lt;span class="nt"&gt;--project&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; har &lt;span class="nt"&gt;--file&lt;/span&gt; &amp;lt;path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI cocok untuk impor berbasis skrip, server, pipeline CI, atau workflow agen. GUI tetap berguna saat Anda ingin mengatur BaseURL dan filter sumber daya statis secara interaktif. Setelah impor, gunakan &lt;code&gt;apidog run&lt;/code&gt; untuk menjalankan ulang &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;skenario pengujian&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;File HAR mengubah traffic browser menjadi endpoint API yang dapat digunakan ulang.&lt;/p&gt;

&lt;p&gt;Alur implementasinya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rekam traffic di DevTools.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Save all as HAR with content&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Impor melalui &lt;strong&gt;Settings &amp;gt; Import Data &amp;gt; Manual&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Hapus&lt;/strong&gt; untuk BaseURL.&lt;/li&gt;
&lt;li&gt;Atur &lt;strong&gt;Sumber Daya Statis&lt;/strong&gt; ke &lt;strong&gt;Kecualikan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ganti nama endpoint, parameterkan path, dan hapus rahasia.&lt;/li&gt;
&lt;li&gt;Dokumentasikan, simulasikan, atau uji endpoint hasil impor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Siap mengubah capture browser menjadi endpoint nyata? &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt; dan coba gratis tanpa kartu kredit.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menambahkan Percabangan If/Else dan Kontrol Aliran ke Skenario Tes API di Apidog</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Wed, 15 Jul 2026 09:58:20 +0000</pubDate>
      <link>https://dev.to/walse/cara-menambahkan-percabangan-ifelse-dan-kontrol-aliran-ke-skenario-tes-api-di-apidog-2c23</link>
      <guid>https://dev.to/walse/cara-menambahkan-percabangan-ifelse-dan-kontrol-aliran-ke-skenario-tes-api-di-apidog-2c23</guid>
      <description>&lt;p&gt;Sebagian besar tes API berjalan lurus: panggil login, panggil checkout, panggil endpoint tanda terima, lalu verifikasi hasilnya. Pola ini gagal ketika langkah awal menentukan apakah langkah berikutnya masih relevan. Jika login mengembalikan &lt;code&gt;401&lt;/code&gt;, menjalankan checkout hanya menghasilkan kegagalan lanjutan yang menutupi penyebab utama. Solusinya adalah membuat skenario yang membaca respons login, memutuskan apakah eksekusi dilanjutkan, lalu melaporkan titik kegagalan yang sebenarnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Keputusan seperti ini membutuhkan logika kondisional melalui kontrol alur. Dalam panduan ini, Anda akan membuat percabangan &lt;code&gt;if/else&lt;/code&gt; di &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;: jalankan login, periksa kode statusnya, dan panggil checkout hanya jika login berhasil. Jika Anda belum pernah membuat skenario di Apidog, mulai dari panduan &lt;a href="https://apidog.com/id/blog/how-to-write-test-scenario-with-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara menulis skenario tes dengan Apidog&lt;/a&gt;. Untuk konsep dasar &lt;code&gt;if/else&lt;/code&gt;, lihat &lt;a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/Conditionals" rel="noopener noreferrer"&gt;panduan MDN tentang pernyataan kondisional&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu kontrol alur?
&lt;/h2&gt;

&lt;p&gt;Di Apidog, tes otomatis berada di modul &lt;strong&gt;Test&lt;/strong&gt;. Unit kerjanya adalah &lt;strong&gt;Test Scenario&lt;/strong&gt;, yang serupa dengan Collection di Postman. Sebuah skenario berisi beberapa &lt;strong&gt;Test Step&lt;/strong&gt;. Setiap langkah dapat berupa request HTTP atau &lt;a href="https://en.wikipedia.org/wiki/Control_flow" rel="noopener noreferrer"&gt;elemen kontrol alur&lt;/a&gt;, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Percabangan kondisional&lt;/li&gt;
&lt;li&gt;Loop&lt;/li&gt;
&lt;li&gt;Penundaan (&lt;code&gt;Wait&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Penanganan error&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9w0igi1qorj982thy5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9w0igi1qorj982thy5e.png" alt="Kontrol alur di Apidog. Sebuah skenario tes menunjukkan langkah-langkkah berurutan, dengan satu langkah yang diperbesar menunjukkan pengaturan request, post-processor, dan pre-processor." width="799" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kontrol alur membuat skenario tidak sekadar menjalankan request secara berurutan. Untuk referensi setiap opsi, lihat &lt;a href="https://docs.apidog.com/flow-control-conditions-599419m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;dokumentasi Apidog tentang kontrol alur dan percabangan kondisional&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fokus artikel ini adalah &lt;strong&gt;Conditional Branching&lt;/strong&gt;, yaitu implementasi &lt;code&gt;if/else&lt;/code&gt; di Apidog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if kondisi terpenuhi:
  jalankan langkah pada blok If
else:
  jalankan langkah pada blok Else
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Percabangan bukan loop. Percabangan membuat satu keputusan, sedangkan loop menjalankan blok langkah berkali-kali. Jika Anda perlu memproses array ID pesanan, gunakan &lt;code&gt;ForEach Loop&lt;/code&gt;, bukan Conditional Branching. Lihat &lt;a href="https://apidog.com/id/blog/foreach-loop-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial loop ForEach&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dokumentasi Apidog tidak mencantumkan pembatasan gratis-versus-berbayar atau cloud-versus-self-hosted untuk kontrol alur, percabangan, loop, maupun penerusan data antar langkah.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bangun skenario: login lalu checkout hanya jika berhasil
&lt;/h2&gt;

&lt;p&gt;Target alurnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /login
  └── jika status = 200
        └── POST /checkout
  └── jika status ≠ 200
        └── tandai kegagalan / kirim notifikasi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 1: buat Test Scenario
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Buka Apidog dan masuk ke modul &lt;strong&gt;Test&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Klik ikon &lt;code&gt;+&lt;/code&gt; di samping kolom pencarian.&lt;/li&gt;
&lt;li&gt;Pilih direktori untuk skenario.&lt;/li&gt;
&lt;li&gt;Tentukan prioritas, lalu selesaikan pembuatan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anda sekarang memiliki skenario kosong untuk menambahkan langkah tes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 2: tambahkan request login
&lt;/h3&gt;

&lt;p&gt;Tambahkan Test Step pertama sebagai request &lt;code&gt;POST&lt;/code&gt; ke endpoint autentikasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.your-store.com/v1/login
Content-Type: application/json

{
  "email": "dana@example.com",
  "password": "correct-horse-battery-staple"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan request ini terlebih dahulu untuk memastikan responsnya sesuai ekspektasi. Login berhasil umumnya mengembalikan status &lt;code&gt;200&lt;/code&gt; dan token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_10482"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 3: masuk ke mode orkestrasi
&lt;/h3&gt;

&lt;p&gt;Klik salah satu langkah untuk masuk ke mode orkestrasi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Panel kiri menampilkan alur seluruh skenario.&lt;/li&gt;
&lt;li&gt;Panel kanan menampilkan konfigurasi langkah yang dipilih.&lt;/li&gt;
&lt;li&gt;Seret ikon &lt;code&gt;≡&lt;/code&gt; untuk mengubah urutan langkah.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Di tampilan ini Anda akan menambahkan blok &lt;code&gt;if/else&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 4: tambahkan Conditional Branching
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Klik &lt;strong&gt;Add Step&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilih &lt;strong&gt;Conditional Branching&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Konfigurasikan kondisi untuk memeriksa status respons login.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk kasus ini, kondisinya adalah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status respons login Equals 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog menyediakan operator berikut untuk membangun kondisi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Equals&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Does not equal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Exists&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Does not exist&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Less than&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Less than or equal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Greater than&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Greater than or equal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Matches with Regex&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Contains&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Does not contain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Is empty&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Is not Empty&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;In List&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Not in List&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Langkah 5: gunakan data dari respons login
&lt;/h3&gt;

&lt;p&gt;Ada dua cara untuk mengambil nilai dari langkah sebelumnya.&lt;/p&gt;

&lt;h4&gt;
  
  
  Opsi 1: Retrieve pre-step data
&lt;/h4&gt;

&lt;p&gt;Klik field nilai kondisi, lalu klik ikon tongkat sihir dan pilih &lt;strong&gt;Retrieve pre-step data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apidog dapat mengambil data langsung dari respons request sebelumnya. Sintaks referensinya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.&amp;lt;step id&amp;gt;.response.body.&amp;lt;field path&amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Misalnya, untuk mengambil token dari body respons langkah login dengan ID &lt;code&gt;1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.1.response.body.token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqzrproro9rhx7r9qjh3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqzrproro9rhx7r9qjh3t.png" alt="Referensi data pra-langkah di Apidog. Dialog untuk mengambil data dari langkah sebelumnya." width="799" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perhatikan dua hal berikut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve pre-step data&lt;/strong&gt; hanya tersedia di modul &lt;strong&gt;Test&lt;/strong&gt;, bukan modul API.&lt;/li&gt;
&lt;li&gt;Nilai referensi hanya terisi saat Anda menjalankan &lt;strong&gt;seluruh skenario&lt;/strong&gt;. Jika menjalankan satu langkah saja, nilai dari langkah sebelumnya belum tersedia.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Untuk pengecekan kode status, gunakan data status dari langkah login sebagai nilai di sisi kiri kondisi, lalu set operator ke &lt;code&gt;Equals&lt;/code&gt; dan nilai pembanding ke &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Opsi 2: ekstrak ke variabel bernama
&lt;/h4&gt;

&lt;p&gt;Gunakan pendekatan ini jika token atau nilai respons perlu dipakai di beberapa request atau modul.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka konfigurasi login.&lt;/li&gt;
&lt;li&gt;Tambahkan aksi &lt;strong&gt;Extract Variable&lt;/strong&gt; pada pre-processor atau konfigurasi ekstraksi yang sesuai.&lt;/li&gt;
&lt;li&gt;Ekstrak nilai dengan JSONPath, misalnya:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Simpan sebagai variabel, misalnya &lt;code&gt;token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan di langkah berikutnya:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pendekatan ini berguna untuk request checkout yang membutuhkan header otorisasi. Pelajari pola ini lebih lanjut di panduan &lt;a href="https://apidog.com/id/blog/pass-data-test-steps?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara meneruskan data antar langkah tes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 6: tambahkan blok Else
&lt;/h3&gt;

&lt;p&gt;Arahkan kursor ke blok &lt;code&gt;If&lt;/code&gt;, lalu klik &lt;code&gt;+ Else&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sekarang isi kedua jalur eksekusi:&lt;/p&gt;

&lt;h4&gt;
  
  
  Blok If: jalankan checkout
&lt;/h4&gt;

&lt;p&gt;Tambahkan request checkout di dalam blok &lt;code&gt;If&lt;/code&gt;. Request ini hanya akan berjalan saat login mengembalikan &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jika checkout membutuhkan token, gunakan variabel yang diekstrak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.your-store.com/v1/checkout
Authorization: Bearer {{token}}
Content-Type: application/json

{
  "cartId": "cart_123"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau gunakan referensi pre-step langsung jika token belum diekstrak sebagai variabel.&lt;/p&gt;

&lt;p&gt;Pola header &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; juga umum digunakan pada request terautentikasi, seperti yang dijelaskan dalam &lt;a href="https://docs.stripe.com/api" rel="noopener noreferrer"&gt;dokumentasi API Stripe&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Blok Else: buat kegagalan terlihat jelas
&lt;/h4&gt;

&lt;p&gt;Di dalam blok &lt;code&gt;Else&lt;/code&gt;, tambahkan langkah yang menandai kegagalan login secara eksplisit. Contoh tindakan yang dapat digunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kirim request ke endpoint logging.&lt;/li&gt;
&lt;li&gt;Kirim notifikasi ke sistem internal.&lt;/li&gt;
&lt;li&gt;Tambahkan request kustom dengan assertion yang selalu gagal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tujuannya adalah memastikan laporan skenario menunjukkan bahwa penyebab kegagalan ada pada login, bukan pada checkout.&lt;/p&gt;

&lt;p&gt;Hasil akhirnya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if login.status === 200:
  jalankan checkout
else:
  catat kegagalan login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 7: simpan dan jalankan skenario
&lt;/h3&gt;

&lt;p&gt;Klik &lt;strong&gt;Save All&lt;/strong&gt; untuk menyimpan perubahan. Jika masih ada indikator titik, berarti ada perubahan yang belum tersimpan.&lt;/p&gt;

&lt;p&gt;Uji kedua jalur:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan kredensial valid untuk memastikan blok &lt;code&gt;If&lt;/code&gt; aktif.&lt;/li&gt;
&lt;li&gt;Gunakan kredensial salah untuk memastikan blok &lt;code&gt;Else&lt;/code&gt; aktif.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Variasi percabangan yang berguna
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bercabang berdasarkan field response body
&lt;/h3&gt;

&lt;p&gt;Status HTTP bukan satu-satunya nilai yang bisa diuji. Misalnya, API login dapat mengembalikan &lt;code&gt;200&lt;/code&gt; untuk akun terkunci, tetapi mengirim status aktual di body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"locked"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Account is temporarily locked"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan referensi berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.1.response.body.status}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lalu buat kondisi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.1.response.body.status}} Equals "active"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anda juga dapat memakai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Contains&lt;/code&gt; untuk memeriksa teks pesan.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Greater than&lt;/code&gt; untuk nilai numerik seperti saldo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;In List&lt;/code&gt; untuk memvalidasi role pengguna terhadap daftar role yang diizinkan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gabungkan percabangan dan loop
&lt;/h3&gt;

&lt;p&gt;Conditional Branching dapat ditempatkan di dalam &lt;code&gt;ForEach Loop&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contohnya, jika Anda memproses array produk, gunakan percabangan untuk melewati produk yang stoknya tidak tersedia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ForEach product:
  if product.available == true:
    proses produk
  else:
    lewati produk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Referensi loop yang tersedia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.&amp;lt;loop step id&amp;gt;.index}}
{{$.&amp;lt;loop step id&amp;gt;.element.&amp;lt;field path&amp;gt;}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Index loop dimulai dari &lt;code&gt;0&lt;/code&gt;. Untuk implementasi lengkap, lihat &lt;a href="https://apidog.com/id/blog/foreach-loop-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial loop ForEach&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg5ntdtrc78qpkgo7goh8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg5ntdtrc78qpkgo7goh8.png" alt="Screenshot pengaturan loop ForEach di Apidog, menunjukkan blok loop dan konfigurasi langkah." width="722" height="836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hentikan loop dengan Break If
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;strong&gt;Break If condition&lt;/strong&gt; untuk menghentikan loop segera saat suatu kondisi terpenuhi.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jika respons mengembalikan status "completed":
  hentikan loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anda dapat menambahkan lebih dari satu &lt;code&gt;Break If condition&lt;/code&gt; dalam satu loop dan mengubah posisinya sesuai urutan evaluasi yang dibutuhkan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tangani error di dalam loop
&lt;/h3&gt;

&lt;p&gt;Loop memiliki elemen &lt;code&gt;On Error&lt;/code&gt; yang posisinya berada di awal loop. Pilih perilaku saat request dalam loop mengalami error:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ignore&lt;/code&gt;: lanjut ke request berikutnya.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Continue&lt;/code&gt;: lewati sisa request pada iterasi saat ini.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Break execution&lt;/code&gt;: hentikan loop lalu lanjutkan langkah setelah loop.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;End execution&lt;/code&gt;: hentikan seluruh skenario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tambahkan Wait antar langkah
&lt;/h3&gt;

&lt;p&gt;Gunakan elemen &lt;code&gt;Wait&lt;/code&gt; jika layanan downstream membutuhkan waktu untuk memproses data.&lt;/p&gt;

&lt;p&gt;Misalnya, setelah membuat pesanan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /orders
Wait 1000 ms
GET /orders/{id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nilai penundaan menggunakan milidetik.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gunakan skrip untuk logika yang lebih kompleks
&lt;/h3&gt;

&lt;p&gt;Jika operator kondisi tidak cukup, hitung kondisi melalui skrip pre-processor atau post-processor.&lt;/p&gt;

&lt;p&gt;Sintaks &lt;code&gt;{{variable}}&lt;/code&gt; tidak dapat digunakan langsung di dalam skrip. Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$.2.response.body.token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sesuaikan ID langkah dan jalur field dengan skenario Anda.&lt;/p&gt;

&lt;p&gt;Untuk pola request berantai dan penerusan data yang lebih luas, lihat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/request-chaining?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Permintaan berantai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/api-test-orchestration-passing-data?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Orkestrasi tes API dan penerusan data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Skenario tidak dapat mereferensikan dirinya sendiri. Batasan ini mencegah loop tak terbatas saat skenario disarangkan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Otomatiskan skenario dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;Skenario yang sama dapat dijalankan tanpa antarmuka melalui Apidog CLI, sehingga cocok untuk CI.&lt;/p&gt;

&lt;p&gt;Instal CLI dan login menggunakan access token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jalankan skenario berdasarkan ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;scenario_id&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;env_id&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter yang digunakan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt;: ID Test Scenario.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-e&lt;/code&gt;: ID environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-r&lt;/code&gt;: reporter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pilihan reporter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Output konsol&lt;/span&gt;
&lt;span class="nt"&gt;-r&lt;/span&gt; cli

&lt;span class="c"&gt;# Laporan HTML dan output konsol&lt;/span&gt;
&lt;span class="nt"&gt;-r&lt;/span&gt; html,cli

&lt;span class="c"&gt;# Laporan JUnit untuk CI&lt;/span&gt;
&lt;span class="nt"&gt;-r&lt;/span&gt; junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Percabangan akan dievaluasi sama seperti saat dijalankan dari aplikasi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI menjalankan login.&lt;/li&gt;
&lt;li&gt;CLI membaca respons login.&lt;/li&gt;
&lt;li&gt;CLI memilih blok &lt;code&gt;If&lt;/code&gt; atau &lt;code&gt;Else&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Exit code mencerminkan hasil eksekusi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Artinya, kegagalan login dapat langsung menggagalkan build CI Anda.&lt;/p&gt;

&lt;p&gt;Referensi implementasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-installation-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Panduan instalasi Apidog CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/apidog-cli-github-actions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Panduan Apidog CLI GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/id/blog/how-to-schedule-api-tests-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Cara menjadwalkan tes API di Apidog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa perbedaan Conditional Branching dan loop di Apidog?
&lt;/h3&gt;

&lt;p&gt;Conditional Branching membuat satu keputusan: menjalankan atau melewati sebuah blok berdasarkan kondisi. Loop menjalankan blok berulang kali.&lt;/p&gt;

&lt;p&gt;Gunakan percabangan untuk logika seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jika login berhasil, jalankan checkout.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan &lt;code&gt;For&lt;/code&gt; atau &lt;code&gt;ForEach&lt;/code&gt; untuk memproses banyak nilai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Untuk setiap ID pesanan, jalankan GET /orders/{id}.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lihat &lt;a href="https://apidog.com/id/blog/foreach-loop-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial loop ForEach&lt;/a&gt; untuk detail iterasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa Retrieve pre-step data kosong?
&lt;/h3&gt;

&lt;p&gt;Biasanya karena salah satu dari dua hal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fitur ini hanya bekerja di modul &lt;strong&gt;Test&lt;/strong&gt;, bukan modul API.&lt;/li&gt;
&lt;li&gt;Anda menjalankan satu langkah secara terpisah, bukan seluruh skenario.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jalankan skenario lengkap agar respons dari langkah sebelumnya tersedia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bisakah saya bercabang berdasarkan field di response body?
&lt;/h3&gt;

&lt;p&gt;Ya. Gunakan referensi seperti:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{$.1.response.body.status}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau ekstrak nilainya ke variabel bernama. Setelah itu, gunakan operator seperti &lt;code&gt;Equals&lt;/code&gt;, &lt;code&gt;Contains&lt;/code&gt;, atau &lt;code&gt;In List&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Panduan &lt;a href="https://apidog.com/id/blog/pass-data-test-steps?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cara meneruskan data antar langkah tes&lt;/a&gt; membahas pola ini lebih lanjut.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana menggunakan variabel di dalam skrip?
&lt;/h3&gt;

&lt;p&gt;Jangan gunakan &lt;code&gt;{{variable}}&lt;/code&gt; secara langsung di skrip. Gunakan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$.2.response.body.token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sesuaikan ID langkah dan jalur field dengan data yang ingin diambil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apakah percabangan membutuhkan paket tambahan atau self-hosted?
&lt;/h3&gt;

&lt;p&gt;Dokumentasi Apidog tidak mencantumkan batasan paket maupun perbedaan cloud-versus-self-hosted untuk kontrol alur, percabangan kondisional, loop, atau penerusan data. Jika Anda dapat membuat skenario, Anda dapat menambahkan percabangan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Tes linear hanya menunjukkan bahwa ada sesuatu yang rusak. Tes dengan percabangan menunjukkan lokasi kegagalan dan mencegah request lanjutan yang tidak lagi valid.&lt;/p&gt;

&lt;p&gt;Untuk menerapkannya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tambahkan &lt;strong&gt;Conditional Branching&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ambil respons langkah sebelumnya dengan &lt;strong&gt;Retrieve pre-step data&lt;/strong&gt; atau variabel hasil ekstraksi.&lt;/li&gt;
&lt;li&gt;Konfigurasikan kondisi &lt;code&gt;If&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan jalur &lt;code&gt;+ Else&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan skenario penuh untuk memverifikasi kedua jalur.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;apidog run&lt;/code&gt; untuk menjalankan logika yang sama di CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Coba Apidog gratis&lt;/a&gt; dan ubah tes API linear menjadi skenario yang dapat mengambil keputusan berdasarkan respons sebenarnya.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cara Menjadwalkan Tes API Otomatis di Apidog (Cloud, Runner, dan CLI)</title>
      <dc:creator>Walse</dc:creator>
      <pubDate>Wed, 15 Jul 2026 09:08:07 +0000</pubDate>
      <link>https://dev.to/walse/cara-menjadwalkan-tes-api-otomatis-di-apidog-cloud-runner-dan-cli-2hlh</link>
      <guid>https://dev.to/walse/cara-menjadwalkan-tes-api-otomatis-di-apidog-cloud-runner-dan-cli-2hlh</guid>
      <description>&lt;p&gt;Serangkaian pengujian yang berhasil hanya berguna jika tetap berhasil. Alur checkout mungkin berfungsi hari ini, tetapi perubahan dependensi yang merusak pada pukul 2 pagi, sertifikat yang kedaluwarsa saat akhir pekan, atau konfigurasi yang bergeser dapat menjatuhkan endpoint pembayaran tanpa diketahui. Jalankan pengujian API secara terjadwal agar Anda menerima sinyal kegagalan lebih dulu, bukan keluhan pelanggan.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Coba Apidog hari ini&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; menyediakan fitur &lt;strong&gt;Tugas Terjadwal&lt;/strong&gt; untuk menjalankan skenario pengujian API secara otomatis. Anda cukup memilih skenario yang sudah dibuat, menentukan frekuensi, memilih mesin eksekusi, lalu menghubungkan notifikasi kegagalan.&lt;/p&gt;

&lt;p&gt;Jika Anda baru mulai menjalankan pemeriksaan otomatis terhadap endpoint langsung, baca pengantar tentang &lt;a href="https://apidog.com/id/blog/api-monitoring?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pemantauan API&lt;/a&gt;. Untuk detail UI terbaru, gunakan &lt;a href="https://docs.apidog.com/scheduled-tasks-603702m0?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;dokumentasi Tugas Terjadwal Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Catatan:&lt;/strong&gt; Tugas Terjadwal saat ini masih berstatus Beta. Jumlah eksekusi terjadwal yang tersedia bergantung pada paket akun Anda.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Apa yang dilakukan Tugas Terjadwal?
&lt;/h2&gt;

&lt;p&gt;Tugas Terjadwal di Apidog menjalankan satu atau lebih &lt;strong&gt;Skenario Pengujian&lt;/strong&gt; secara berulang. Contoh penggunaan yang umum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;regresi API inti setiap malam;&lt;/li&gt;
&lt;li&gt;smoke test staging setiap beberapa jam;&lt;/li&gt;
&lt;li&gt;pemeriksaan kesehatan layanan saat akhir pekan;&lt;/li&gt;
&lt;li&gt;verifikasi alur checkout, autentikasi, atau pembayaran.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Satu tugas menyimpan konfigurasi berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;skenario yang dijalankan;&lt;/li&gt;
&lt;li&gt;lingkungan target;&lt;/li&gt;
&lt;li&gt;frekuensi eksekusi;&lt;/li&gt;
&lt;li&gt;Runner yang digunakan;&lt;/li&gt;
&lt;li&gt;penerima notifikasi ketika terjadi kegagalan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fitur ini bukan scraper terjadwal. Anda tidak perlu membuat selector halaman atau aturan crawling. Tugas Terjadwal menjalankan skenario pengujian API yang sudah ada, termasuk assertion, request berantai, ekstraksi variabel, dan data pengujian. Outputnya adalah laporan lulus/gagal untuk kontrak API Anda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prasyarat: konfigurasi Runner yang di-host sendiri
&lt;/h2&gt;

&lt;p&gt;Sebelum membuat jadwal, siapkan &lt;strong&gt;Runner yang di-host sendiri&lt;/strong&gt;. Runner adalah mesin yang mengeksekusi rangkaian pengujian.&lt;/p&gt;

&lt;p&gt;Ketika jadwal aktif, Apidog tidak mengirim request dari aplikasi desktop Anda. Request dikirim dari Runner yang dipilih. Runner dapat berupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server CI yang selalu aktif;&lt;/li&gt;
&lt;li&gt;VM khusus;&lt;/li&gt;
&lt;li&gt;server internal;&lt;/li&gt;
&lt;li&gt;mesin yang memiliki akses ke VPC, VPN, atau jaringan privat API Anda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Saat ini, pilihan &lt;strong&gt;Apidog Cloud&lt;/strong&gt; masih ditandai sebagai “segera hadir”. Gunakan Runner yang di-host sendiri untuk eksekusi terjadwal.&lt;/p&gt;

&lt;p&gt;Perhatikan konteks jaringan Runner. Hasil pengujian dapat berbeda dari laptop Anda karena faktor seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lokasi atau region Runner;&lt;/li&gt;
&lt;li&gt;VPN perusahaan;&lt;/li&gt;
&lt;li&gt;firewall dan subnet privat;&lt;/li&gt;
&lt;li&gt;aturan allowlist IP;&lt;/li&gt;
&lt;li&gt;DNS atau konfigurasi proxy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk pemantauan yang realistis, letakkan Runner di jaringan yang merepresentasikan jalur akses pengguna atau layanan Anda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Langkah demi langkah: membuat Tugas Terjadwal
&lt;/h2&gt;

&lt;p&gt;Contoh berikut membuat regresi malam hari untuk API e-commerce yang mencakup registrasi pengguna, katalog produk, keranjang, dan checkout dengan &lt;a href="https://docs.stripe.com/" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Buka Tugas Terjadwal
&lt;/h3&gt;

&lt;p&gt;Di klien Apidog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buka modul &lt;strong&gt;Pengujian&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pada pohon folder Pengujian, pilih &lt;strong&gt;Tugas Terjadwal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Gunakan halaman ini untuk melihat, mengaktifkan, menonaktifkan, dan mengelola semua jadwal dalam proyek.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Buat tugas baru
&lt;/h3&gt;

&lt;p&gt;Klik &lt;strong&gt;+ Baru&lt;/strong&gt; untuk membuat tugas terjadwal.&lt;/p&gt;

&lt;p&gt;Gunakan nama yang menjelaskan tujuan dan targetnya. Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Regresi malam - Produksi
Smoke test - Staging - 6 jam
Checkout API - Produksi - Akhir pekan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tambahkan deskripsi singkat agar tim memahami cakupan tugas tanpa perlu membuka konfigurasinya.&lt;/p&gt;

&lt;p&gt;Jika jumlah tugas mulai banyak, buat folder untuk memisahkan tugas berdasarkan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lingkungan: staging dan produksi;&lt;/li&gt;
&lt;li&gt;domain layanan: autentikasi, katalog, checkout;&lt;/li&gt;
&lt;li&gt;jenis pemeriksaan: smoke test dan regresi penuh.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Pilih Skenario Pengujian
&lt;/h3&gt;

&lt;p&gt;Di bagian &lt;strong&gt;Skenario Pengujian&lt;/strong&gt;, pilih satu atau beberapa skenario yang ingin dijalankan.&lt;/p&gt;

&lt;p&gt;Untuk alur e-commerce, pilih misalnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Daftar dan masuk&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Jelajahi dan tambahkan ke keranjang&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Checkout dengan kartu uji Stripe&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Setiap skenario dapat memiliki konfigurasi eksekusi sendiri, seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lingkungan;&lt;/li&gt;
&lt;li&gt;data pengujian;&lt;/li&gt;
&lt;li&gt;jumlah iterasi;&lt;/li&gt;
&lt;li&gt;penundaan;&lt;/li&gt;
&lt;li&gt;penyimpanan request dan response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika seluruh skenario harus memakai konfigurasi yang sama, aktifkan &lt;strong&gt;Gunakan konfigurasi eksekusi yang sama&lt;/strong&gt;. Opsi ini berguna untuk menjaga konsistensi pada rangkaian besar.&lt;/p&gt;

&lt;p&gt;Untuk praktik yang lebih mudah dipelihara, gunakan satu lingkungan per tugas. Misalnya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tugas produksi hanya menggunakan environment produksi;&lt;/li&gt;
&lt;li&gt;tugas staging hanya menggunakan environment staging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Walaupun satu tugas dapat mencampur target, konfigurasi tersebut biasanya lebih sulit ditelusuri saat terjadi kegagalan.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Atur siklus eksekusi
&lt;/h3&gt;

&lt;p&gt;Tentukan frekuensi pada bidang &lt;strong&gt;Siklus Berjalan&lt;/strong&gt; atau &lt;strong&gt;Mode Berjalan&lt;/strong&gt;. Labelnya dapat berbeda di UI, tetapi keduanya mengatur jadwal eksekusi.&lt;/p&gt;

&lt;p&gt;Contoh ritme yang didokumentasikan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setiap Minggu pukul 23.00;&lt;/li&gt;
&lt;li&gt;setiap 6 jam;&lt;/li&gt;
&lt;li&gt;setiap 8 jam.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rekomendasi praktis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Kebutuhan&lt;/th&gt;
&lt;th&gt;Jadwal yang sesuai&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Regresi penuh produksi&lt;/td&gt;
&lt;td&gt;Setiap malam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smoke test staging&lt;/td&gt;
&lt;td&gt;Setiap 6 jam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pemeriksaan kesehatan ringan&lt;/td&gt;
&lt;td&gt;Lebih sering, sesuai batas paket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verifikasi sebelum hari kerja&lt;/td&gt;
&lt;td&gt;Minggu malam&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hindari jadwal terlalu agresif jika API atau environment pengujian memiliki keterbatasan kapasitas.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pilih Runner
&lt;/h3&gt;

&lt;p&gt;Pada bidang Runner, pilih &lt;strong&gt;Runner yang di-host sendiri&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Di beberapa layar, bidang ini dapat muncul sebagai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Berjalan di&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jalankan Pada&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Berjalan Pada&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semua label tersebut merujuk ke mesin yang menjalankan skenario.&lt;/p&gt;

&lt;p&gt;Pilih Runner yang sesuai dengan target API. Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Runner: prod-vpc-runner
Target: API produksi di dalam VPC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Karena semua request dijalankan dari Runner, pilih mesin yang memiliki akses jaringan yang benar dan stabil.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Aktifkan notifikasi
&lt;/h3&gt;

&lt;p&gt;Aktifkan &lt;strong&gt;Notifikasi&lt;/strong&gt; agar kegagalan tidak luput dari perhatian.&lt;/p&gt;

&lt;p&gt;Saluran notifikasi yang didukung meliputi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slack;&lt;/li&gt;
&lt;li&gt;Teams;&lt;/li&gt;
&lt;li&gt;Webhook;&lt;/li&gt;
&lt;li&gt;Jenkins;&lt;/li&gt;
&lt;li&gt;Email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk email, Anda dapat memilih anggota proyek atau memasukkan alamat non-anggota, misalnya inbox bersama atau rotasi on-call.&lt;/p&gt;

&lt;p&gt;Pilih kapan notifikasi dikirim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setelah setiap eksekusi&lt;/strong&gt;: berguna saat peluncuran atau investigasi masalah.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hanya pada kegagalan&lt;/strong&gt;: pilihan yang lebih tenang untuk regresi rutin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Untuk tugas malam hari yang stabil, gunakan notifikasi hanya saat gagal. Untuk jadwal yang baru dibuat, Anda mungkin ingin sementara mengaktifkan notifikasi setiap eksekusi untuk memastikan Runner dan jadwal benar-benar berjalan.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Simpan dan aktifkan
&lt;/h3&gt;

&lt;p&gt;Simpan konfigurasi, lalu aktifkan tugas.&lt;/p&gt;

&lt;p&gt;Tugas akan berjalan sesuai jadwal yang Anda tentukan. Anda dapat menonaktifkannya tanpa menghapus konfigurasi, misalnya saat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;maintenance terencana;&lt;/li&gt;
&lt;li&gt;migrasi database;&lt;/li&gt;
&lt;li&gt;perubahan infrastruktur;&lt;/li&gt;
&lt;li&gt;periode deploy yang menghasilkan kegagalan yang sudah diperkirakan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8. Periksa Riwayat Eksekusi
&lt;/h3&gt;

&lt;p&gt;Setelah eksekusi selesai, Runner mengunggah hasilnya kembali ke server.&lt;/p&gt;

&lt;p&gt;Buka &lt;strong&gt;Tugas Terjadwal → Riwayat Eksekusi&lt;/strong&gt; untuk memeriksa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;waktu eksekusi;&lt;/li&gt;
&lt;li&gt;status lulus atau gagal;&lt;/li&gt;
&lt;li&gt;assertion yang gagal;&lt;/li&gt;
&lt;li&gt;detail request dan response;&lt;/li&gt;
&lt;li&gt;riwayat kegagalan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gunakan halaman ini sebagai titik awal debugging setelah menerima alert dari Slack, email, atau webhook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pengaturan lanjutan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gunakan cakupan variabel sekecil mungkin
&lt;/h3&gt;

&lt;p&gt;Apidog menyediakan beberapa tingkat berbagi variabel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hanya dalam skenario pengujian saat ini&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Variabel hanya tersedia untuk skenario tersebut.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Di seluruh skenario pengujian dalam tugas terjadwal saat ini&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Skenario dalam tugas yang sama dapat membaca nilai bersama.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Di seluruh tugas terjadwal dalam folder tugas terjadwal saat ini&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cakupan terluas untuk tugas yang dikelompokkan dalam folder yang sama.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Gunakan cakupan paling kecil yang masih memenuhi kebutuhan alur Anda. Ini membantu mencegah token, ID, atau data sementara terbaca oleh skenario yang tidak terkait.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aktifkan persistensi variabel bila diperlukan
&lt;/h3&gt;

&lt;p&gt;Jika nilai harus bertahan antar-eksekusi, aktifkan opsi &lt;strong&gt;Pertahankan nilai variabel&lt;/strong&gt; pada halaman desain Skenario Pengujian.&lt;/p&gt;

&lt;p&gt;Contoh kasus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;menyimpan ID pesanan dari eksekusi sebelumnya;&lt;/li&gt;
&lt;li&gt;memakai token yang diperbarui;&lt;/li&gt;
&lt;li&gt;melanjutkan alur yang membutuhkan state dari eksekusi sebelumnya.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tanpa opsi ini, setiap eksekusi terjadwal dimulai dari awal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kelompokkan tugas dengan folder
&lt;/h3&gt;

&lt;p&gt;Gunakan folder untuk mengelompokkan jadwal berdasarkan layanan atau lingkungan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tugas Terjadwal/
├── Produksi/
│   ├── Smoke test - 6 jam
│   └── Regresi malam
├── Staging/
│   ├── Smoke test - 6 jam
│   └── Verifikasi pra-rilis
└── Pembayaran/
    └── Checkout API - malam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Struktur ini juga membantu saat Anda menggunakan cakupan variabel tingkat folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Periksa batas paket sebelum meningkatkan frekuensi
&lt;/h3&gt;

&lt;p&gt;Jumlah eksekusi terjadwal bergantung pada langganan Anda. Periksa detail paket sebelum mengatur pemeriksaan setiap jam atau menjalankan banyak tugas paralel.&lt;/p&gt;

&lt;p&gt;Untuk skenario yang lebih kompleks, baca panduan tentang &lt;a href="https://apidog.com/id/blog/schedules-tasks-advanced?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tugas terjadwal lanjutan&lt;/a&gt; dan &lt;a href="https://apidog.com/id/blog/how-to-add-conditional-logic-api-test-scenarios-apidog?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;logika kondisional dalam skenario pengujian API&lt;/a&gt;. Jika tim Anda baru memulai pemeriksaan tanpa pengawasan, lihat juga &lt;a href="https://apidog.com/id/blog/nightly-api-test-runs-ci?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;eksekusi pengujian API malam hari di CI&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otomatiskan dengan Apidog CLI
&lt;/h2&gt;

&lt;p&gt;UI Tugas Terjadwal cocok untuk konfigurasi langsung di Apidog. Alternatifnya, gunakan &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; CLI dan biarkan cron atau CI menangani jadwalnya.&lt;/p&gt;

&lt;p&gt;CLI tidak menyediakan perintah jadwal bawaan. Penjadwalan dilakukan oleh alat eksternal seperti cron atau GitHub Actions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog login &lt;span class="nt"&gt;--with-token&lt;/span&gt; &amp;lt;YOUR_TOKEN&amp;gt;
apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;SCENARIO_ID&amp;gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &amp;lt;ENV_ID&amp;gt; &lt;span class="nt"&gt;-r&lt;/span&gt; cli,junit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter utama:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID Skenario Pengujian&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ID lingkungan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reporter: &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, atau &lt;code&gt;junit&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Untuk menjalankan skenario setiap malam menggunakan &lt;a href="https://en.wikipedia.org/wiki/Cron" rel="noopener noreferrer"&gt;cron&lt;/a&gt;, tambahkan entri berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0 2 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /srv/api-tests &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apidog run &lt;span class="nt"&gt;--access-token&lt;/span&gt; &lt;span class="nv"&gt;$APIDOG_ACCESS_TOKEN&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 4471 &lt;span class="nt"&gt;-e&lt;/span&gt; 88 &lt;span class="nt"&gt;-r&lt;/span&gt; junit &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; run.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh tersebut menjalankan skenario setiap hari pukul 02.00 dan menyimpan output ke &lt;code&gt;run.log&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Anda juga dapat menjalankannya melalui GitHub Actions terjadwal. Laporan JUnit dapat diteruskan ke dasbor pipeline yang sudah digunakan tim. Baca panduan &lt;a href="https://apidog.com/id/blog/apidog-cli-ci-cd-pipeline?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog CLI di pipeline CI/CD&lt;/a&gt; untuk konfigurasi lengkap, termasuk cron dan &lt;a href="https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule" rel="noopener noreferrer"&gt;pemicu jadwal GitHub Actions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bisakah saya menjalankan pengujian terjadwal di Apidog Cloud hari ini?
&lt;/h3&gt;

&lt;p&gt;Belum. Apidog Cloud masih ditandai sebagai “segera hadir”. Saat ini, gunakan Runner yang di-host sendiri sebagai mesin eksekusi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Seberapa sering tugas terjadwal dapat berjalan?
&lt;/h3&gt;

&lt;p&gt;Frekuensinya fleksibel, misalnya setiap 6 jam atau setiap Minggu pukul 23.00. Namun, jumlah total eksekusi terjadwal dibatasi oleh paket langganan Anda. Periksa detail paket sebelum mengasumsikan batas tertentu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bagaimana cara menerima notifikasi hanya ketika pengujian gagal?
&lt;/h3&gt;

&lt;p&gt;Pada pengaturan Notifikasi tugas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pilih opsi &lt;strong&gt;hanya kegagalan&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan saluran seperti Slack, Teams, Webhook, Jenkins, atau Email.&lt;/li&gt;
&lt;li&gt;Simpan dan aktifkan tugas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pendekatan ini menjaga saluran notifikasi tetap tenang saat eksekusi berhasil. Lengkapi regresi penuh dengan &lt;a href="https://apidog.com/id/blog/api-health-check?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pemeriksaan kesehatan API&lt;/a&gt; yang ringan untuk sinyal keaktifan yang lebih cepat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa hasil terjadwal berbeda dari pengujian lokal?
&lt;/h3&gt;

&lt;p&gt;Karena request dikirim dari Runner, bukan dari laptop Anda. Perbedaan jaringan, region, VPN, firewall, DNS, atau proxy dapat memengaruhi respons API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengapa variabel saya diatur ulang pada setiap eksekusi?
&lt;/h3&gt;

&lt;p&gt;Aktifkan &lt;strong&gt;Pertahankan nilai variabel&lt;/strong&gt; di halaman desain Skenario Pengujian. Tanpa opsi ini, setiap eksekusi terjadwal dimulai dengan state baru.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ringkasan
&lt;/h2&gt;

&lt;p&gt;Pengujian API terjadwal membuat kegagalan terlihat lebih cepat:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buat skenario pengujian.&lt;/li&gt;
&lt;li&gt;Daftarkan Runner yang di-host sendiri.&lt;/li&gt;
&lt;li&gt;Buat Tugas Terjadwal.&lt;/li&gt;
&lt;li&gt;Pilih skenario, environment, dan Runner.&lt;/li&gt;
&lt;li&gt;Atur frekuensi eksekusi.&lt;/li&gt;
&lt;li&gt;Hubungkan Slack, email, atau webhook untuk alert kegagalan.&lt;/li&gt;
&lt;li&gt;Gunakan Riwayat Eksekusi untuk debugging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jika Anda ingin menjalankan skenario yang sama dari pipeline, gunakan Apidog CLI bersama cron atau CI. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Unduh Apidog&lt;/a&gt; untuk menyiapkan rangkaian regresi terjadwal pertama Anda.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
