REST API Test Araçları: Postman ve curl Kullanımı
Bir API’nin gerçekten çalışıp çalışmadığını anlamanın en hızlı yolu onu test etmektir. Dokümantasyon güzel yazılmış olabilir, geliştirici “hazır” demiş olabilir, ama uç noktanın gerçek davranışını görene kadar hiçbir şey kesin değildir. İşte bu yüzden REST API test araçları bir sysadmin’in toolbox’ında olmazsa olmaz bir yer tutar. Bu yazıda hem terminal severlerin vazgeçilmezi curl‘ü hem de görsel arayüzüyle hayatı kolaylaştıran Postman‘ı ele alacağız. Otomasyon scriptlerinden güvenlik testlerine, environment yönetiminden CI/CD entegrasyonuna kadar gerçek dünya senaryolarıyla ilerleyeceğiz.
curl: Terminal’in İsviçre Çakısı
curl, “Client URL” kelimesinin kısaltmasıdır ve 1997’den beri hayatımızda. Neredeyse her Linux dağıtımında kurulu gelir, Windows’ta da artık varsayılan olarak mevcut. Sunucuya SSH bağlandığınızda, bir Docker container içinde debug yaparken ya da bir bash script yazarken curl’den başka bir şeye ihtiyaç duymayacaksınız.
Temel HTTP İstekleri
En basit GET isteğiyle başlayalım:
# Basit GET isteği
curl https://api.example.com/users
# Yanıtı daha okunabilir görmek için
curl -s https://api.example.com/users | python3 -m json.tool
# HTTP durum kodunu ve header'ları görmek için
curl -i https://api.example.com/users
# Sadece header'ları görmek için
curl -I https://api.example.com/users
# Verbose mod - her şeyi göster
curl -v https://api.example.com/users
POST isteği gönderirken JSON body kullanmak en yaygın senaryo:
# JSON body ile POST isteği
curl -X POST https://api.example.com/users
-H "Content-Type: application/json"
-H "Accept: application/json"
-d '{
"username": "ahmet.yilmaz",
"email": "[email protected]",
"role": "editor"
}'
# Dosyadan JSON okuyarak POST
curl -X POST https://api.example.com/users
-H "Content-Type: application/json"
-d @user_payload.json
# PUT ile güncelleme
curl -X PUT https://api.example.com/users/42
-H "Content-Type: application/json"
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
-d '{"role": "admin"}'
# DELETE isteği
curl -X DELETE https://api.example.com/users/42
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
Kimlik Doğrulama Yöntemleri
API güvenliği söz konusu olduğunda farklı auth mekanizmalarıyla çalışmanız gerekir:
# Basic Authentication
curl -u kullanici:sifre https://api.example.com/protected
# Bearer Token (JWT)
curl -H "Authorization: Bearer TOKEN_BURAYA" https://api.example.com/protected
# API Key header olarak
curl -H "X-API-Key: api_key_buraya" https://api.example.com/data
# API Key query parameter olarak
curl "https://api.example.com/data?api_key=api_key_buraya"
# OAuth2 token almak için
curl -X POST https://auth.example.com/oauth/token
-H "Content-Type: application/x-www-form-urlencoded"
-d "grant_type=client_credentials"
-d "client_id=CLIENT_ID"
-d "client_secret=CLIENT_SECRET"
curl ile Gerçek Dünya: Monitoring Script’i
Üretim ortamında API sağlıklığını izlemek için basit ama etkili bir script:
#!/bin/bash
# api_health_check.sh - API endpoint monitoring script
API_BASE="https://api.example.com"
SLACK_WEBHOOK="https://hooks.slack.com/services/XXX/YYY/ZZZ"
LOG_FILE="/var/log/api_health.log"
check_endpoint() {
local endpoint=$1
local expected_status=$2
local description=$3
# Timeout 10 saniye, sessiz mod, HTTP durum kodunu al
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}"
--connect-timeout 5
--max-time 10
-H "Authorization: Bearer ${API_TOKEN}"
"${API_BASE}${endpoint}")
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
if [ "$HTTP_STATUS" -eq "$expected_status" ]; then
echo "${TIMESTAMP} - OK: ${description} (${HTTP_STATUS})" >> $LOG_FILE
else
echo "${TIMESTAMP} - FAIL: ${description} beklenen ${expected_status}, alınan ${HTTP_STATUS}" >> $LOG_FILE
# Slack'e bildirim gönder
curl -s -X POST $SLACK_WEBHOOK
-H "Content-Type: application/json"
-d "{"text": ":red_circle: API Uyarı: ${description} - HTTP ${HTTP_STATUS}"}"
fi
}
# Endpoint'leri kontrol et
check_endpoint "/health" 200 "Health Check"
check_endpoint "/api/v1/users" 200 "Users API"
check_endpoint "/api/v1/products" 200 "Products API"
check_endpoint "/api/v1/nonexistent" 404 "404 Kontrolü"
Bu scripti crontab’a ekleyerek her 5 dakikada bir çalıştırabilirsiniz:
*/5 * * * * /usr/local/bin/api_health_check.sh
curl’ün Önemli Parametreleri
Sık kullanacağınız parametreleri öğrenmek işinizi çok kolaylaştırır:
- -X: HTTP metodunu belirtir (GET, POST, PUT, DELETE, PATCH)
- -H: Header ekler, birden fazla kez kullanılabilir
- -d: Request body gönderir
- -o: Yanıtı dosyaya yazar
- -s: Silent mod, progress bar göstermez
- -i: Response header’larını çıktıya dahil eder
- -v: Verbose mod, request/response detaylarını gösterir
- -L: Redirect’leri takip eder
- -k: SSL sertifika doğrulamasını atlar (sadece test ortamında!)
- –connect-timeout: Bağlantı zaman aşımı saniye cinsinden
- –max-time: Toplam istek zaman aşımı
- -w: Yanıt hakkında formatlanmış bilgi yazdırır
- -b: Cookie gönderir
- -c: Cookie’leri dosyaya kaydeder
- –compressed: Sıkıştırılmış yanıt ister
Postman: Görsel API Test Ortamı
curl güçlüdür ama karmaşık API akışlarını yönetmek, ekip içinde testleri paylaşmak ve dokümantasyon oluşturmak için Postman daha uygun bir araçtır. Üstelik Postman’ın sunduğu environment yönetimi, otomatik test yazma ve collection özelliği onu bir sysadmin için de değerli kılar.
Environment ve Variable Yönetimi
Postman’ın en güçlü özelliklerinden biri environment yönetimidir. Development, staging ve production için ayrı environment’lar oluşturarak aynı collection’ı farklı ortamlarda kullanabilirsiniz.
Environment variable’ları şu şekilde kullanırsınız:
Base URL: {{base_url}}
Token: {{auth_token}}
User ID: {{user_id}}
Pre-request Script ile dinamik değerler oluşturabilirsiniz:
// Pre-request Script - her istekten önce çalışır
const timestamp = new Date().toISOString();
pm.environment.set("timestamp", timestamp);
// HMAC imzası oluşturma örneği
const crypto = require('crypto-js');
const secret = pm.environment.get("api_secret");
const message = pm.environment.get("user_id") + timestamp;
const signature = crypto.HmacSHA256(message, secret).toString();
pm.environment.set("signature", signature);
Test Yazımı: Postman Test Scripts
Postman’da her request için otomatik testler yazabilirsiniz. Bu özellik, regression testlerini manuel çalıştırmak yerine otomatize etmenizi sağlar:
// Tests sekmesine yazılan örnek test scripti
// Durum kodu kontrolü
pm.test("Status code 200 olmalı", function () {
pm.response.to.have.status(200);
});
// Response time kontrolü
pm.test("Yanıt süresi 500ms altında olmalı", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});
// JSON yapısı kontrolü
pm.test("Response body JSON olmalı", function () {
pm.response.to.be.json;
});
// Belirli bir field kontrolü
pm.test("users array boş olmamalı", function () {
const jsonData = pm.response.json();
pm.expect(jsonData.users).to.be.an('array').that.is.not.empty;
});
// Header kontrolü
pm.test("Content-Type header doğru olmalı", function () {
pm.expect(pm.response.headers.get("Content-Type")).to.include("application/json");
});
// Token'ı environment'a kaydet (login sonrası)
if (pm.response.code === 200) {
const jsonData = pm.response.json();
pm.environment.set("auth_token", jsonData.access_token);
pm.environment.set("user_id", jsonData.user.id);
console.log("Token başarıyla kaydedildi:", jsonData.access_token);
}
Newman: Postman Collection’larını Terminal’den Çalıştırma
Postman’ın CLI versiyonu olan Newman, CI/CD pipeline’larınıza API testlerini entegre etmenizi sağlar. Bu noktada Postman ile curl dünyaları birleşiyor:
# Newman kurulumu
npm install -g newman
npm install -g newman-reporter-htmlextra
# Collection'ı çalıştır
newman run my_api_collection.json
# Environment ile çalıştır
newman run my_api_collection.json
-e production_environment.json
# HTML rapor oluştur
newman run my_api_collection.json
-e production_environment.json
-r htmlextra
--reporter-htmlextra-export ./reports/api_test_report.html
# Postman API üzerinden direkt çalıştır
newman run "https://api.getpostman.com/collections/COLLECTION_ID?apikey=API_KEY"
-e production_environment.json
--delay-request 100
--timeout-request 10000
Jenkins ya da GitLab CI pipeline’ınıza entegre etmek için:
# .gitlab-ci.yml örneği
api_tests:
stage: test
image: node:18-alpine
before_script:
- npm install -g newman newman-reporter-htmlextra
script:
- newman run collections/api_tests.json
-e environments/staging.json
-r cli,htmlextra
--reporter-htmlextra-export reports/test_report.html
--bail
artifacts:
when: always
paths:
- reports/test_report.html
expire_in: 1 week
Güvenlik Testleri: Her İki Araçla da
API güvenlik testleri sysadmin’in sorumluluk alanına girer. Rate limiting, authentication bypass, verbose error messages gibi sorunları tespit etmek için bu araçları kullanabilirsiniz.
Rate Limiting Testi
#!/bin/bash
# rate_limit_test.sh - API rate limiting kontrolü
API_ENDPOINT="https://api.example.com/api/v1/users"
TOKEN="your_token_here"
REQUEST_COUNT=0
FAIL_COUNT=0
echo "Rate limit testi başlıyor..."
for i in $(seq 1 100); do
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}"
-H "Authorization: Bearer ${TOKEN}"
"${API_ENDPOINT}")
REQUEST_COUNT=$((REQUEST_COUNT + 1))
if [ "$HTTP_STATUS" -eq 429 ]; then
echo "Rate limit tetiklendi: ${REQUEST_COUNT}. istekte"
FAIL_COUNT=$((FAIL_COUNT + 1))
break
elif [ "$HTTP_STATUS" -ne 200 ]; then
echo "Beklenmeyen durum kodu: ${HTTP_STATUS} (istek: ${REQUEST_COUNT})"
fi
# Çok hızlı gönderme
sleep 0.1
done
echo "Toplam istek: ${REQUEST_COUNT}"
echo "Rate limit aşımı: ${FAIL_COUNT}"
if [ $FAIL_COUNT -eq 0 ]; then
echo "UYARI: 100 istekte rate limiting tespit edilmedi!"
fi
SSL/TLS Sertifika Kontrolü
# SSL sertifika bilgilerini kontrol et
curl -v --stderr - https://api.example.com 2>&1 | grep -E "SSL|TLS|certificate|expire"
# Sertifika son geçerlilik tarihi
echo | openssl s_client -servername api.example.com
-connect api.example.com:443 2>/dev/null |
openssl x509 -noout -dates
# Sertifika detaylı bilgi
curl -w "SSL verify: %{ssl_verify_result}nSSL version: %{ssl_version}n"
-s -o /dev/null https://api.example.com
# Zayıf cipher kontrolü (sadece test ortamı!)
curl -k --tlsv1.0 https://api.example.com
curl -k --tlsv1.1 https://api.example.com
Hatalı Input Testi
API’nin hatalı inputları nasıl işlediğini test etmek önemlidir. Verbose error message’lar güvenlik açığına yol açabilir:
# SQL injection benzeri karakterler test
curl -X GET "https://api.example.com/users?id=1' OR '1'='1"
-H "Authorization: Bearer ${TOKEN}"
# Çok uzun input
curl -X POST https://api.example.com/users
-H "Content-Type: application/json"
-d "{"username": "$(python3 -c 'print("A"*10000)')"}"
# Beklenmedik Content-Type
curl -X POST https://api.example.com/users
-H "Content-Type: text/plain"
-d '{"username": "test"}'
# Negatif ve sınır değerleri
curl -X GET "https://api.example.com/users?limit=-1&offset=999999"
-H "Authorization: Bearer ${TOKEN}"
Pratik Senaryo: Microservice Entegrasyon Testi
Bir e-ticaret platformunda sipariş servisi, ödeme servisi ve bildirim servisi arasındaki entegrasyonu test ettiğinizi düşünün:
#!/bin/bash
# integration_test.sh - End-to-end akış testi
BASE_URL="https://api.ecommerce.example.com"
TEST_USER_EMAIL="test_$(date +%s)@example.com"
echo "=== E-Ticaret API Entegrasyon Testi ==="
# 1. Kullanıcı oluştur
echo "1. Test kullanıcısı oluşturuluyor..."
REGISTER_RESPONSE=$(curl -s -X POST "${BASE_URL}/auth/register"
-H "Content-Type: application/json"
-d "{
"email": "${TEST_USER_EMAIL}",
"password": "Test123!",
"name": "Test Kullanicisi"
}")
TOKEN=$(echo $REGISTER_RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
USER_ID=$(echo $REGISTER_RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['user']['id'])")
if [ -z "$TOKEN" ]; then
echo "HATA: Kullanıcı oluşturulamadı"
exit 1
fi
echo "OK - Kullanıcı ID: ${USER_ID}"
# 2. Ürün listesini al
echo "2. Ürün kataloğu kontrol ediliyor..."
PRODUCTS=$(curl -s "${BASE_URL}/products?limit=5"
-H "Authorization: Bearer ${TOKEN}")
PRODUCT_ID=$(echo $PRODUCTS | python3 -c "import sys,json; print(json.load(sys.stdin)['products'][0]['id'])")
echo "OK - İlk ürün ID: ${PRODUCT_ID}"
# 3. Sepete ekle
echo "3. Ürün sepete ekleniyor..."
CART_RESPONSE=$(curl -s -X POST "${BASE_URL}/cart/items"
-H "Authorization: Bearer ${TOKEN}"
-H "Content-Type: application/json"
-d "{"product_id": "${PRODUCT_ID}", "quantity": 2}")
CART_ID=$(echo $CART_RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['cart_id'])")
echo "OK - Sepet ID: ${CART_ID}"
# 4. Sipariş oluştur
echo "4. Sipariş oluşturuluyor..."
ORDER_STATUS=$(curl -s -o /dev/null -w "%{http_code}"
-X POST "${BASE_URL}/orders"
-H "Authorization: Bearer ${TOKEN}"
-H "Content-Type: application/json"
-d "{"cart_id": "${CART_ID}", "payment_method": "test_card"}")
if [ "$ORDER_STATUS" -eq 201 ]; then
echo "OK - Sipariş başarıyla oluşturuldu"
else
echo "HATA: Sipariş oluşturulamadı (HTTP ${ORDER_STATUS})"
fi
echo "=== Test Tamamlandı ==="
Postman ve curl Arasında Seçim Yapmak
Her ikisi de güçlü araçlar ama hangi durumda hangisini kullanmalısınız?
curl tercih edin:
- SSH ile uzak sunucuda çalışıyorsanız
- Bash script veya cron job içinde API çağrısı yapmanız gerekiyorsa
- CI/CD pipeline’ında hızlı bir HTTP kontrolü yapacaksanız
- Docker container içinde debug yapıyorsanız
- Hafif ve bağımlılıksız bir çözüm istiyorsanız
Postman tercih edin:
- Kompleks API akışlarını test ediyorsanız
- Ekip içinde test senaryoları paylaşmanız gerekiyorsa
- Otomatik regression testleri yazıyorsanız
- API dokümantasyonu oluşturmanız gerekiyorsa
- Görsel olarak request/response’u incelemek istiyorsanız
- OAuth2 gibi kompleks auth akışlarını test edecekseniz
Gerçek hayatta bu iki araç birbirini tamamlar. Postman’da geliştirdiğiniz testleri Newman ile CI/CD’ye taşırsınız, hızlı sunucu tarafı debugları için curl’e dönersiniz.
Sonuç
REST API test araçları, modern altyapı yönetiminin ayrılmaz bir parçasıdır. curl’ün terminal gücü ile Postman’ın görsel zenginliğini birleştirdiğinizde eliminizdeki araç seti oldukça güçlü hale gelir. Bir sunucuda anlık sorun gidermekten CI/CD pipeline’larına API testleri entegre etmeye kadar geniş bir yelpazede bu iki araç ihtiyaçlarınızı karşılar.
Önemli olan her iki aracı da iyi öğrenmek ve duruma göre doğru olanı seçmektir. curl’ü otomatize etmeyi öğrenin, Postman’da test scriptleri yazmaya zaman ayırın. API’leri kör bir şekilde “çalışıyor mu?” diye kontrol etmek yerine, yanıt sürelerini izleyen, hata durumlarını tespit eden ve ekibinizle paylaşılabilir test senaryoları oluşturan bir yapı kurun. Bu alışkanlıkları edindiğinizde, bir API entegrasyonunda sorun çıktığında paniklemek yerine doğrudan terminali açıp sebebini araştırıyor olacaksınız.
