Bazı isteklerin makinenizden ayrılmadan önce hazırlanması, bazı yanıtların da gelir gelmez doğrulanması gerekir. Örneğin bir ödeme API’si zaman damgası ve sırrınızdan üretilen HMAC imzası isteyebilir; bir giriş uç noktası sonraki çağrılarda kullanılacak bir belirteç (token) döndürebilir. Bunları elle yönetebilirsiniz, ancak istekleri ekip içinde paylaştığınızda süreç hızla kırılganlaşır.
Betikler bu süreci otomatikleştirir. Apidog’da bir isteğe otomatik çalışan küçük JavaScript parçaları eklersiniz:
- Ön İşleyici (Pre Processor): İstek gönderilmeden önce çalışır.
- Son İşleyici (Post Processor): Yanıt alındıktan sonra çalışır.
Daha önce Postman betikleri yazdıysanız, Apidog’un aynı pm nesne API’siyle uyumlu yapısı sayesinde mevcut bilginizi doğrudan kullanabilirsiniz. Bu rehberde:
- Ön İşleyici ile HMAC imzası oluşturmayı,
- Son İşleyici ile belirteç çıkarmayı ve yanıt doğrulamayı,
- Ortak betik mantığını yeniden kullanmayı,
- Betikleri CLI ile CI ortamında çalıştırmayı
uygulamalı olarak ele alacağız.
Apidog’un betikleme davranışlarının tamamı Apidog betikleme belgelerinde yer alır. Ancak Postman’dan farklı sekme adları ve bazı çalışma zamanı farkları vardır.
Ön ve Son Betikler Gerçekte Ne Yapar?
Apidog betikleri iki aşamada çalıştırır.
Ön İşleyiciler (Pre Processors)
Ön İşleyiciler, istek sunucuya gönderilmeden önce çalışır. Bu aşamada şunları yapabilirsiniz:
- Zaman damgası üretmek
- HMAC veya JWT imzası hesaplamak
- Rastgele sipariş kimliği oluşturmak
- Değişken okuyup HTTP başlığına aktarmak
- İstek gövdesini veya parametrelerini hazırlamak
Bu aşamada henüz yanıt olmadığı için pm.response kullanılamaz.
Son İşleyiciler (Post Processors)
Son İşleyiciler, API yanıtı alındıktan sonra çalışır. Bu aşamada şunları yapabilirsiniz:
- Durum kodunu doğrulamak
- Yanıt gövdesinden token çıkarmak
- Oluşturulan kaynak kimliğini saklamak
- Sayfalama imlecini kaydetmek
- Yanıt süresi ve yanıt gövdesi üzerinde test çalıştırmak
Önemli kurallar:
-
pm.response, yalnızca Son İşleyicilerde kullanılabilir. - Ön İşleyici ve Son İşleyici arasındaki veri aktarımı değişkenlerle yapılır.
- Ön İşleyici değişken ayarlar, istek bu değişkeni kullanır, Son İşleyici ise değeri okuyabilir veya güncelleyebilir.
Postman kullanıyorsanız sekme isimlerine dikkat edin:
| Postman | Apidog |
|---|---|
| Pre-request Script | Ön İşleyiciler (Pre Processors) |
| Tests | Son İşleyiciler (Post Processors) |
Kurulum: İsteği Açın ve Betik Sekmelerini Bulun
Henüz kurmadıysanız Apidog İndirme sayfasından uygulamayı indirin. Apidog macOS, Windows ve Linux üzerinde çalışır.
Apidog içinde betik eklemek istediğiniz API isteğini açın. Her uç noktada standart Params, Headers ve Body sekmelerine ek olarak şunları görürsünüz:
- Ön İşleyiciler (Pre Processors)
- Son İşleyiciler (Post Processors)
Bir aşamaya kod eklemek için ilgili sekmeyi açın ve Özel Bir Betik Ekle (Add a Custom Script) seçeneğini kullanın.
Betiklerde değişken çözümleme önceliği aşağıdaki gibidir:
Yerel Değişkenler > Ortam Değişkenleri > Proje İçinde Paylaşılan Genel Değişkenler > Ekip İçinde Paylaşılan Genel Değişkenler
Aynı ada sahip bir yerel değişken, ortam değişkenini gölgeler. Beklenmeyen bir değer görürseniz daha yüksek öncelikli bir değişkenin aynı adı kullanıp kullanmadığını kontrol edin.
Birden fazla istekte kullanılacak sabit ayarlar için Apidog’daki genel parametreleri kullanabilirsiniz.
Ön İşleyici Örneği: İsteği HMAC ile İmzalama
Her isteği HMAC-SHA256 ile doğrulayan bir ödeme API’sine istek attığınızı varsayalım. Sunucu aşağıdaki bileşenleri bekliyor olsun:
- Unix zaman damgası
- İstek gövdesi
- API sırrı ile hesaplanan HMAC imzası
Bu yaklaşım webhook doğrulamalarında da yaygındır. Örneğin Stripe imza belgeleri, zaman damgası ve istek gövdesinden üretilen imza akışını açıklar.
Apidog, crypto-js kütüphanesini yerleşik olarak sunar. Ek paket kurmadan Ön İşleyiciye aşağıdaki kodu ekleyin:
// Ön İşleyici: istek gönderilmeden önce isteği imzala
const CryptoJS = require('crypto-js');
// Saniye cinsinden mevcut Unix zaman damgası
const timestamp = Math.floor(Date.now() / 1000).toString();
// Sırrı ortam değişkeninden oku
const secret = pm.environment.get('payments_api_secret');
// İmzalanacak metni oluştur: zaman damgası + yeni satır + ham gövde
const body = pm.request.body ? pm.request.body.toString() : '';
const payload = timestamp + '\n' + body;
// HMAC-SHA256 imzasını hex biçiminde hesapla
const signature = CryptoJS
.HmacSHA256(payload, secret)
.toString(CryptoJS.enc.Hex);
// İsteğin kullanması için değişkenleri kaydet
pm.environment.set('x_timestamp', timestamp);
pm.environment.set('x_signature', signature);
pm.console.log('Signed request at ' + timestamp);
Ardından isteğinizin Headers sekmesine şu başlıkları ekleyin:
X-Timestamp: {{x_timestamp}}
X-Signature: {{x_signature}}
İstek gönderildiğinde akış şu şekilde çalışır:
- Ön İşleyici zaman damgasını üretir.
- Betik HMAC imzasını hesaplar.
- Değerler ortam değişkenlerine kaydedilir.
- Apidog,
{{x_timestamp}}ve{{x_signature}}yer tutucularını gerçek değerlerle değiştirir. - İstek güncel imzayla sunucuya gönderilir.
crypto-js kullanırken tüm modülü içe aktarmanız gerekir:
const CryptoJS = require('crypto-js');
Aşağıdaki alt modül yolu desteklenmez:
require('crypto-js/sha256');
Değişken işlemleri, ortam düzenleyicisindeki başlangıç değerleri yerine mevcut çalışma zamanı değerlerini etkiler. İmza gibi her istekte yeniden üretilmesi gereken değerler için bu davranış uygundur.
Postman tarafındaki aynı yaklaşımı incelemek isterseniz Postman ön istek betikleri rehberine bakabilirsiniz.
Son İşleyici Örneği: Token Çıkarma ve Yanıt Doğrulama
Bir giriş isteğinin aşağıdaki yanıtı döndürdüğünü düşünün:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 4812,
"email": "dana@example.com"
},
"expires_in": 3600
}
Bu yanıttan token’ı çıkarıp sonraki çağrılarda kullanmak ve yanıtın beklenen yapıda olduğunu doğrulamak için Son İşleyiciler sekmesine şu kodu ekleyin:
// Son İşleyici: yanıtı doğrula, ardından token'ı çıkar
pm.test('Status is 200', function () {
pm.response.to.have.status(200);
});
const jsonData = pm.response.json();
pm.test('Response returns a token', function () {
pm.expect(jsonData.token).to.be.a('string').and.not.empty;
});
pm.test('User id is present', function () {
pm.expect(jsonData.user.id).to.be.a('number');
});
// Diğer isteklerin kullanabilmesi için token'ı kaydet
pm.environment.set('auth_token', jsonData.token);
pm.console.log('Saved token for user ' + jsonData.user.email);
Bu betik iki işlem yapar:
-
pm.test()vepm.expect()ile yanıtı doğrular. -
auth_tokendeğişkenine token’ı kaydeder.
Token kaydedildikten sonra diğer isteklerde aşağıdaki başlığı kullanabilirsiniz:
Authorization: Bearer {{auth_token}}
Böylece token’ı elle kopyalayıp yapıştırmanız gerekmez.
Daha kapsamlı doğrulama örnekleri için Apidog’daki API doğrulamaları rehberini inceleyin. Gerçekçi test verileri üretmek için Apidog’da Faker.js de değişken tabanlı bu akışla birlikte kullanılabilir.
Son İşleyicilerde dikkat edilmesi gerekenler:
-
pm.iterationDatasalt okunurdur. Test verisini okuyabilirsiniz ancak betikten geri yazamazsınız. -
pm.cookies, istekle gönderdiğiniz çerezleri değil, sunucunun yanıtta geri gönderdiği çerezleri döndürür.
Mantığı Genel Betikler ile Yeniden Kullanma
HMAC imzalama kodunu birden çok uç noktada kullanacaksanız, aynı kodu her isteğe kopyalamayın. Algoritma değiştiğinde tüm kopyaları güncellemeniz gerekir.
Bunun yerine Ayarlar (Settings) > Genel Betikler (Public Scripts) altında yeniden kullanılabilir bir betik oluşturun.
Genel Betiği daha sonra bir isteğin:
- Ön İşleyiciler sekmesine veya
- Son İşleyiciler sekmesine
ekleyebilirsiniz.
Çalışma sırası önemlidir:
- Genel Betikler çalışır.
- Aynı listedeki Özel Betikler çalışır.
- Birden fazla Genel Betik varsa yukarıdan aşağıya yürütülür.
Bir Genel Betikteki fonksiyonu sonraki Özel Betikte çağırmak istiyorsanız fonksiyonu global tanımlamanız gerekir.
// Genel Betikte: sign() fonksiyonunu global tanımla
sign = function (payload, secret) {
const CryptoJS = require('crypto-js');
return CryptoJS
.HmacSHA256(payload, secret)
.toString(CryptoJS.enc.Hex);
};
Aynı işlemci listesine, Genel Betiğin altına şu Özel Betiği ekleyin:
// Özel Betikte: global sign() fonksiyonunu çağır
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));
Aşağıdaki tanımlar yalnızca kendi betik kapsamlarında kalır:
const sign = function () {};
let sign = function () {};
var sign = function () {};
Özel Betikten çağırılacak ortak bir fonksiyon için anahtar kelime kullanmadan atama yapın. Ayrıca Genel Betiğin, onu kullanan Özel Betikten önce çalıştığından emin olun.
Kütüphaneler, Harici Paketler ve Hata Ayıklama
Apidog bazı kütüphaneleri yerleşik olarak sunar. Bunları doğrudan require() ile çağırabilirsiniz:
-
crypto-js(v3.1.9-1): Hash ve HMAC işlemleri -
jsrsasign(v10.3.0): JWT ve RSA işlemleri; Apidog 1.4.5 veya sonrasını gerektirir -
chai(v4.2.0): Doğrulama eşleştiricileri lodashmomentuuidxml2jscheeriopostman-collectionatobbtoacsv-parse/lib/synctv4ajv
Ayrıca bazı Node.js yerleşik modülleri kullanılabilir:
path
assert
buffer
util
url
querystring
stream
events
Yerleşik listede olmayan bir npm paketini çalışma anında $$.liveRequire() ile yükleyebilirsiniz:
$$.liveRequire('nanoid', (nanoid) => {
const id = nanoid.nanoid();
pm.environment.set('request_id', id);
});
Bu yöntem paketi çalışma zamanında indirdiği için internet bağlantısı gerektirir. Yerleşik kütüphaneler için internet bağlantısına ihtiyaç yoktur.
Betik Hatalarını Konsoldan İnceleme
Betik beklediğiniz gibi çalışmıyorsa hesaplanan değerleri konsola yazdırın:
pm.console.log('Signature:', signature);
pm.console.log('Token:', jsonData.token);
Standart console.log() da kullanılabilir:
console.log('Current timestamp:', timestamp);
Apidog konsolunda şunları kontrol edebilirsiniz:
- Üretilen imza
- Okunan ortam değişkeni
- Çıkarılan token
- Yanıt gövdesi
- Betik çalıştırma hataları
Bilmeniz Gereken Sınırlamalar
Bir betik içinde ek HTTP isteği göndermek için pm.sendRequest() kullanabilirsiniz. Ancak bu API Promise tabanlı değildir; await yerine callback kullanmanız gerekir.
pm.sendRequest('https://example.com/api/config', function (error, response) {
if (error) {
console.log(error);
return;
}
console.log(response.json());
});
Postman’daki pm.nextRequest() Apidog’da desteklenmez.
Koşullu dallanma veya çok adımlı akışlar için Test Senaryolarını kullanın. Test Senaryolarında istekleri görsel olarak sıralayabilir, Koşul ve Eğer-Değilse adımları ekleyebilirsiniz.
Çok sayıda betik yazıyorsanız Apidog’un yerleşik Betik Oluşturucusunu kullanarak doğal dil açıklamasından başlangıç betiği de oluşturabilirsiniz.
İş Akışını Apidog CLI ile Otomatikleştirme
Betikler yalnızca arayüzde Gönder düğmesine bastığınızda çalışmaz. İsteklerinizi bir Test Senaryosu içinde kaydederseniz, Apidog CLI bu senaryoyu başsız olarak çalıştırabilir.
Bu işlem Ön İşleyicileri ve Son İşleyicileri de kapsar. Böylece imza oluşturma, token çıkarma ve doğrulama mantığını CI sürecine dahil edebilirsiniz.
npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>
apidog run \
--access-token $APIDOG_ACCESS_TOKEN \
-t <SCENARIO_ID> \
-e <ENV_ID> \
-r cli
Parametreler:
| Bayrak | Açıklama |
|---|---|
-t |
Test senaryosu kimliği |
-e |
Ortam kimliği |
-r |
Raporlayıcı türü |
Desteklenen raporlayıcılar:
cli
html
junit
Birden fazla raporlayıcıyı virgülle ayırabilirsiniz.
Erişim token’ını Apidog hesap ayarlarından oluşturun ve CI ortamında APIDOG_ACCESS_TOKEN olarak tanımlayın.
Yerel dosyalara veya yalnızca masaüstü uygulamasında bulunan bağımlılıklara dayanan betikler CLI ortamında başarısız olabilir. Betiklerin hem yerelde hem CI’da tutarlı çalışması için yerleşik kütüphaneleri veya $$.liveRequire() yaklaşımını tercih edin.
Sıkça Sorulan Sorular
Apidog betikleri mevcut Postman betiklerimle uyumlu mu?
Çoğunlukla evet. Apidog aynı pm nesne API’sini kullandığı için aşağıdaki çağrılar benzer şekilde çalışır:
pm.environment.set()
pm.response.json()
pm.test()
pm.expect()
Başlıca farklar sekme adları ve pm.nextRequest() gibi desteklenmeyen bazı çağrılardır.
Ön istek betiğimde neden pm.response tanımsız dönüyor?
Çünkü yanıt henüz alınmamıştır. Ön İşleyiciler istek gönderilmeden önce çalışır.
Yanıt durumunu, gövdesini veya başlıklarını kontrol eden kodu Son İşleyiciye taşıyın. Ön aşamada ihtiyacınız olan değerleri pm.request, değişkenler veya bir kütüphane üzerinden okuyun.
Bir betiği birden çok istek arasında nasıl paylaşırım?
Ayarlar (Settings) > Genel Betikler (Public Scripts) altından Genel Betik oluşturun. Ortak mantığı bir kez yazıp birden fazla isteğin Ön İşleyicilerine veya Son İşleyicilerine ekleyin.
Genel Betik fonksiyonunu Özel Betikten çağıracaksanız, fonksiyonu global olarak tanımlayın ve Genel Betiğin önce çalıştığından emin olun.
Apidog’un yerleşik olarak sunmadığı bir npm paketini içe aktarabilir miyim?
Evet. Çalışma zamanında paket indiren $$.liveRequire() fonksiyonunu kullanın:
$$.liveRequire('paket-adı', (pkg) => {
// Paketle işlem yapın
});
Bu yöntem internet bağlantısı gerektirir. crypto-js, moment ve uuid gibi yerleşik paketler için doğrudan require() kullanın.
Betiğimin ürettiği çıktıyı nerede görebilirim?
pm.console.log() veya console.log() kullanın. İstek çalıştıktan sonra Apidog konsolunda betik çıktısını inceleyin.
pm.console.log('Generated signature:', signature);
Özet
Ön İşleyiciler ve Son İşleyiciler, statik API isteklerini kendini hazırlayan ve sonucunu doğrulayan akışlara dönüştürür.
Uygulanabilir temel akış:
- İstek gönderilmeden önce zaman damgası, imza veya değişken üretin.
- Yanıt alındıktan sonra durum kodunu ve gövdeyi doğrulayın.
- Token, kaynak kimliği veya imleç gibi değerleri ortama kaydedin.
- Ortak kodu Genel Betiklere taşıyın.
- Test Senaryoları ve CLI ile akışı CI ortamında çalıştırın.
Apidog’u açın, bir istek seçin ve ilk Ön İşleyici veya Son İşleyici betiğinizi ekleyerek bu akışı uygulayın.
Top comments (0)