DEV Community

Cover image for Apidog'da Pre-Request ve Post-Response Scriptleri Nasıl Kullanılır
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Apidog'da Pre-Request ve Post-Response Scriptleri Nasıl Kullanılır

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.

Apidog'u bugün deneyin

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:

  1. Ön İşleyici ile HMAC imzası oluşturmayı,
  2. Son İşleyici ile belirteç çıkarmayı ve yanıt doğrulamayı,
  3. Ortak betik mantığını yeniden kullanmayı,
  4. 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:

  1. pm.response, yalnızca Son İşleyicilerde kullanılabilir.
  2. Ön İşleyici ve Son İşleyici arasındaki veri aktarımı değişkenlerle yapılır.
  3. Ö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);
Enter fullscreen mode Exit fullscreen mode

Ardından isteğinizin Headers sekmesine şu başlıkları ekleyin:

X-Timestamp: {{x_timestamp}}
X-Signature: {{x_signature}}
Enter fullscreen mode Exit fullscreen mode

İstek gönderildiğinde akış şu şekilde çalışır:

  1. Ön İşleyici zaman damgasını üretir.
  2. Betik HMAC imzasını hesaplar.
  3. Değerler ortam değişkenlerine kaydedilir.
  4. Apidog, {{x_timestamp}} ve {{x_signature}} yer tutucularını gerçek değerlerle değiştirir.
  5. İ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');
Enter fullscreen mode Exit fullscreen mode

Aşağıdaki alt modül yolu desteklenmez:

require('crypto-js/sha256');
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

Bu betik iki işlem yapar:

  1. pm.test() ve pm.expect() ile yanıtı doğrular.
  2. auth_token değişkenine token’ı kaydeder.

Token kaydedildikten sonra diğer isteklerde aşağıdaki başlığı kullanabilirsiniz:

Authorization: Bearer {{auth_token}}
Enter fullscreen mode Exit fullscreen mode

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.iterationData salt 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:

  1. Genel Betikler çalışır.
  2. Aynı listedeki Özel Betikler çalışır.
  3. 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);
};
Enter fullscreen mode Exit fullscreen mode

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));
Enter fullscreen mode Exit fullscreen mode

Aşağıdaki tanımlar yalnızca kendi betik kapsamlarında kalır:

const sign = function () {};
let sign = function () {};
var sign = function () {};
Enter fullscreen mode Exit fullscreen mode

Ö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
  • lodash
  • moment
  • uuid
  • xml2js
  • cheerio
  • postman-collection
  • atob
  • btoa
  • csv-parse/lib/sync
  • tv4
  • ajv

Ayrıca bazı Node.js yerleşik modülleri kullanılabilir:

path
assert
buffer
util
url
querystring
stream
events
Enter fullscreen mode Exit fullscreen mode

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);
});
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

Standart console.log() da kullanılabilir:

console.log('Current timestamp:', timestamp);
Enter fullscreen mode Exit fullscreen mode

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());
});
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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
});
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

Ö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ış:

  1. İstek gönderilmeden önce zaman damgası, imza veya değişken üretin.
  2. Yanıt alındıktan sonra durum kodunu ve gövdeyi doğrulayın.
  3. Token, kaynak kimliği veya imleç gibi değerleri ortama kaydedin.
  4. Ortak kodu Genel Betiklere taşıyın.
  5. 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)