Hazırlanan projeyi kullanarak önce bir müşterinin siparişlerini listeleyin; sonra tek bir siparişi bulun. Bu iki işin boş sonuç davranışı farklıdır.
1. Müşterinin siparişlerini listeleyin
- API design → searchOrders → Try it açın.
- Target → Running project seçin.
- customerId (query, required) alanına
C-100yazın. - Response content type (Accept) → No preference seçip Send kullanın.
Başlangıç verisinde 200 ve iki kayıt gelir:
[
{"order_id":"ORD-1001","customer_id":"C-100","sku":"TEA-01","quantity":2,"status":"NEW","version":0},
{"order_id":"ORD-1003","customer_id":"C-100","sku":"TEA-01","quantity":1,"status":"NEW","version":0}
]

C-200 için tek elemanlı liste, C-NONE için boş liste [] bekleyin. Liste aramasında sonuç bulunmaması hata değildir. Kayıt ekleme bölümünü yaptıysanız C-100 sonucunda eklediğiniz kayıtlar da görünür.
2. Akıştaki SQL adımını okuyun
Source → read.camel.yaml → Designer içinde search-orders akışını açın. Direct girişinin adı API’deki searchOrders işlemiyle eşleşir. SQL adımı veriyi okur; Marshal adımı sonucu JSON metnine çevirir.
- to:
uri: 'sql:SELECT order_id, customer_id, sku, quantity, status, version FROM orders WHERE customer_id = :#${header.customerId} ORDER BY order_id LIMIT 50'
parameters:
dataSource: '#ordersDb'
- marshal:
json:
library: Jackson
- setHeader:
name: Content-Type
constant: application/json
dataSource, daha önce hazırladığınız bağlantıyı seçer. customerId, bu API’nin query parametresinden header’a gelir. :#${header.customerId} değeri sorguya parametre olarak bağlar; müşteri kodu SQL komutuna dönüşmez. Gelen değeri tırnaklarla SQL metnine birleştirmeyin.
Denemek için müşteri koduna C-100' OR '1'='1 yazabilirsiniz. Böyle bir müşterimiz olmadığı için yine [] gelir; bütün kayıtlar dönmez. Parametre bağlama, kullanıcı yetkisinin yerine geçmez: hangi müşterinin verisini kimin görebileceği gerçek uygulamanızda ayrıca belirlenir.
Sorgu yalnızca kullanılan sütunları ve en fazla 50 kaydı getirir. Bu bir tam dışa aktarma değildir. Daha büyük veri için sıralaması kararlı bir sayfalama tasarlayın; LIMIT değerini kaldırarak tüm tabloyu tek mesaja yüklemeyin.
3. Mesajın nasıl değiştiğini anlayın
| Nokta | O anda taşıdığı bilgi |
|---|---|
| Giriş header’ı | customerId = C-100 |
| SQL’den sonra body | Satırların listesi; her satır sütun adı/değer çiftlerinden oluşur |
| Marshal’dan sonra body | JSON metni |
| Yanıt header’ı | Content-Type = application/json |
Body adımların işlediği içeriktir ve bir adım tarafından değiştirilebilir. Header mesajın yan bilgileridir; bazıları dış sisteme taşınabilir. Exchange property aynı işlem içinde daha sonra kullanmak üzere sakladığınız bilgidir. Proje ayarı veya veritabanına kalıcı kayıt değildir; sonraki HTTP isteğine kendiliğinden geçmez.
Sorgudan önceki body’ye sonradan ihtiyaç varsa SQL’den önce bir property’ye alın ya da SQL adımındaki outputHeader ile sonucu ayrı bir header’a yazın. Örnekte sipariş eklerken ilk isteği orderRequest property’sinde saklıyoruz.
JSON metni ile işlenebilir nesne de farklıdır. JSON isteğinde quantity alanını okuyabilmek için önce Unmarshal, yanıtı düzgün JSON’a çevirmek için Marshal kullanın. JSON’u metin birleştirerek üretmek tırnak ve kaçış karakterlerinde hataya yol açabilir.
4. Tek bir siparişi bulun
getOrder → Try it içinde orderId = ORD-1001 ile istek gönderin. Bu işlem liste yerine tek bir nesne döndürür:
{"order_id":"ORD-1001","customer_id":"C-100","sku":"TEA-01","quantity":2,"status":"NEW","version":0}
Akışın SQL adımında outputType: SelectOne vardır. Sonuç bulunmazsa body null olur; Choice adımı bunu 404 / ORDER_NOT_FOUND yanıtına çevirir. ORD-9999 ile deneyin. Birden fazla satır üretirse bu seçenek hata verir; tek kayıt beklenen sorgunun veritabanındaki benzersiz anahtarla bunu sağlaması gerekir.
| İş | Kayıt yoksa | Bir kayıt varsa | Birden fazla kayıt varsa |
|---|---|---|---|
| Müşteri siparişlerini ara | 200, [] | Tek elemanlı liste | Liste, en fazla 50 kayıt |
| Siparişi kimliğiyle oku | 404, ORDER_NOT_FOUND | Tek nesne | Bu örnekte primary key buna izin vermez |
Sonraki adım: Sipariş kaydedin ve sürüm kontrollü güncelleyin.