Genel Bakış
Amacı Nedir?
- Template ve form tabanlı mesaj oluşturarak değişken değerlerini hedef değişkenlere atamak.
- İstek veya yanıttaki body, header, query parametresi gibi kaynaklardan veri okuyup yeni değişkenler oluşturmak.
- JEXL expression’ları ile dinamik içerik üretmek ve birden fazla kaynaktan veri birleştirmek.
- Satır bazlı koşullu çalıştırma ile sadece belirli durumlarda değişken ataması yapmak.
Çalışma Prensibi
- İstek Gelişi: API Gateway’e gelen HTTP/HTTPS isteği için MessageContext oluşturulur.
- Politika Kontrolü: Mesaj Oluşturucu politikası aktif ise, sistem aşağıdaki sırayla kontrol yapar:
- Condition (koşul) tanımlı mı? Varsa koşul sağlanıyor mu?
- Politika aktif mi (active=true)?
- Satır Zinciri Çalıştırma: Satır listesi (Row List) sırasıyla değerlendirilir. Her satır için:
- Satır koşulu kontrol edilir (varsa).
- Form modunda: Kaynak değişkenden değer okunur.
- Template modunda: Şablon
#{variable}syntax’ı ile işlenir, JEXL expression’lar evaluate edilir. - Sonuç hedef değişkene yazılır.
- Boş Değer İşleme:
- Değer boş ve
Zorunlu=trueise hata fırlatılır. - Değer boş ise varsayılan değer kullanılır.
- Değer boş ve
- Hata İşleme:
Hata Durumunda Devam Etaktifse satır atlanır ve sonraki satıra geçilir. Pasifse politika hata ile sonlanır.
Özellikler ve Yetenekler
Temel Özellikler
- İki Oluşturma Modu: Form modu (basit değişken kopyalama) ve Template modu (JEXL expression desteği ile dinamik içerik oluşturma).
- Satır Bazlı İşleme: Her satır bağımsız olarak yapılandırılabilir; kaynak, hedef, koşul, varsayılan değer ayrı ayrı belirlenir.
- Sürükle-Bırak Sıralama: Satır sırası sürükle-bırak ile kolayca değiştirilebilir.
- Aktif/Pasif Durum Kontrolü: Politikanın aktif veya pasif durumunu kolayca değiştirme. Pasif durumda politika uygulanmaz ancak yapılandırması saklanır.
- Koşul Bazlı Uygulama: Query Builder ile hem politika seviyesinde hem satır seviyesinde koşullar tanımlanabilir.
İleri Düzey Özellikler
- JEXL Expression Desteği: Template modunda
#{expression}syntax’ı ile matematiksel, mantıksal ve string operatörleri kullanılabilir. - Çoklu Değişken Kaynağı: Body (JSON/XML path), Header, Query/Path/Form parametreleri ve Context Variable’lardan veri okunabilir.
- Satır Seviyesi Hata Yönetimi: Her satır için
Hata Durumunda Devam EtveZorunlubayrakları ayrı ayrı ayarlanabilir. - Export/Import Özelliği: Politika yapılandırmasını ZIP dosyası olarak export etme. Farklı ortamlara (Development, Test, Production) import etme. Versiyon kontrolü ve yedekleme imkanı.
- Policy Group ve Proxy Group Desteği: Birden fazla politikayı Policy Group içinde yönetme. Proxy Group’lara toplu politika atama. Merkezi güncelleme ve deploy işlemleri.
- Deploy ve Versiyonlama: Politika değişikliklerini canlı ortama deploy etme. Hangi API Proxy’lerde kullanıldığını görme (Policy Usage). Proxy Group ve Policy Group kullanım raporları.
Kullanım Senaryoları
| Senaryo | Durum | Çözüm (Politika Uygulaması) | Beklenen Davranış / Sonuç |
|---|---|---|---|
| Dinamik Header Oluşturma | Farklı kaynaklardan alınan bilgilerle özel header oluşturulacak. | Template modu: User: #{body.$.userName}, Time: #{dateTime.formattedText} → hedef: X-Custom-Header. | Header her istekte güncel kullanıcı adı ve zaman bilgisiyle doldurulur. |
| Değişken Kopyalama | İstek body’sindeki bir alan, başka bir değişkene atanacak. | Form modu: Kaynak=body.$.userId → Hedef=customUserId. | userId değeri customUserId değişkenine kopyalanır, sonraki politikalarda kullanılabilir. |
| Koşullu Zenginleştirme | Sadece POST isteklerinde body’den veri çıkarılacak. | Satır koşulu: request.method = POST. Template modu ile body’den veri çıkarma. | GET isteklerinde satır atlanır, POST’ta veri çıkarılır. |
| Varsayılan Değer Atama | Header’da eksik olan bir değer için fallback sağlanacak. | Form modu: Kaynak=header.X-Tenant-Id, Varsayılan Değer=default-tenant, Zorunlu=Hayır. | Header varsa değeri kullanılır, yoksa default-tenant atanır. |
| Çoklu Kaynak Birleştirme | Farklı kaynaklardan alınan bilgiler tek bir değişkende birleştirilecek. | Template modu: #{header.X-User-Id}-#{dateTime.timestamp}-#{apiProxy.name}. | Birleşik değer hedef değişkene yazılır. |
| Zorunlu Alan Doğrulama | Belirli bir değişkenin boş olmaması garanti edilecek. | Form modu: Kaynak=body.$.orderId, Zorunlu=Evet, Hata Durumunda Devam Et=Hayır. | orderId boşsa politika hata fırlatır ve akış durur. |
Politika Parametrelerini Yapılandırma
Bu bölümde yeni bir Mesaj Oluşturucu politikası oluşturabilir ya da mevcut politika parametrelerini yapılandırarak mesaj oluşturma kurallarını belirleyebilirsiniz. Aşağıdaki görsel Definition sekmesini gösterir: politika durumu, ad ve açıklama alanları; Satırlar (Rows) bölümü ve Add ile eklenen örnek Form satırı (kaynak/hedef değişken, varsayılan değer, zorunlu, hata durumunda devam) ve Template satırı (şablon düzenleyici ve hedef değişken). Üstte Conditions, Error Message Customization, API Proxies Using Policy, API Proxy Groups Using Policy sekmeleri de yer alır.

