Koşullar, Politika Nedir? sayfasında açıklandığı gibi, politika yapılandırmasının bir parçasıdır. Politika oluştururken veya düzenlerken koşullar bölümünden koşul tanımları yapılır.
Koşullu Politika Çalıştırma Kavramı
Koşullu politika çalıştırma, politikaların belirli koşullara göre çalıştırılmasını sağlar. Apinizer’da koşullar kod yazmadan, Variable kullanarak ve form tabanlı yapılandırma ile oluşturulur. Aşağıdaki diyagram, koşullu politika çalıştırmanın Gateway üzerinden nasıl gerçekleştiğini gösterir:Form Tabanlı Koşul Oluşturma
Koşullu politika oluştururken aşağıdaki adımlar izlenir:1
İlk Değişken Seçimi
Karşılaştırmanın sol tarafındaki değişkeni seçersiniz. Bu değişken:
- Header değişkeni olabilir
- Query parametre değişkeni olabilir
- Mesaj içeriği değişkeni olabilir (JSONPath/XPath ile)
- Context değişkeni olabilir
- Sistem değişkeni olabilir
- Özel bir değişken olabilir
2
Veri Tipi Belirleme
Değişkenin veri tipini seçersiniz:
- STRING: Metin karşılaştırmaları için
- NUMERIC: Sayısal karşılaştırmalar için
- DATE: Tarih karşılaştırmaları için (tarih formatı belirtilmelidir)
3
Karşılaştırma Operatörü Seçimi
Dropdown menüden karşılaştırma operatörünü seçersiniz:
- Eşitlik, büyüktür, küçüktür gibi karşılaştırma operatörleri
- İçerir, başlar, biter gibi metin operatörleri
- Var, yok, boş gibi varlık kontrolü operatörleri
4
İkinci Değer Kaynağı Belirleme
İkinci değerin kaynağını belirlersiniz:
- Sabit Değer: Doğrudan girilen sabit bir değer
- Değişken: Başka bir değişken seçimi (değişkenler arası karşılaştırma)
5
Nested Koşullar (Opsiyonel)
Karmaşık mantık için alt koşullar ekleyerek AND, OR, NOT operatörleriyle koşulları birleştirirsiniz.
Koşul Türleri ve Değişken Kullanımı
Koşullar, Variable kullanılarak oluşturulur. Değişkenler mesaj içeriğinden, header’lardan, query parametrelerinden veya context’ten değer alabilir.Mesaj İçeriği Koşulları
Mesaj içeriğine göre koşullar oluşturmak için JSONPath veya XPath kullanarak değişken tanımlanır:JSONPath Değişkeni
JSON mesajlarında değer çıkarmak için:
- Değişken Tipi: Mesaj İçeriği (JSONPath)
- JSONPath İfadesi:
$.user.roleveya$.products[*].price - Veri Tipi: STRING veya NUMERIC
XPath Değişkeni
XML mesajlarında değer çıkarmak için:
- Değişken Tipi: Mesaj İçeriği (XPath)
- XPath İfadesi:
/user/roleveya//product/@price - Veri Tipi: STRING veya NUMERIC
Header Değişkeni
HTTP header değerlerine göre:
- Değişken Tipi: Header
- Header Adı:
Content-TypeveyaX-API-Version - Veri Tipi: STRING
Query Parametre Değişkeni
Query parametrelerine göre:
- Değişken Tipi: Query Parameter
- Parametre Adı:
versionveyaformat - Veri Tipi: STRING
İstemci Koşulları
İstemci bilgilerine göre koşullar oluşturmak için ilgili değişkenler kullanılır:IP Adresi
IP Adresi
IP adresine göre kontrol için:
- Değişken Tipi: Client IP
- Veri Tipi: STRING
- Operatör: IN veya NOT_IN
- Değer:
192.168.1.0/24#10.0.0.0/8(liste değerleri # ile ayrılır)
User Agent
User Agent
User-Agent header’ına göre kontrol için:
- Değişken Tipi: Header
- Header Adı:
User-Agent - Veri Tipi: STRING
- Operatör: CONTAINS veya STARTS_WITH
API Key
API Key
API Key değerine göre kontrol için:
- Değişken Tipi: Header
- Header Adı:
X-API-KeyveyaAuthorization - Veri Tipi: STRING
- Operatör: EQ veya IN
Context Değerleri
Context Değerleri
Context’teki kullanıcı bilgilerine göre kontrol için:
- Değişken Tipi: Context Variable
- Değişken Adı:
context.user.roleveyacontext.user.id - Veri Tipi: STRING
- Operatör: EQ, IN, vb.
Zaman Koşulları
Zaman bazlı koşullar için sistem değişkenleri kullanılır:Tarih Aralığı
- Değişken Tipi: System Variable (tarih değişkeni)
- Veri Tipi: DATE
- Tarih Formatı:
yyyy-MM-dd(belirtilmelidir) - Operatör: GE, LE, GT, LT
Saat Aralığı
- Değişken Tipi: System Variable (saat değişkeni)
- Veri Tipi: STRING veya DATE (saat formatına göre)
- Operatör: GE, LE
Gün Bazlı
- Değişken Tipi: System Variable (gün değişkeni)
- Veri Tipi: STRING
- Operatör: EQ veya IN
Zaman Dilimi
- Değişken Tipi: System Variable (timezone değişkeni)
- Veri Tipi: STRING
- Operatör: EQ
Sistem ve Ortam Koşulları
Sistem ve ortam değişkenlerine göre koşullar:Environment Variable
Environment Variable
Ortam değişkenlerine göre kontrol için:
- Değişken Tipi: Environment Variable
- Değişken Adı:
ENVIRONMENTveyaFEATURE_FLAG - Veri Tipi: STRING
- Operatör: EQ, NE, vb.
System Property
System Property
Sistem özelliklerine göre kontrol için:
- Değişken Tipi: System Property
- Property Adı:
app.versionveyasystem.property - Veri Tipi: STRING
- Operatör: EQ, NE, vb.
Cache Değeri
Cache Değeri
Cache’deki değerlere göre kontrol için:
- Değişken Tipi: Cache Variable
- Cache Key:
user.statusveya cache key’i - Veri Tipi: STRING
- Operatör: EQ, IS_EXISTS, vb.
Koşul Yapılandırması
Koşullar, Variable kullanılarak ve form tabanlı yapılandırma ile oluşturulur. Her koşul aşağıdaki bileşenlerden oluşur:Koşul Bileşenleri
-
İlk Değişken (First Variable): Karşılaştırmanın sol tarafındaki değişken
- Header değişkeni
- Query parametre değişkeni
- Mesaj içeriği değişkeni (JSONPath/XPath)
- Context değişkeni
- Özel değişken
-
Veri Tipi (Variable Data Type): Değişkenin veri tipi
- STRING: Metin karşılaştırmaları için
- NUMERIC: Sayısal karşılaştırmalar için
- DATE: Tarih karşılaştırmaları için (tarih formatı belirtilmelidir)
- Karşılaştırma Operatörü (Comparison Operator): İki değer arasındaki karşılaştırma türü
-
İkinci Değer Kaynağı (Second Value Source):
- Sabit Değer: Doğrudan girilen sabit bir değer
- Değişken: Başka bir değişken seçimi
-
Mantıksal Operatör (Condition Criteria): Birden fazla koşulu birleştirmek için
- AND: Tüm koşulların sağlanması gerekir
- OR: Koşullardan en az birinin sağlanması gerekir
- NOT: Koşulun sağlanmaması gerekir
Karşılaştırma Operatörleri
Koşullarda kullanılabilecek karşılaştırma operatörleri:Metin (STRING) Operatörleri
| Operatör | Açıklama | Kullanım Senaryosu |
|---|---|---|
| Eşittir (EQ) | İki değer tam olarak eşit mi? | Content-Type == "application/json" |
| Eşit Değildir (NE) | İki değer eşit değil mi? | version != "v1" |
| Küçüktür (LT) | Alfabetik sıralamada küçük mü? | "apple" < "banana" |
| Küçük Eşittir (LE) | Küçük veya eşit mi? | "apple" <= "banana" |
| Büyüktür (GT) | Alfabetik sıralamada büyük mü? | "zebra" > "apple" |
| Büyük Eşittir (GE) | Büyük veya eşit mi? | "zebra" >= "apple" |
| İçerir (CONTAINS) | Metin içinde geçiyor mu? | userAgent contains "Mobile" |
| İçermez (NOT_CONTAINS) | Metin içinde geçmiyor mu? | path NOT_CONTAINS "/admin" |
| İle Başlar (STARTS_WITH) | Belirtilen metinle başlıyor mu? | path STARTS_WITH "/api/v2" |
| İle Biter (ENDS_WITH) | Belirtilen metinle bitiyor mu? | filename ENDS_WITH ".json" |
| İçinde (IN) | Belirtilen listede var mı? | role IN ["admin", "user"] |
| İçinde Değil (NOT_IN) | Belirtilen listede yok mu? | status NOT_IN ["deleted", "archived"] |
Sayısal (NUMERIC) Operatörleri
| Operatör | Açıklama | Kullanım Senaryosu |
|---|---|---|
| Eşittir (EQ) | İki sayı eşit mi? | price == 100 |
| Eşit Değildir (NE) | İki sayı eşit değil mi? | count != 0 |
| Küçüktür (LT) | İlk sayı ikincisinden küçük mü? | age < 18 |
| Küçük Eşittir (LE) | Küçük veya eşit mi? | quantity <= 10 |
| Büyüktür (GT) | İlk sayı ikincisinden büyük mü? | score > 80 |
| Büyük Eşittir (GE) | Büyük veya eşit mi? | balance >= 1000 |
| İçinde (IN) | Belirtilen sayı listesinde var mı? | statusCode IN [200, 201, 204] |
| İçinde Değil (NOT_IN) | Belirtilen sayı listesinde yok mu? | errorCode NOT_IN [404, 500] |
Tarih (DATE) Operatörleri
Tarih karşılaştırmaları için tarih formatı belirtilmelidir (örn:yyyy-MM-dd, dd/MM/yyyy).
| Operatör | Açıklama | Kullanım Senaryosu |
|---|---|---|
| Eşittir (EQ) | İki tarih aynı mı? | expiryDate == "2024-12-31" |
| Eşit Değildir (NE) | İki tarih farklı mı? | startDate != "2024-01-01" |
| Küçüktür (LT) | İlk tarih ikincisinden önce mi? | createdDate < "2024-06-01" |
| Küçük Eşittir (LE) | Önce veya aynı mı? | deadline <= "2024-12-31" |
| Büyüktür (GT) | İlk tarih ikincisinden sonra mı? | expiryDate > "2024-01-01" |
| Büyük Eşittir (GE) | Sonra veya aynı mı? | startDate >= "2024-01-01" |
Varlık Kontrolü Operatörleri
Bu operatörler ikinci değer gerektirmez, sadece değişkenin durumunu kontrol eder:| Operatör | Açıklama | Kullanım Senaryosu |
|---|---|---|
| Var (IS_EXISTS) | Değişken tanımlı ve null değil mi? | apiKey IS_EXISTS |
| Yok (IS_NOT_EXISTS) | Değişken tanımlı değil veya null mı? | optionalHeader IS_NOT_EXISTS |
| Boş (IS_EMPTY) | Değişken boş string veya null mı? | queryParam IS_EMPTY |
| Boş Değil (IS_NOT_EMPTY) | Değişken dolu mu? | requestBody IS_NOT_EMPTY |
Liste Değerleri:
IN ve NOT_IN operatörleri için liste değerleri # karakteri ile ayrılır. Örnek: admin#user#guest veya 100#200#300Null Değer İşleme
Koşullarda null değerler özel şekilde işlenir:| Durum | Operatör | Sonuç |
|---|---|---|
| İlk değer null, ikinci değer null | EQ | true (null == null) |
| İlk değer null, ikinci değer null | NE | false (null != null değil) |
| İlk değer null, ikinci değer dolu | EQ | false |
| İlk değer null, ikinci değer dolu | NE | true |
| İlk değer dolu, ikinci değer null | EQ | false |
| İlk değer dolu, ikinci değer null | NE | true |
| İlk değer null | GT, LT, GE, LE, CONTAINS, IN, STARTS_WITH, ENDS_WITH | false |
| İlk değer null | NOT_CONTAINS, NOT_IN | true |
Koşul Oluşturma Örnekleri
Aşağıdaki örneklerde, form tabanlı yaklaşımla koşulların nasıl oluşturulduğu gösterilmektedir:Örnek 1: Content-Type Bazlı Validation
Senaryo: Content-Type header’ına göre farklı validation politikaları uygulanacak. Form Yapılandırması:- İlk Değişken: Header değişkeni seçilir →
Content-Type - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer Kaynağı: Sabit değer
- İkinci Değer:
application/json
application/json ise JSON Schema Validation Policy çalışır.
Alternatif Koşullar (nested koşullar):
- Koşul 1: Content-Type
application/xmlise → XML Schema Validation Policy- İlk Değişken: Header →
Content-Type - Operatör: EQ
- İkinci Değer:
application/xml
- İlk Değişken: Header →
- Koşul 2: Diğer durumlar → Reject Request (400 Bad Request)
- ELSE durumu
Örnek 2: API Version Bazlı Routing
Senaryo: Query parametresindeki version değerine göre farklı backend’lere yönlendirme yapılacak. Form Yapılandırması:- İlk Değişken: Query Parameter değişkeni seçilir →
version - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer Kaynağı: Sabit değer
- İkinci Değer:
v1
version=v1 ise Backend v1’e route edilir.
Alternatif Koşullar:
- Koşul 1: Version
v2ise → Backend v2’ye route- İlk Değişken: Query Parameter →
version - Operatör: EQ
- İkinci Değer:
v2
- İlk Değişken: Query Parameter →
- Koşul 2: Diğer durumlar → Default Backend’e route
- ELSE durumu
Örnek 3: User Role Bazlı Authorization
Senaryo: Kullanıcı rolüne göre farklı politika uygulanacak. Form Yapılandırması:- İlk Değişken: Context Variable seçilir →
context.user.role - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer Kaynağı: Sabit değer
- İkinci Değer:
admin
admin ise tüm işlemlere izin verilir.
Alternatif Koşullar:
- Koşul 1: Role
userise → Rate Limiting Policy (100 req/min)- İlk Değişken: Context Variable →
context.user.role - Operatör: EQ
- İkinci Değer:
user
- İlk Değişken: Context Variable →
- Koşul 2: Diğer durumlar → Reject Request (403 Forbidden)
- ELSE durumu
Örnek 4: IP Bazlı Rate Limiting
Senaryo: IP adresine göre farklı rate limit değerleri uygulanacak. Form Yapılandırması:- İlk Değişken: Client IP değişkeni seçilir
- Veri Tipi: STRING
- Operatör: İçinde (IN)
- İkinci Değer Kaynağı: Sabit değer
- İkinci Değer:
192.168.1.0/24#10.0.0.0/8(liste değerleri # ile ayrılır)
- Koşul 2: Diğer durumlar → Rate Limiting Policy (100 req/min)
- ELSE durumu
Örnek 5: Time-based Access Control (Nested Koşullar)
Senaryo: Çalışma saatleri içinde erişim izni verilecek. Form Yapılandırması (Nested koşullarla AND mantığı):- Mantıksal Operatör: AND seçilir
- İlk Alt Koşul:
- İlk Değişken: System Variable →
current.time - Veri Tipi: STRING veya DATE (saat formatına göre)
- Operatör: Büyük Eşittir (GE)
- İkinci Değer:
09:00
- İlk Değişken: System Variable →
- İkinci Alt Koşul:
- İlk Değişken: System Variable →
current.time - Veri Tipi: STRING veya DATE
- Operatör: Küçük Eşittir (LE)
- İkinci Değer:
17:00
- İlk Değişken: System Variable →
Nested Koşullar (Koşul Kombinasyonları)
Karmaşık mantık için nested koşullar oluşturabilirsiniz. Form tabanlı yaklaşımda alt koşullar ekleyerek koşulları birleştirirsiniz:AND Operatörü
Form Yapılandırması:- Mantıksal Operatör: AND seçilir
- İlk Alt Koşul:
- İlk Değişken: Header →
Content-Type - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer:
application/json
- İlk Değişken: Header →
- İkinci Alt Koşul:
- İlk Değişken: Header →
X-API-Key - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer:
premium-key
- İlk Değişken: Header →
OR Operatörü
Form Yapılandırması:- Mantıksal Operatör: OR seçilir
- İlk Alt Koşul:
- İlk Değişken: Client IP
- Veri Tipi: STRING
- Operatör: İçinde (IN)
- İkinci Değer:
192.168.1.0/24#10.0.0.0/8
- İkinci Alt Koşul:
- İlk Değişken: Header →
X-API-Key - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer:
internal-key
- İlk Değişken: Header →
NOT Operatörü
Form Yapılandırması:- Mantıksal Operatör: NOT seçilir
- Alt Koşul:
- İlk Değişken: Client IP
- Veri Tipi: STRING
- Operatör: İçinde (IN)
- İkinci Değer:
10.0.0.0/8
Değişken Karşılaştırması
Koşullarda sadece sabit değerlerle değil, değişkenler arası karşılaştırma da yapabilirsiniz: Form Yapılandırması:- İlk Değişken: Header →
Content-Type - Veri Tipi: STRING
- Operatör: Eşittir (EQ)
- İkinci Değer Kaynağı: Değişken seçilir
- İkinci Değişken: Context Variable →
context.preferred.contentType
Koşullu Politika Best Practices
Değişken Seçimi
- Mevcut Variable’ları kullanın, gereksiz yeni değişken oluşturmayın
- Değişken tiplerini doğru seçin (Header, Query Parameter, Mesaj İçeriği, Context Variable)
- JSONPath/XPath ifadelerini doğru yazın ve test edin
Veri Tipi Seçimi
- Metin karşılaştırmaları için STRING kullanın
- Sayısal karşılaştırmalar için NUMERIC kullanın
- Tarih karşılaştırmaları için DATE kullanın ve tarih formatını belirtin
Koşul Sıralaması
- En spesifik koşulları önce ekleyin
- Genel koşulları en sona bırakın
- ELSE durumunu mutlaka tanımlayın
Nested Koşullar
- Karmaşık mantık için nested koşulları kullanın
- AND/OR/NOT operatörlerini doğru seçin
- Koşul derinliğini makul tutun (okunabilirlik için)
Değer Kaynağı
- Sabit değerler için sabit değer seçeneğini kullanın
- Dinamik karşılaştırmalar için değişken seçeneğini kullanın
- Değişkenler arası karşılaştırma yaparken veri tiplerinin uyumlu olduğundan emin olun
Liste Değerleri
- IN ve NOT_IN operatörleri için liste değerlerini
#karakteri ile ayırın - Örnek:
admin#user#guestveya100#200#300
Varlık Kontrolü
- Değişkenin varlığını kontrol etmek için IS_EXISTS veya IS_NOT_EXISTS kullanın
- Boş değer kontrolü için IS_EMPTY veya IS_NOT_EMPTY kullanın
- Bu operatörler ikinci değer gerektirmez
Performans
- Basit koşulları önce kontrol edin
- Ağır işlemleri (JSONPath/XPath) sona bırakın
- Cache kullanımını değerlendirin
Test ve Doğrulama
- Tüm koşul dallarını test edin
- Edge case’leri test edin (boş değerler, null, vb.)
- Değişken değerlerinin runtime’da mevcut olduğundan emin olun
- Null değerlerin nasıl işlendiğini anlayın

