Ana içeriğe atla

Senaryo

Bir evcil hayvan yönetim API’sine gelen istek body’si aşağıdaki yapıdadır:
{
  "id": 1,
  "category": { "id": 10, "name": "Köpekler" },
  "name": "Karabaş",
  "photoUrls": ["foto1.jpg"],
  "tags": [{ "id": 5, "name": "aşılı" }],
  "status": "available"
}
Hedef; istek header’ları, query parametresi, body alanları ve bağlam bilgilerini birleştirerek zenginleştirilmiş bir JSON mesajı oluşturmak ve bunu sonraki politikalar için özel bir değişkende saklamaktır. Ayrıca durum available ise iç içe geçmiş (nested) bir alan eklenecektir.

Satır Yapılandırması

Bu yapılandırma 6 satırdan oluşur. Satırlar sırasıyla çalışır; önceki satırda oluşturulan değişken sonraki satırlarda kullanılır.

Satır 1: Hayvan Adını Ara Değişkene Al

AlanDeğer
Oluşturma ModuTemplate
Şablon#{body.$.name}
HedefÖzel Değişken → petName
Varsayılan Değerunknown

Satır 2: Kategori Etiketini Ara Değişkene Al

AlanDeğer
Oluşturma ModuTemplate
Şablon#{body.$.category.name}
HedefÖzel Değişken → categoryLabel
Varsayılan Değer(boş)

Satır 3: Durum Etiketini JEXL Ternary ile Üret

AlanDeğer
Oluşturma ModuTemplate
Şablon#{body.$.status == 'available' ? 'SATIN_ALINABILIR' : body.$.status == 'pending' ? 'BEKLEMEDE' : 'SATILDI'}
HedefÖzel Değişken → statusLabel
Varsayılan Değer(boş)

Satır 4: İç İçe Nesneyi Varsayılan Olarak null Yap

AlanDeğer
Oluşturma ModuTemplate
Şablonnull
HedefÖzel Değişken → nestedObject

Satır 5: Durum available İse İç İçe Nesneyi Doldur

AlanDeğer
Oluşturma ModuTemplate
Şablon{"displayName":"#{petName} - #{categoryLabel}","statusLabel":"#{statusLabel}"}
HedefÖzel Değişken → nestedObject
Satır 5 Koşulu:
DeğişkenOperatörDeğer
İstek Body → JSON Path $.statusEşittiravailable

Satır 6: Tüm Kaynakları Birleştirerek Zenginleştirilmiş JSON Oluştur

Şablon (tek satırda yazılır; okunabilirlik için aşağıda satırlara bölünmüştür):
{
  "request": {
    "headers": {
      "contentType": "#{header.Content-Type}",
      "xRequestId": "#{header.X-Request-Id}"
    },
    "query": {
      "format": "#{query.format}"
    },
    "body": {
      "id": #{body.$.id},
      "name": "#{petName}",
      "category": {
        "id": #{body.$.category.id},
        "name": "#{categoryLabel}",
        "nested": #{nestedObject}
      },
      "photoUrls": #{body.$.photoUrls},
      "tags": #{body.$.tags},
      "status": "#{body.$.status}"
    }
  },
  "context": {
    "httpMethod": "#{context.request.httpMethod}",
    "clientIp": "#{context.request.remoteAddress}",
    "correlationId": "#{context.message.correlationId}",
    "year": "#{context.system.year}",
    "dateTime": "#{context.system.dateTime}",
    "environment": "#{context.environment.name}"
  },
  "computed": {
    "operationType": "#{context.request.httpMethod == 'POST' ? 'create' : context.request.httpMethod == 'PUT' ? 'update' : context.request.httpMethod == 'DELETE' ? 'delete' : 'read'}",
    "summary": "#{petName} (#{categoryLabel}) - #{statusLabel}"
  }
}
AlanDeğer
Oluşturma ModuTemplate
ŞablonYukarıdaki şablon (tek satır)
HedefÖzel Değişken → enrichedPayload
Varsayılan Değer{}

Beklenen Çıktı

Örnek istek (POST, Content-Type: application/json, X-Request-Id: req-001, ?format=json, status=available) için:
{
  "request": {
    "headers": {
      "contentType": "application/json",
      "xRequestId": "req-001"
    },
    "query": {
      "format": "json"
    },
    "body": {
      "id": 1,
      "name": "Karabaş",
      "category": {
        "id": 10,
        "name": "Köpekler",
        "nested": {"displayName":"Karabaş - Köpekler","statusLabel":"SATIN_ALINABILIR"}
      },
      "photoUrls": ["foto1.jpg"],
      "tags": [{"id":5,"name":"aşılı"}],
      "status": "available"
    }
  },
  "context": {
    "httpMethod": "POST",
    "clientIp": "192.168.1.10",
    "correlationId": "8260e8b4-29d7-479a-8266-5dbb29c0d0fa",
    "year": "2026",
    "dateTime": "2026-02-20T10:35:48.000Z",
    "environment": "production"
  },
  "computed": {
    "operationType": "create",
    "summary": "Karabaş (Köpekler) - SATIN_ALINABILIR"
  }
}

Önemli Noktalar

Sayısal ve Dizi Alanlar: id, photoUrls, tags gibi alanlar şablonda tırnak içine alınmaz; "id": #{body.$.id} ve "photoUrls": #{body.$.photoUrls} şeklinde yazılır. Aksi hâlde sayı dize, dizi ise dize olarak çıktıya yansır.
Ara Değişken Kullanımı: petName, categoryLabel, statusLabel gibi ara değişkenler, hem koşul satırlarında hem de son şablonda yeniden kullanılabilir. Bu sayede tekrar eden JSONPath ifadelerinden kaçınılır ve bakım kolaylaşır.
Koşullu İç İçe Eleman: nestedObject değişkeni önce null ile başlatılır (Satır 4), ardından koşul sağlandığında gerçek JSON nesnesiyle güncellenir (Satır 5). Son şablonda #{nestedObject} tırnak içine alınmaz; değer doğrudan JSON’a gömülür.