#{variableName} biçiminde değişken ipucu ve hedef değişken; Hata Durumunda Devam Et seçeneği bulunur.

Yeni Mesaj Oluşturucu Politikası Oluşturma
Yapılandırma Adımları
| Adım | Açıklama / İşlem |
|---|---|
| Adım 1: Oluşturma Sayfasına Gitme | - Sol menüden Development → Global Settings → Global Policies → Message Builder bölümüne gidin. - Sağ üstteki [+ Create] butonuna tıklayın. |
| Adım 2: Temel Bilgileri Girme | Policy Status (Politika Durumu): Aktif/Pasif durumu gösterir. Yeni politikalar varsayılan olarak aktiftir. Name (İsim) Zorunlu: Örnek: Request_Enrichment_Builder- Benzersiz isim girin, boşlukla başlamaz. - Sistem otomatik kontrol eder: Yeşil tik: kullanılabilir, Kırmızı çarpı: mevcut isim. Description (Açıklama): Örnek: “İstek body’sindeki kullanıcı bilgilerini çıkararak header’lara ekler.” - Maks. 1000 karakter. - Politikanın amacını açıklayın. |
| Adım 3: Variable Kullanımı | - Sayfanın üst kısmındaki işlem butonları alanında, [<> Variable] butonunu kullanarak dinamik değer seçebilirsiniz. - Context/global variable ifadeleri sayesinde politika parametrelerini sabit değer yerine değişken tabanlı yönetebilirsiniz. - Bu kullanım, değişen değerlerde manuel güncelleme ihtiyacını azaltır ve operasyonel kolaylık sağlar. - Detaylı bilgi için Dinamik Değişkenler sayfasını inceleyebilirsiniz. |
| Adım 4: Satır Ekleme | - Satır ekle butonuna tıklayın. - Açılan menüden oluşturma modunu seçin: - Form: Basit değişken kopyalama. - Template: JEXL expression desteği ile şablon tabanlı oluşturma. - Yeni satır listeye eklenir. |
| Adım 5: Satır Düzenleme | - Satır üzerindeki menüden Düzenle seçin veya satıra çift tıklayın. - Açılan diyalogda aşağıdaki alanları yapılandırın: Oluşturma Modu (Build Mode): Form veya Template seçin. Kaynak Değişken (Source Variable) (Form modu): Değişken seçim diyaloğundan kaynak değişkeni seçin (body, header, query param vb.). Şablon (Template) (Template modu): Code editor’da #{variable} syntax’ı ile şablon yazın.JEXL expression’lar desteklenir. Hedef Değişken (Target Variable) Zorunlu: Sonucun yazılacağı değişkeni seçin. Varsayılan Değer (Default Value): Kaynak boş olduğunda kullanılacak değer. Zorunlu (Required): İşaretlenirse, kaynak değer boş olduğunda hata fırlatılır. Varsayılan: Hayır. Hata Durumunda Devam Et (Continue on Error): İşaretlenirse, satırda hata oluştuğunda sonraki satıra geçilir. Varsayılan: Evet. |
| Adım 6: Satır Koşulu Tanımlama (İsteğe Bağlı) | - Satır düzenleme diyaloğundaki Koşul bölümünden Query Builder ile satır seviyesinde koşul tanımlayabilirsiniz. - Koşul sağlanmadığında satır atlanır. |
| Adım 7: Satır Sıralama | - Satırları sürükle-bırak ile yeniden sıralayabilirsiniz. - Satırlar listede göründükleri sırayla çalıştırılır. |
| Adım 8: Koşul Tanımlama (İsteğe Bağlı) | - Condition sekmesine geçin. - Politika seviyesinde koşul tanımlayarak politikanın hangi durumda aktif olacağını belirleyin. Detaylar için: Koşullar (Conditions) |
| Adım 9: Hata Mesajı Özelleştirme (İsteğe Bağlı) | - Error Message Customization sekmesine gidin. - Politika hata fırlatığında dönecek mesajı özelleştirin. - #{error.defaultErrorCode}, #{message.correlationId} gibi yer tutucular kullanılabilir.Detay için: Şablon Tabanlı Hata Mesajları |
| Adım 10: Kaydetme | - Sağ üstteki [Save] butonuna tıklayın. Kontrol Listesi: - Benzersiz isim - En az bir satır mevcut - Her satırda hedef değişken seçili - Form modunda kaynak değişken seçili - Template modunda şablon dolu Sonuç: - Politika listeye eklenir. - API’lere bağlanabilir. - Global politikaysa otomatik uygulanır. |
Satır Parametreleri
| Parametre | Açıklama | Zorunlu | Varsayılan |
|---|---|---|---|
| Oluşturma Modu (Build Mode) | Form: Kaynak değişkenden hedef değişkene basit kopyalama.Template: JEXL expression desteği ile şablon tabanlı oluşturma. | Evet | — |
| Kaynak Değişken (Source Variable) | Form modunda değerin okunacağı kaynak değişken. Body, header, query param, vb. | Form modunda evet | — |
| Şablon (Template) | Template modunda #{variable} syntax’ı ile yazılan şablon string’i. | Template modunda evet | — |
| Hedef Değişken (Target Variable) | Sonucun yazılacağı hedef değişken. | Evet | — |
| Varsayılan Değer (Default Value) | Kaynak boş olduğunda kullanılacak değer. | Hayır | — |
| Zorunlu (Required) | true ise kaynak boş olduğunda hata fırlatılır. | Hayır | false |
| Hata Durumunda Devam Et (Continue on Error) | true ise satırda hata oluştuğunda sonraki satıra geçilir. | Hayır | true |
| Koşul (Condition) | Satır seviyesinde koşul. Sağlanmazsa satır atlanır. | Hayır | — |
Template Syntax
Template modunda#{...} syntax’ı ile değişkenlere ve JEXL expression’lara erişilir:
Basit Değişken Erişimi:
| Söz Dizimi | Açıklama |
|---|---|
#{context.request.httpMethod} | HTTP metodu (GET, POST, vb.) |
#{context.request.remoteAddress} | İstemci IP adresi |
#{context.response.statusCode} | Yanıt durum kodu |
#{context.message.correlationId} | Correlation ID |
#{context.apiProxy.name} | API Proxy adı |
#{context.apiProxy.id} | API Proxy kimliği |
#{context.apiMethod.name} | API Metot adı |
#{context.apiMethod.httpMethod} | API Metot HTTP metodu |
#{context.system.year} | Mevcut yıl (tam sayı) |
#{context.system.dateTime} | Tarih-saat, UTC (yyyy-MM-dd’T’HH:mm:ss.SSS’Z’) |
#{context.credential.username} | Kimlik doğrulanmış kullanıcı adı |
#{context.credential.email} | Kimlik doğrulanmış kullanıcı e-posta |
#{context.credential.clientId} | Kimlik doğrulanmış credential anahtarı/kullanıcı adı |
#{context.environment.name} | Ortam adı |
#{context.environment.id} | Ortam kimliği |
#{...} bloğu içinde for, while, var, if/else ifadeleri kullanılabilir. Body’den JSONPath ile çekilen array ve object değerleri otomatik olarak liste ve haritaya dönüştürülür; for (item : collection) ile gezinilebilir.
Dizi Gezinme:
dtf.format() ile belirli bir saat diliminde tarih formatlanabilir. Varsayılan olarak #{dateTime.formattedText} UTC saati döndürür. Belirli bir saat diliminde almak için:
JEXL Script’te son değerlendirilen ifadenin değeri döndürülür.
return anahtar kelimesi kullanılmaz.Politikayı Silme
Bu politikanın silme adımları ve kullanımdayken uygulanacak işlemler için Politika Yönetimi sayfasındaki Akıştan Politika Kaldırma bölümüne bakabilirsiniz.Politikayı Dışa/İçe Aktarma
Bu politikanın dışa aktarma (Export) ve içe aktarma (Import) adımları için Export/Import sayfasına bakabilirsiniz.Politikayı API’ye Bağlama
Bu politikanın API’lere nasıl bağlanacağına ilişkin süreç için Politika Yönetimi sayfasındaki Politikayı API’ye Bağlama bölümüne bakabilirsiniz.İleri Düzey Özellikler
| Özellik | Açıklama ve Kullanım Adımları |
|---|---|
| JEXL Expression Zinciri | - Template modunu seçin. - Şablonda #{expression} syntax’ı ile karmaşık ifadeler yazın.- Matematiksel ( +, -, *, /), mantıksal (&&, ||, !), karşılaştırma (==, !=, <, >) ve koşullu (? :) operatörler kullanılabilir. |
| JEXL Script ile Döngü ve Koşul | - Template modunda #{...} bloğu içine çok satırlı script yazın.- for, while, var, if/else ifadeleri desteklenir.- Body’den çekilen JSON array değerleri otomatik olarak listeye dönüştürülür; for (item : body.$.liste) ile gezinilebilir.- Son değerlendirilen ifadenin değeri döndürülür; return kullanılmaz. |
| Çoklu Kaynak Birleştirme | - Template modunda birden fazla kaynak kullanın. - Örnek: ID: #{body.$.id}, Name: #{header.X-User-Name}, Time: #{context.system.dateTime}- Birleşik değer tek bir hedef değişkene yazılır. |
| Koşullu Satır Çalıştırma | - Satır düzenleme diyaloğunda Query Builder ile koşul tanımlayın. - Örnek: Sadece Content-Type = application/json olan isteklerde body parse etme.- Koşul sağlanmadığında satır atlanır, diğer satırlar çalışmaya devam eder. |
| Ara Değişken Zinciri | - Bir satırda oluşturulan özel değişkeni sonraki satırların şablonunda kullanın. - Örnek: İlk satırda petName değişkenine değer atayın, sonraki satırlarda #{petName} ile kullanın.- Bu pattern, karmaşık JSON çıktılarını aşamalı olarak oluşturmayı sağlar. |
| Özel Değişkende JSONPath/XPath | - Özel bir değişkenin JSON veya XML içeriğinden belirli bir değeri çıkarmak için JSONPath veya XPath uygulayabilirsiniz. - Template modunda: #{myVar.$.user.name} (JSONPath) veya #{myVar./root/element} (XPath) söz dizimini doğrudan şablonda kullanın.- Form modunda: Kaynak olarak Özel Değişken seçin, ardından içerik tipini (JSON veya XML) belirtin ve path ifadesini girin. - Örnek: fullResponse adlı özel değişken bir JSON body içeriyor; #{fullResponse.$.user.name} şablonuyla sadece name alanı çıkarılır. |
Best Practices
Yapılması Gerekenler ve En İyi Uygulamalar
| Kategori | Açıklama / Öneriler |
|---|---|
| Satır Sıralaması | Kötü: Bağımlı satırları rastgele sıralamak. İyi: Bağımsız satırları önce, bağımlı satırları sonra sıralamak. En İyi: Sık kullanılan ve hafif satırları başa alıp, ağır template işlemlerini sona bırakmak. |
| Mod Seçimi | Kötü: Basit kopyalama için Template modu kullanmak. İyi: Basit kopyalamada Form, karmaşık oluşturmada Template kullanmak. En İyi: Form modunu varsayılan olarak tercih edip, sadece birden fazla kaynak veya expression gerektiğinde Template’e geçmek. |
| Hata Yönetimi | Kötü: Tüm satırlarda Hata Durumunda Devam Et=Hayır bırakmak.İyi: Kritik satırlarda Hayır, opsiyonel satırlarda Evet kullanmak. En İyi: Zorunlu ve Hata Durumunda Devam Et bayraklarını satır önemine göre ayrı ayrı yapılandırmak. |
| Varsayılan Değerler | Kötü: Varsayılan değer tanımlamadan zorunlu olmayan satırlar bırakmak. İyi: Opsiyonel satırlara anlamlı varsayılan değer vermek. En İyi: Varsayılan değerleri downstream servisin beklentilerine uygun belirlemek. |
Güvenlik En İyi Uygulamaları
| Güvenlik Alanı | Açıklama / Uyarılar |
|---|---|
| Hassas Veri İşleme | Template’lerde hassas veriler (şifre, token) kullanırken dikkatli olun. Hedef değişken adını loglarda görünmeyecek şekilde seçin. |
| JEXL Expression Güvenliği | Expression’larda kullanıcı girişinden gelen değerleri doğrudan kullanmaktan kaçının. |
| Hedef Değişken Kontrolü | Hedef değişken olarak güvenlik açısından kritik değişkenleri (authentication token vb.) yanlışlıkla overwrite etmeyin. |
Kaçınılması Gerekenler
| Kategori | Açıklama / Uyarılar |
|---|---|
| Boş Satır Listesi | Neden kaçınılmalı: Politika kaydedilse bile hiçbir işlem yapılmaz. Alternatif: En az bir satır tanımlayın. |
| Gereksiz Template Kullanımı | Neden kaçınılmalı: Basit değişken kopyalama için Template modu gereksiz parsing maliyeti oluşturur. Alternatif: Basit kopyalamada Form modunu kullanın. |
| Koşulsuz Zorunlu Satırlar | Neden kaçınılmalı: Her istekte zorunlu kontrol yapılır, bazı endpoint’lerde gereksiz hata fırlatılabilir. Alternatif: Zorunlu satırlara uygun koşul ekleyin. |
Performans İpuçları
| Kriter | Öneri / Etki |
|---|---|
| Mod Seçimi | Öneri: Mümkün olduğunca Form modunu tercih edin. Etki: JEXL parsing maliyetinden kaçınılır. |
| Satır Sayısı | Öneri: Satır sayısını minimumda tutun, gereksiz atama yapmayın. Etki: Her satır ayrı bir işlem döngüsüdür, az satır = düşük gecikme. |
| Template Karmaşıklığı | Öneri: Template’lerde basit expression’lar kullanın, karmaşık iş mantığını Script politikasına taşıyın. Etki: JEXL engine yükü azalır. |
| Koşul Kullanımı | Öneri: Gereksiz satırları koşul ile filtreleyin. Etki: İlgili olmayan isteklerde satır atlanır, throughput artar. |
Sık Sorulan Sorular (SSS)
| Kategori | Soru | Cevap |
|---|---|---|
| Genel | Form ve Template modu arasındaki fark nedir? | Form modu tek bir kaynak değişkenden hedefe basit kopyalama yapar. Template modu ise #{variable} syntax’ı ve JEXL expression’lar ile birden fazla kaynaktan dinamik içerik üretir. |
| Genel | Bu politika gRPC API Proxy’lerinde kullanılabilir mi? | Hayır, Mesaj Oluşturucu politikası yalnızca HTTP API Proxy’lerinde desteklenir. |
| Teknik | Template’de hangi değişken türleri kullanılabilir? | Body (JSON path body.$.path veya XPath body./path), Header (header.Name), Query (query.name), Form (form.name), Path (path.name) parametreleri ve Context Variable’lar kullanılabilir. |
| Teknik | JEXL expression’lar hangi operatörleri destekler? | Aritmetik (+, -, *, /), karşılaştırma (==, !=, <, >, <=, >=), mantıksal (&&, ||, !) ve ternary (? :) operatörleri desteklenir. |
| Kullanım | Satır sırası önemli midir? | Evet, satırlar listede göründükleri sırayla çalıştırılır. Bir satırın hedef değişkeni, sonraki satırın kaynağı olabilir. |
| Kullanım | Kaynak değer boş olduğunda ne olur? | Zorunlu=Evet ise hata fırlatılır. Zorunlu=Hayır ise varsayılan değer kullanılır. Varsayılan değer de yoksa boş string atanır. |
| Teknik | Template’de for döngüsü kullanabilir miyim? | Evet, #{...} bloğu içinde çok satırlı JEXL Script yazılabilir. for (item : body.$.items) ile JSON array elemanları üzerinde gezinebilirsiniz. JSON array değerleri otomatik olarak listeye dönüştürülür. |
| Teknik | JEXL Script’te return kullanmalı mıyım? | Hayır, return anahtar kelimesi kullanılmaz. Bloğun sonunda son değerlendirilen ifadenin değeri otomatik olarak döndürülür. |
| Teknik | Şablon içinde {} içeren JSON string üretebilir miyim? | Evet, dengeli parantez tarayıcısı sayesinde #{...} bloğu içinde { ve } serbestçe kullanılabilir. Örneğin: #{durum == 'aktif' ? '{"etiket":"Aktif"}' : 'null'} |
| Teknik | Body bir JSON dizisiyse eleman nasıl erişirim? | #{body.$[0].alan} söz dizimi ile dizinin ilk elemanına erişebilirsiniz. $[1], $[2] şeklinde indeks belirterek diğer elemanlara da ulaşılabilir. |
| Teknik | Özel bir değişkenden JSONPath veya XPath ile belirli bir değeri çıkarabilir miyim? | Evet. Template modunda: #{myVar.$.path} (JSONPath) veya #{myVar./xpath} (XPath) söz dizimini doğrudan şablonda kullanabilirsiniz. Form modunda: Kaynak olarak Özel Değişken seçin, içerik tipini (JSON veya XML) belirtin ve path ifadesini girin. Bu, özel değişken tam bir JSON veya XML body içerdiğinde ve yalnızca belirli bir alan gerektiğinde kullanışlıdır. |
| Teknik | Şablonda istek veya yanıtı açıkça belirtebilir miyim? | Evet. #{request.body.$.alan} veya #{response.body.$.alan} ile belirli bir bölgeyi hedefleyebilirsiniz. Benzer şekilde #{request.header.Name} ve #{response.header.Name} söz dizimleri desteklenir. Ön ek kullanılmadığında politikanın varsayılan bölgesi (istek veya yanıt pipeline’ı) kullanılır. |
| Teknik | Belirli bir saat diliminde tarih/saat nasıl alınır? | Tüm dateTime.* değişkenleri UTC değer döndürür. Belirli bir saat diliminde almak için #{dtf.format('+03:00')}, özel format ile #{dtf.format('+03:00', 'dd/MM/yyyy HH:mm:ss')} kullanabilirsiniz. Europe/Istanbul gibi isimli saat dilimleri de desteklenir. |

