Beberapa permintaan memerlukan pekerjaan yang harus dilakukan sebelum meninggalkan mesin Anda, dan beberapa memerlukan pekerjaan yang dilakukan saat respons tiba. Sebuah API pembayaran menginginkan tanda tangan HMAC yang dihitung dari timestamp dan rahasia Anda. Sebuah endpoint login mengembalikan token yang diperlukan oleh setiap panggilan berikutnya. Alur checkout harus memastikan respons yang sebenarnya mengembalikan kode 200 dan ID pesanan yang benar. Anda dapat melakukan semua ini secara manual, tetapi itu akan cepat membosankan, dan akan rusak begitu Anda membagikan permintaan tersebut dengan rekan tim.
Skrip memperbaiki masalah itu. Di Apidog, Anda melampirkan potongan kecil JavaScript ke permintaan yang berjalan secara otomatis: satu set sebelum permintaan dikirim, yang lain setelah respons kembali. Jika Anda pernah menulis skrip Postman sebelumnya, keakraban Anda akan terbawa, karena mesin Apidog kompatibel dengan API objek pm yang sama. Panduan ini menjelaskan kedua tahap tersebut dengan contoh realistis: menandatangani permintaan dalam skrip pra-permintaan, lalu mengekstraksi token dalam skrip pasca-respons. Perilaku ini didokumentasikan sepenuhnya di dokumen skrip Apidog, tetapi nama tab dan beberapa perilaku berbeda dari Postman, dan perbedaan tersebut penting.
Apa yang Sebenarnya Dilakukan Skrip Pra dan Pasca
Apidog menjalankan skrip dalam dua tahap, dan menamainya dengan jelas.
Pre Processor berjalan sebelum permintaan dikirim ke server. Di sinilah Anda menyiapkan berbagai hal: membuat timestamp, menghitung tanda tangan, mengatur ID pesanan acak, atau membaca variabel dan membentuknya menjadi header. Respons belum ada pada titik ini, jadi apa pun yang memeriksa respons tidak diizinkan di sini.
Post Processor berjalan setelah respons diterima. Di sinilah Anda memverifikasi apa yang kembali dengan penegasan, dan di mana Anda menarik nilai dari isi untuk digunakan kembali nanti. Ekstrak token otentikasi, ambil ID sumber daya yang baru dibuat, periksa kode status, simpan kursor untuk paginasi.
Dua aturan mengikuti dari pembagian itu. Pertama, pm.response (dengan code, status, headers, responseTime, responseSize, text(), dan json()-nya) hanya berfungsi di Post Processor. Tidak ada respons untuk dibaca sebelum Anda mengirim, jadi memanggilnya di Pre Processor tidak akan membantu Anda. Kedua, variabel adalah cara kedua tahap berkomunikasi. Pre Processor mengatur nilai, permintaan menggunakannya, dan Post Processor dapat membaca atau menimpanya.
Jika Anda berasal dari Postman, perhatikan perubahan label di awal. Tab Apidog adalah Pre Processor dan Post Processor, bukan "Pre-request Script" dan "Tests." Perilakunya sangat mirip, tetapi nama di layar berbeda.
Pengaturan: Buka Permintaan dan Temukan Tabnya
Unduh Apidog untuk mengikuti. Ini gratis dan berjalan di macOS, Windows, dan Linux, jadi dapatkan dari halaman Unduh Apidog jika Anda belum memilikinya.
Buka permintaan API yang ingin Anda skrip di Apidog. Setiap endpoint memiliki tab Pre Processor dan tab Post Processor di samping tab Params, Headers, dan Body yang biasa. Untuk menambahkan logika ke salah satu tahap, buka tab dan pilih tambahkan Skrip Kustom. Itu membuka editor kode tempat Anda menulis JavaScript biasa terhadap objek pm.
Sebelum menulis apa pun, ada baiknya mengetahui di mana nilai-nilai berada. Apidog menyelesaikan variabel dalam urutan prioritas ini:
Variabel Lokal > Variabel Lingkungan > Variabel Global yang Dibagikan dalam Proyek > Variabel Global yang Dibagikan dalam Tim.
Jadi variabel lokal mengungguli variabel lingkungan dengan nama yang sama, dan seterusnya ke bawah daftar. Ingatlah hal itu ketika nilai tidak seperti yang Anda harapkan: sesuatu yang lebih tinggi dalam urutan mungkin membayangi. Jika Anda menginginkan nilai yang bertahan di banyak permintaan, parameter global di Apidog berada lebih rendah dalam urutan prioritas dan menjadi tempat yang baik untuk pengaturan yang stabil di seluruh proyek.
Contoh Pre Processor: Menandatangani Permintaan dengan HMAC
Misalnya Anda memanggil endpoint pembayaran yang mengotentikasi setiap permintaan dengan tanda tangan HMAC-SHA256. Ini adalah pola yang sama yang digunakan banyak penyedia untuk verifikasi webhook, dan dokumen tanda tangan Stripe menjelaskannya dengan baik: server mengharapkan timestamp dan tanda tangan yang dihitung di atas timestamp tersebut ditambah isi permintaan, dengan kunci rahasia API Anda. Anda perlu membangun keduanya baru setiap kali dikirim.
Apidog dilengkapi dengan crypto-js sebagai pustaka bawaan, jadi Anda tidak perlu menginstal apa pun. Buka tab Pre Processor, pilih tambahkan Skrip Kustom, dan tulis ini:
// Pre Processor: menandatangani permintaan sebelum dikirim
const CryptoJS = require('crypto-js');
// timestamp unix saat ini dalam detik
const timestamp = Math.floor(Date.now() / 1000).toString();
// membaca rahasia dari variabel lingkungan
const secret = pm.environment.get('payments_api_secret');
// membangun string untuk ditandatangani: timestamp + baris baru + isi mentah
const body = pm.request.body ? pm.request.body.toString() : '';
const payload = timestamp + '\n' + body;
// menghitung tanda tangan HMAC-SHA256, dikodekan heksadesimal
const signature = CryptoJS.HmacSHA256(payload, secret).toString(CryptoJS.enc.Hex);
// menyimpan kedua nilai sebagai variabel lingkungan untuk digunakan oleh permintaan
pm.environment.set('x_timestamp', timestamp);
pm.environment.set('x_signature', signature);
pm.console.log('Permintaan ditandatangani pada ' + timestamp);
Skrip itu menghitung tanda tangan dan menyimpan timestamp serta tanda tangan ke dalam variabel lingkungan. Sekarang hubungkan keduanya ke dalam permintaan. Di tab Headers, referensikan nilai yang tersimpan dengan sintaksis {{variableName}}:
X-Timestamp: {{x_timestamp}}
X-Signature: {{x_signature}}
Ketika Anda mengirim, Apidog menjalankan Pre Processor terlebih dahulu, mengatur dua variabel, lalu menggantinya ke dalam header. Server mendapatkan tanda tangan yang valid pada waktu pengiriman, setiap saat, tanpa langkah manual. Perhatikan panggilan require('crypto-js') menarik seluruh modul. Anda mengimpor seluruh pustaka, bukan submodul, jadi require('crypto-js') berfungsi dan require('crypto-js/sha256') tidak.
Satu hal yang perlu diperhatikan: operasi variabel hanya menyentuh nilai saat ini, bukan nilai awal yang mungkin Anda ketikkan ke editor lingkungan. Itulah yang Anda inginkan di sini, karena tanda tangan dimaksudkan untuk bersifat sementara. Jika Anda memerlukan pola penandatanganan yang dijelaskan untuk sisi Postman juga, panduan tentang skrip pra-permintaan Postman mencakup ide yang sama dengan label Postman, dan itu memetakan dengan jelas ke Pre Processor Apidog.
Contoh Post Processor: Mengekstrak Token dan Menegaskan
Sekarang tahap yang lain. Bayangkan permintaan login yang mengembalikan token yang Anda butuhkan untuk setiap panggilan terautentikasi setelahnya:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": { "id": 4812, "email": "dana@example.com" },
"expires_in": 3600
}
Buka tab Post Processor, pilih tambahkan Skrip Kustom, dan tarik token dari isi, menyimpannya untuk permintaan selanjutnya:
// Post Processor: verifikasi respons, lalu ekstrak token
pm.test('Status adalah 200', function () {
pm.response.to.have.status(200);
});
const jsonData = pm.response.json();
pm.test('Respons mengembalikan token', function () {
pm.expect(jsonData.token).to.be.a('string').and.not.empty;
});
pm.test('ID pengguna ada', function () {
pm.expect(jsonData.user.id).to.be.a('number');
});
// menyimpan token agar permintaan lain dapat mengirimnya
pm.environment.set('auth_token', jsonData.token);
pm.console.log('Token tersimpan untuk pengguna ' + jsonData.user.email);
Dua hal terjadi di sini. Blok pm.test() menegaskan bahwa respons berbentuk seperti yang Anda harapkan, menggunakan pembanding pm.expect() gaya Chai yang didukung secara native oleh Apidog. Dan pm.environment.set('auth_token', jsonData.token) menyimpan token ke dalam lingkungan. Setiap permintaan selanjutnya sekarang dapat mengirim Authorization: Bearer {{auth_token}} tanpa Anda menyalin apa pun secara manual.
Separuh penegasan ini patut mendapat perhatian tersendiri. Pemeriksaan pasca-respons yang baik adalah apa yang mengubah klik-dan-lihat manual menjadi pengujian nyata, dan panduan kami tentang penegasan API di Apidog menjelaskan lebih dalam tentang pembanding dan pola yang perlu diketahui. Jika Anda juga ingin memasukkan data palsu yang realistis ke dalam alur ini, Faker.js di Apidog sangat cocok dengan pengaturan variabel yang ditunjukkan di atas.
Beberapa perilaku yang perlu diperhatikan di Post Processor. pm.iterationData (data uji Anda) bersifat hanya-baca, sehingga Anda dapat membaca nilai yang didorong data tetapi Anda tidak dapat menulis kembali ke sana dari skrip. Dan pm.cookies mengembalikan cookie dari respons, yang dikirim kembali oleh server, bukan cookie yang keluar dengan permintaan Anda.
Menggunakan Kembali Logika dengan Skrip Publik
Setelah Anda menulis blok penandatanganan HMAC itu, Anda mungkin menginginkannya di lebih dari satu permintaan. Menyalin-tempelkannya ke sepuluh endpoint berarti sepuluh tempat untuk diperbaiki ketika algoritma berubah. Jawaban Apidog adalah Skrip Publik: cuplikan yang dapat digunakan kembali yang Anda tulis sekali dan lampirkan di mana pun diperlukan.
Buat satu di bawah Settings > Public Scripts, lalu tambahkan ke tab Pre Processor atau Post Processor dari permintaan. Di dalam daftar prosesor, Skrip Publik dan Skrip Kustom berdampingan, dan urutan itu penting: skrip publik dieksekusi sebelum skrip kustom dalam daftar yang sama, dan jika Anda memiliki beberapa skrip publik, mereka berjalan dari atas ke bawah sesuai urutan yang terdaftar.
Ada satu jebakan yang sering membingungkan orang. Jika Anda ingin Skrip Kustom memanggil fungsi yang didefinisikan dalam Skrip Publik, fungsi itu harus bersifat global. Deklarasi function normal atau fungsi yang terikat const bersifat lokal untuk skripnya sendiri dan tidak terlihat oleh skrip berikutnya. Deklarasikan dengan menetapkan tanpa var, let, atau const:
// Dalam Skrip Publik: jadikan sign() global dengan menghilangkan kata kunci
sign = function (payload, secret) {
const CryptoJS = require('crypto-js');
return CryptoJS.HmacSHA256(payload, secret).toString(CryptoJS.enc.Hex);
};
// Dalam Skrip Kustom di bawahnya: panggil fungsi global berdasarkan nama
const timestamp = Math.floor(Date.now() / 1000).toString();
const secret = pm.environment.get('payments_api_secret');
pm.environment.set('x_timestamp', timestamp);
pm.environment.set('x_signature', sign(timestamp, secret));
Tambahkan Skrip Publik terlebih dahulu, letakkan Skrip Kustom di bawahnya, dan panggilan akan diselesaikan. Jika urutan salah atau Anda menambahkan const, Anda akan mendapatkan kesalahan fungsi yang tidak terdefinisi.
Pustaka, Paket Eksternal, dan Debugging
Impor crypto-js di atas adalah salah satu dari sekumpulan pustaka yang dibundel Apidog tanpa pengaturan. Anda dapat require() salah satunya secara langsung:
crypto-js(v3.1.9-1) untuk hashing dan HMACjsrsasign(v10.3.0) untuk pekerjaan JWT dan RSA, yang membutuhkan Apidog 1.4.5 atau yang lebih baruchai(v4.2.0) untuk pembanding penegasanlodash,moment,uuid,xml2js,cheerio,postman-collection,atob,btoa,csv-parse/lib/sync,tv4,ajv- Bawaan Node seperti
path,assert,buffer,util,url,querystring,stream, danevents
Jika Anda memerlukan sesuatu yang tidak ada dalam daftar itu, tarik pada saat runtime dengan $$.liveRequire(), yang mengambil paket dengan cepat:
$$.liveRequire('nanoid', (nanoid) => {
const id = nanoid.nanoid();
pm.environment.set('request_id', id);
});
Jalur itu membutuhkan koneksi internet, karena Apidog mengunduh paket saat skrip berjalan. Pustaka yang dibundel tidak memerlukan itu.
Ketika skrip tidak berfungsi dengan baik, catatlah jalan keluarnya. Baik pm.console.log() maupun console.log() biasa akan mencetak ke konsol Apidog, sehingga Anda dapat membuang tanda tangan yang dihitung atau bidang yang diekstraksi dan melihat dengan tepat apa yang dihasilkan skrip sebelum permintaan keluar atau setelah kembali.
Dua batasan lagi yang patut disebut agar tidak mengejutkan Anda. pm.sendRequest(), untuk menembakkan panggilan HTTP tambahan di dalam skrip, menggunakan pola callback daripada Promises, jadi tulis dengan callback, bukan await. Dan pm.nextRequest() Postman untuk merangkai permintaan tidak didukung di sini. Ketika Anda membutuhkan orkestrasi alur kerja nyata, dengan percabangan dan langkah-langkah kondisional, Apidog menggunakan Skenario Uji sebagai gantinya, di mana Anda mengurutkan permintaan secara visual dengan langkah-langkah Kondisi dan If-Else. Jika Anda banyak menulis skrip, Generator Skrip Apidog bawaan juga dapat membuat draf dari deskripsi bahasa alami untuk memberi Anda titik awal.
Otomatiskan Alur Kerja dengan Apidog CLI
Skrip tidak hanya berjalan saat Anda mengklik Kirim. Ketika Anda mengemas permintaan dan penegasan Anda ke dalam Skenario Uji yang disimpan, Apidog CLI menjalankan seluruh skenario itu secara headless, termasuk Pre Processor dan Post Processor, itulah yang menjadikan logika penandatanganan dan ekstraksi token Anda bagian dari CI alih-alih langkah manual.
Instal CLI dan otentikasi, lalu jalankan skenario berdasarkan ID:
npm install -g apidog-cli
apidog login --with-token <TOKEN_AKSES_ANDA>
apidog run --access-token $APIDOG_ACCESS_TOKEN -t <ID_SKENARIO> -e <ID_LINGKUNGAN> -r cli
Flag -t adalah ID skenario uji, -e adalah ID lingkungan, dan -r memilih reporter (cli, html, atau junit, dipisahkan koma untuk beberapa). Hasilkan token akses di pengaturan akun Apidog Anda, ekspor sebagai APIDOG_ACCESS_TOKEN, dan skenario yang sama yang berjalan di desktop Anda sekarang berjalan di CI, termasuk Pre Processor dan Post Processor.
Satu peringatan jujur: skrip yang mengandalkan sesuatu yang hanya ada di mesin Anda, file lokal atau paket yang Anda muat sekali, dapat lulus di aplikasi desktop dan kemudian gagal di CLI, karena runner tidak memiliki dependensi itu. Jaga agar skrip tetap menggunakan pustaka yang dibundel atau $$.liveRequire() agar berjalan sama di mana saja.
FAQ
Apakah skrip Apidog kompatibel dengan skrip Postman saya yang sudah ada?
Sebagian besar ya. Mesin Apidog menggunakan API objek pm yang sama, sehingga pm.environment.set(), pm.response.json(), pm.test(), dan pm.expect() semuanya berperilaku seperti yang Anda tahu. Dua perbedaan yang perlu diingat adalah nama tab, Pre Processor dan Post Processor daripada Pre-request Script dan Tests, dan beberapa panggilan yang tidak didukung seperti pm.nextRequest(). Sebagian besar skrip dapat disalin dan dijalankan.
Mengapa pm.response mengembalikan `undefined` di skrip pra-permintaan saya?
Karena belum ada respons. Pre Processor berjalan sebelum permintaan dikirim, jadi belum ada yang kembali untuk diperiksa. Kode apa pun yang membaca pm.response (status, isi, header-nya) termasuk dalam Post Processor. Jika Anda memerlukan nilai pada tahap pra, ambil dari pm.request, variabel, atau pustaka sebagai gantinya.
Bagaimana cara membagikan satu skrip ke banyak permintaan?
Gunakan Skrip Publik di bawah Settings > Public Scripts. Tulis logikanya sekali, lampirkan ke tab Pre Processor atau Post Processor setiap permintaan, dan ingat bahwa skrip publik berjalan sebelum skrip kustom dalam daftar yang sama. Untuk memanggil fungsi Skrip Publik dari Skrip Kustom, deklarasikan sebagai global dengan menetapkan tanpa var, let, atau const.
Bisakah saya mengimpor paket npm yang tidak dibundel Apidog?
Ya, dengan $$.liveRequire('nama-paket', (pkg) => { ... }), yang mengunduh paket saat runtime dan membutuhkan koneksi internet. Untuk apa pun dalam daftar bawaan, seperti crypto-js, moment, atau uuid, gunakan require() biasa tanpa perlu jaringan. Perhatikan Anda hanya dapat membutuhkan seluruh modul, bukan jalur submodul.
Di mana saya melihat apa yang dicetak skrip saya?
Gunakan pm.console.log() atau console.log() dan baca keluarannya di konsol Apidog setelah Anda mengirim permintaan. Ini adalah cara tercepat untuk mengonfirmasi tanda tangan dihitung atau token diekstrak sebelum Anda mempercayainya dalam skenario.
Kesimpulan
Pre Processor dan Post Processor mengubah permintaan statis menjadi permintaan yang mempersiapkan dirinya sendiri dan memeriksa pekerjaannya sendiri. Tandatangani sebelum Anda mengirim, ekstrak dan tegaskan setelah Anda menerima, dan angkat logika bersama ke Skrip Publik agar Anda menuliskannya sekali. API pm dan pustaka yang dibundel berarti sebagian besar yang Anda ketahui dari Postman dapat langsung digunakan. Buka Apidog, pilih permintaan apa pun, dan tambahkan Skrip Kustom pertama Anda untuk melihat kedua tahap berjalan dalam satu pengiriman. Ini gratis untuk memulai, tidak diperlukan kartu kredit.
