En son kararlı sürüm için lütfen Mirket Geliştirici Dokümanı v4.9.x! |
Groovy Kod Routing
External REST API
Basit bir API tanımı yaparken JSONPlaceholder’dan tüm gönderilerin kaydını çekmiştik. Şimdi de id bazlı gönderinin başlık değerini dönen bir api tanımlayalım. Bunun için API’nin Yönlendirme tabında bulunan Groovy Kod Çalıştırılması özelliğini kullanalım.
API Oluşturma
Tanım sekmesinde aşağıdaki bilgiler doldurulur:
Ad: Get Post Title By Id - JSONPlaceholder
Açıklama: Get Post Title By Id - JSONPlaceholder
Durum: Aktif
Tip: REST
EndPoint: /groovy/posts/{id}/title
Metot: GET
Yönlendirme sekmesine tıklanır ve Groovy Kodu Çalıştırılması seçilir.
Bu adımda karşımıza çıkan örnek bir groovy kodu editörde gözükecek.
package com.mirket.gateway.groovy;
import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
public class GroovyRouteScriptImpl implements GroovyRouteScript {
public void execute(HttpServletRequest request, RoutingContext context) {
Map<String, String> responseHeaders = new HashMap<>();
String responseBody = "{\"status\": \"OK\"}";
int statusCode = 200;
context.setStatusCode(statusCode);
context.setResponseBody(responseBody);
context.setResponseHeaders(responseHeaders);
}
}
Örnek kodda bulunan execute
metodunun içeriğini, apimiz tetiklendiğinde JSONPlaceholder’dan path değişkeni olarak gönderdiğimiz id değerine sahip gönderiyi çekip başlık değerini api cevabı olarak dönecek şekilde adım adım yazmaya çalışalım.
Daha rahat yazabilmek adına groovy destekleyen bir ide’den yazmayı tercih edebilirsiniz. Ben Intellij IDEA’yı tercih ediyorum.
IDE’de bir groovy projesi açıyorum. Hemen ardından JSONPlaceHolderGetPostTitleById
adında bir groovy’i sınıfı oluşturuyorum.
Hızlıca main
metodumuda oluşturduktan sonra sınıfım aşağıdaki şekilde oluşmuş oluyor.
class JSONPlaceHolderGetPostTitleById {
static void main(String[] args) {
}
}
Kod içinde loglama yapabilmek için static Logger’ımı sınıf içerisinde tanımlıyorum.
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
HttpClient’ı oluşturup JSONPlaceHolder’a gideceğimiz URL’i parametre olarak vererek HttpGet objemizi oluşturuyorum. HttpResponse ve StringBuilder objelerimide tanımlayıp null set ediyorum.
Tanımlamalar sonrası sınıfımın son hali şu şekilde olmuş oluyor.
import com.sun.org.slf4j.internal.LoggerFactory
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import java.net.http.HttpClient
import java.net.http.HttpResponse
import java.util.logging.Logger
class JSONPlaceHolderGetPostTitleById {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
static void main(String[] args) {
HttpClient httpclient = HttpClients.createDefault() as HttpClient;
HttpGet httpget = new HttpGet("https://jsonplaceholder.typicode.com/posts");
HttpResponse response = null
StringBuilder result = null
}
}
Http client’ı kullanarak isteğimizi yaptıktan sonra aldığımız cevap değeri üzerinden bir InputStream
okuması yapacağımız için okuma esnasında alabileceğimiz her türlü `IOException’ı handle edebilmek adına bir try-catch bloğu açıyorum.
try {
} catch (IOException e) {
}
Try bloğunun içinde http isteğimi yapıp cevabını response
objeme atıyorum.
response = httpclient.execute(httpget);
Bu aşamada JSONPlaceHolder’da tanımlı tüm gönderi kayıtlarını çekmiş olduk. Bu adımda ResponseBody içindeki tüm bu kayıtları okuyup bir StringBuilder’a eklememiz gerekiyor.
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
Bütün kayıtları okuyup result
objemize ekledikten sonra apimize path parametresi ile gelen id değerini çözmemiz gerekiyor.
Bunun içinde aşağıdaki gibi bir metod tanımını groovy sınıfım içinde yapıyorum.
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/groovy/posts/{id}/title")
.match(request.getRequestURI())
.get("id");
}
Path parametremizi okuyan metodumuzuda tanımladıktan sonra artık ana metodumuzda metod çağrımı yapabiliriz. Request objemizi metoda parametre olarak geçerek id değerimizi alabiliriz.
def id = readPathParameter(request);
Bu aşamada sınıfımın aldığı son hal aşağıdaki gibi olmuş oluyor.
import com.sun.org.slf4j.internal.LoggerFactory
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import java.net.http.HttpClient
import java.net.http.HttpResponse
import java.util.logging.Logger
class JSONPlaceHolderGetPostTitleById {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
static void main(String[] args) {
HttpClient httpclient = HttpClients.createDefault() as HttpClient;
HttpGet httpget = new HttpGet("https://jsonplaceholder.typicode.com/posts");
HttpResponse response = null
StringBuilder result = null
try {
response = httpclient.execute(httpget);
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def id = readPathParameter(request);
} catch (IOException e) {
}
}
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/groovy/posts/{id}/title")
.match(request.getRequestURI())
.get("id");
}
}
Bundan sonra result
objemize doldurduğumuz gönderiler JsonSlurper
yardımı ile ayrıştırıp, kendi response body’imiz oluşturup context’e set etmek kaldı.
Öncelikle string bir response body tanımlıyorum.
String responseBody = "{\"status\": \"POST_NOT_FOUND\", \"id\": \"" + id + "\"}"
Hemen ardından JsonSlurper’ı tanımlayıp `parseText
metoduna result objemi string olarak veriyorum. JsonSlurper
bana tüm gönderileri değerlerini key-value bir map olarak ayrıştıracak.
Birden fazla gönderi olduğu için ayrıştırma sonrasında elimde List<Map<String, Object>>
bir değişken olmuş olacak.
Bu gönderi listesi üstünde forEach
yardımı ile dönüp, path parametresinden aldığım id değeri ile eşleşen gönderinin başlık değerini response olarak dönmek için aşağıdaki kodları yazıyorum.
JsonSlurper jsonSlurper = new JsonSlurper()
List<Map<String, Object>> json = jsonSlurper.parseText(result.toString()) as List<Map<String, Object>>
json.forEach(map -> {
def idAsString = String.valueOf(map.get("id"));
if (idAsString.equals(id)) {
responseBody = "{\"status\": \"OK\", \"id\": \"" + id + "\", \"title\": \"" + map.get("title") + "\"}"
}
})
Artık yavaş yavaş kodumu tamamlamış bulunmaktayım. Response body’imi RoutingContext’te bulunan `setResponseBody
metodu yardımı ile set ediyorum.
Örnek kodda da bulunan statusCode tanımı yapıp, context’e set ediyorum. Son adım olarakta try-catch bloğumun catch bloğunda bir error logu yazarak kodumu tamamlamış bulunuyorum.
Tüm bu adımlar sonrasında kodumun aldığı son hal aşağıdaki gibi olmuş oluyor.
import com.sun.org.slf4j.internal.LoggerFactory
import groovy.json.JsonSlurper
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import java.net.http.HttpClient
import java.net.http.HttpResponse
import java.util.logging.Logger
class JSONPlaceHolderGetPostTitleById {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
static void main(String[] args) {
HttpClient httpclient = HttpClients.createDefault() as HttpClient;
HttpGet httpget = new HttpGet("https://jsonplaceholder.typicode.com/posts");
HttpResponse response = null
StringBuilder result = null
try {
response = httpclient.execute(httpget);
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def id = readPathParameter(request);
String responseBody = "{\"status\": \"POST_NOT_FOUND\", \"id\": \"" + id + "\"}"
JsonSlurper jsonSlurper = new JsonSlurper()
List<Map<String, Object>> json = jsonSlurper.parseText(result.toString()) as List<Map<String, Object>>
json.forEach(map -> {
def idAsString = String.valueOf(map.get("id"));
if (idAsString.equals(id)) {
responseBody = "{\"status\": \"OK\", \"id\": \"" + id + "\", \"title\": \"" + map.get("title") + "\"}"
}
})
context.setResponseBody(responseBody);
int statusCode = 200;
context.setStatusCode(statusCode);
} catch (IOException e) {
LOG.error("Hata Oldu");
}
}
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/groovy/posts/{id}/title")
.match(request.getRequestURI())
.get("id");
}
}
IDE yardımı ile yazığım bu kodu apimin yönlendirme tabında bulunan editöre taşıyorum. Taşırken, IDE üzerinde yazdığım main metodumun içeriği execute metodu olacak şekilde taşıyorum. Taşıma sonucunda API tanımında bulunan kodum şu hali almış oluyor.
package com.mirket.gateway.groovy;
import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import groovy.json.JsonSlurper
import org.apache.http.HttpResponse
import org.apache.http.client.HttpClient
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import org.springframework.web.util.UriTemplate
import java.util.List
import java.util.Map
public class GroovyRouteScriptImpl implements GroovyRouteScript {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
public void execute(HttpServletRequest request, RoutingContext context) {
HttpClient httpclient = HttpClients.createDefault() as HttpClient;
HttpGet httpget = new HttpGet("https://jsonplaceholder.typicode.com/posts");
HttpResponse response = null
StringBuilder result = null
try {
response = httpclient.execute(httpget);
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def id = readPathParameter(request);
String responseBody = "{\"status\": \"POST_NOT_FOUND\", \"id\": \"" + id + "\"}"
JsonSlurper jsonSlurper = new JsonSlurper()
List<Map<String, Object>> json = jsonSlurper.parseText(result.toString()) as List<Map<String, Object>>
json.forEach(map -> {
def idAsString = String.valueOf(map.get("id"));
if (idAsString.equals(id)) {
responseBody = "{\"status\": \"OK\", \"id\": \"" + id + "\", \"title\": \"" + map.get("title") + "\"}"
}
})
context.setResponseBody(responseBody);
int statusCode = 200;
context.setStatusCode(statusCode);
} catch (IOException e) {
LOG.error("Hata Oldu");
}
}
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/groovy/posts/{id}/title")
.match(request.getRequestURI())
.get("id");
}
}
Kaydet butonuna tıklayarak apimi kaydediyorum.
Test
Oluşturulan API’nin güncelle butonuna tıklanır. Test sekmesine tıklanır. Path Parametrelerinde id değerine 1-100 arasında bir değer girilir. (JSONPlaceHolder’da 100 tane gönderi kaydı bulunduğu için.) Çalıştır’a tıklanır.
Girdiğimiz id değerine sahip olan gönderinin başlık değerini cevap olarak aldığımızı görmüş olduk.
Örnek cevap:
{
"status": "OK",
"id": "2",
"title": "qui est esse"
}
External SOAP API
External REST API’de yaptığımız gibi DataAccess’in Numara Çevirme SOAP servisini kullanarak, girilen sayı değerinin sıfır olmayan dolar tutarını döndüren bir api tanımlayalım.
API Oluşturma
Tanım sekmesinde aşağıdaki bilgiler doldurulur:
Ad: Number To Dollars - Number Conversion Service
Açıklama: Number To Dollars - Number Conversion Service
Durum: Aktif
Tip: REST
EndPoint: /dollars/{num}/text
Metot: GET
Yönlendirme sekmesine tıklanır ve Groovy Kodu Çalıştırılması seçilir.
IDE’de bir groovy projesi açıyorum. Hemen ardından NumberToDollars
adında bir groovy’i sınıfı oluşturuyorum.
Hızlıca main
metodumuda oluşturduktan sonra sınıfım aşağıdaki şekilde oluşmuş oluyor.
class NumberToDollars {
static void main(String[] args) {
}
}
Kod içinde loglama yapabilmek için static Logger’ımı sınıf içerisinde tanımlıyorum.
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
Path parametresi içinde gelen sayı değerini alabilmek için aşağıdaki metodu sınıf içine tanımlıyorum.
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/dollars/{num}/text")
.match(request.getRequestURI())
.get("num");
}
Metodu tanımladıktan sonra ana metodumda metod çağırımı yaparak parametremi alabilirim.
def numParam = readPathParameter(request)
Parametremi aldıktan sonra soap isteğimde kullanacağım soap body’imi tanımlıyorum.
String soapBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <NumberToDollars xmlns=\"http://www.dataaccess.com/webservicesserver/\">\n" +
" <dNum>${numParam}</dNum>\n" +
" </NumberToDollars>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
Soap body’imi tanımladıktan sonra, isteğimi yapabilmem için gerekli olan http tanımlamalarını yapıyorum.
HttpClient httpClient = HttpClients.createDefault() as HttpClient;
StringEntity stringEntity = new StringEntity(soapBody, "text/xml", "UTF-8")
HttpPost httpPost = new HttpPost("https://www.dataaccess.com/webservicesserver/NumberConversion.wso");
httpPost.setEntity(stringEntity);
HttpResponse response = null
StringBuilder result = null
Http client’ı kullanarak isteğimizi yaptıktan sonra aldığımız cevap değeri üzerinden bir InputStream
okuması yapacağımız için okuma esnasında alabileceğimiz her türlü `IOException’ı handle edebilmek adına bir try-catch bloğu açıyorum.
try {
} catch (IOException e) {
}
Try bloğunun içinde http isteğimi yapıp cevabını response
objeme atıyorum.
response = httpClient.execute(httpPost);
Response’u aldıktan sonra ResponseBody’i okuyup bir StringBuilder’a eklememiz gerekiyor.
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def resultAsString = result.toString();
XmlSlurper
yardımı ile cevabımızı ayrıştırıp dollarsResult
değerimizi alıyoruz.
dollarsResult
değerimizle responseBody’imizi oluşturup context’imize set ediyoruz.
Tüm bu adımların sonucunda kodum şu hale gelmiş oluyor.
import com.sun.org.slf4j.internal.LoggerFactory
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.HttpClients
import java.net.http.HttpClient
import java.net.http.HttpResponse
import java.util.logging.Logger
class NumberToDollars {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
static void main(String[] args) {
int statusCode = 200;
context.setStatusCode(statusCode);
def numParam = readPathParameter(request)
String soapBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <NumberToDollars xmlns=\"http://www.dataaccess.com/webservicesserver/\">\n" +
" <dNum>${numParam}</dNum>\n" +
" </NumberToDollars>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
HttpClient httpClient = HttpClients.createDefault() as HttpClient;
StringEntity stringEntity = new StringEntity(soapBody, "text/xml", "UTF-8")
HttpPost httpPost = new HttpPost("https://www.dataaccess.com/webservicesserver/NumberConversion.wso");
httpPost.setEntity(stringEntity);
HttpResponse response = null
StringBuilder result = null
try {
response = httpClient.execute(httpPost);
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def resultAsString = result.toString();
def slurper = new XmlSlurper()
def dollarsResult = slurper.parseText(resultAsString).toString();
String responseBody = "{\"result\": \"${dollarsResult}\"}"
context.setResponseBody(responseBody);
} catch (IOException e) {
LOG.error("Hata Oldu");
}
}
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/dollars/{num}/text")
.match(request.getRequestURI())
.get("num");
}
}
IDE yardımı ile yazığım bu kodu apimin yönlendirme tabında bulunan editöre taşıyorum. Taşırken, IDE üzerinde yazdığım main metodumun içeriği execute metodu olacak şekilde taşıyorum. Taşıma sonucunda API tanımında bulunan kodum şu hali almış oluyor.
package com.mirket.gateway.groovy
import groovy.xml.XmlSlurper
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import jakarta.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import groovy.json.JsonSlurper
import org.apache.http.HttpResponse
import org.apache.http.client.HttpClient
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
import org.springframework.web.util.UriTemplate
import java.util.List
import java.util.Map
class GroovyRouteScriptImpl implements GroovyRouteScript {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
void execute(HttpServletRequest request, RoutingContext context) {
int statusCode = 200;
context.setStatusCode(statusCode);
def numParam = readPathParameter(request)
String soapBody = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <NumberToDollars xmlns=\"http://www.dataaccess.com/webservicesserver/\">\n" +
" <dNum>${numParam}</dNum>\n" +
" </NumberToDollars>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
HttpClient httpClient = HttpClients.createDefault() as HttpClient;
StringEntity stringEntity = new StringEntity(soapBody, "text/xml", "UTF-8")
HttpPost httpPost = new HttpPost("https://www.dataaccess.com/webservicesserver/NumberConversion.wso");
httpPost.setEntity(stringEntity);
HttpResponse response = null
StringBuilder result = null
try {
response = httpClient.execute(httpPost);
InputStream ins = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
result = new StringBuilder();
String line = new String();
while ((line = reader.readLine()) != null) {
result.append(line);
}
def resultAsString = result.toString();
def slurper = new XmlSlurper()
def dollarsResult = slurper.parseText(resultAsString).toString();
String responseBody = "{\"result\": \"${dollarsResult}\"}"
context.setResponseBody(responseBody);
} catch (IOException e) {
LOG.error("Hata Oldu");
}
}
private String readPathParameter(HttpServletRequest request) {
return new UriTemplate("/dollars/{num}/text")
.match(request.getRequestURI())
.get("num");
}
}
Kaydet butonuna tıklayarak apimi kaydediyorum.
Test
Oluşturulan API’nin güncelle butonuna tıklanır. Test sekmesine tıklanır. Path Parametrelerinde num değerine 0’dan farklı pozitif bir sayı girilir. Çalıştır’a tıklanır.
Girdiğimiz num değerinin ingilizce olarak okunuşunu cevap olarak aldığımızı görmüş olduk.
Örnek cevap:
{
"result": "ten dollars"
}
Database Access - MongoDB
Tetiklendiğinde tanımlı veri kaynağından istenilen veriyi dönen bir api tanımlayabilirsiniz.
Örneğin, veri kaynağında tanımlı olan bir MongoDB’de bulunan customers
koleksiyonundan id bazlı veri çekecek bir api tanımlamayalım.
API Oluşturma
Tanım sekmesinde aşağıdaki bilgiler doldurulur:
Ad: Get Customer By Id - MongoDB
Açıklama: Tanımlı bir MongoDB veri kaynağından id bazlı müşteri bilgisi çeken api.
Durum: Aktif
Tip: REST
EndPoint: /groovy/customers
Metot: GET
Yönlendirme sekmesine tıklanır ve Groovy Kodu Çalıştırılması seçilir.
IDE’de bir groovy projesi açıyorum. Hemen ardından GetCustomerByIdMongoDB
adında bir groovy’i sınıfı oluşturuyorum.
Hızlıca public void execute
metodumuda oluşturduktan sonra sınıfım aşağıdaki şekilde oluşmuş oluyor.
class GetCustomerByIdMongoDB {
public void execute(HttpServletRequest request, RoutingContext context) {
}
}
Ardından veri tabanı erişimi için kullanacağımız DataSourceFactory
sınıfımızı inject ediyoruz. Groovy script yazmak için kullandığımız IDE projemizde bu satırlar hatalı gözükecektir dikkate almayınız.
@Autowired
private final DataSourceFactory dataSourceFactory
RoutingContext
set edilmek üzere, responseHeaders
, responseBody
, statusCode
değişkenlerini tanımlıyorum.
Map<String, String> responseHeaders = new HashMap<>()
String responseBody = "{\"status\": \"OK\"}"
int statusCode = 200
Request’ten id
parametresini alıyorum.
String id = request.getParameter('id')
Aldığımız id
parametresi ile veri tabanından kaydı çekecek metodu GetCustomerByIdMongoDB
sınıfımıza tanımlayalım.
def findCustomerById(String id) {
try {
def mongoDatabase = dataSourceFactory.getOrCreteMongoDatabase('<MONGODB-DATASOURCE-ALIAS>', '<DB-NAME>')
return mongoDatabase.getCollection('customers').find(Filters.eq('_id', new ObjectId(id))).first()
} catch (e) {
println('Hata Oldu: {}' + e)
return { id: -1 };
}
}
Ana metodumuzun içinde tanımladığımız findCustomerById
metodumuzu id
parametresi ile çağıralım.
def customer = this.findCustomerById(id)
Groovy JsonOutput
sınıfı yardımıyla customer
kaydımızı json formatına düzgün bir şekilde kodlanmış bir dize haline getirelim.
def responseJson = JsonOutput.toJson(customer)
Response değerimizi ve response header’ımızı context’e set edelim.
context.setResponseBody(json)
context.setResponseHeaders(responseHeaders)
Son değişikliklerimizide yaptıktan sonra sınıfımız aşağıdaki hali almış oluyor.
import javax.servlet.http.HttpServletRequest
import java.util.HashMap
import com.mirket.datasources.DataSourceFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.jdbc.core.RowMapper
import java.lang.Object
import java.lang.Override
import java.sql.ResultSet
import java.sql.SQLException
import java.io.Serializable
import org.json.JSONObject
import groovy.json.JsonOutput
import com.mongodb.client.model.Filters
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.bson.types.ObjectId
class GetCustomerByIdMongoDB {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
@Autowired
private final DataSourceFactory dataSourceFactory
public void execute(HttpServletRequest request, RoutingContext context) {
Map<String, String> responseHeaders = new HashMap<>()
String responseBody = "{\"status\": \"OK\"}"
int statusCode = 200
context.setStatusCode(statusCode)
String id = request.getParameter('id')
def customer = this.findCustomerById(id)
def responseJson = JsonOutput.toJson(customer)
context.setResponseBody(responseJson)
context.setResponseHeaders(responseHeaders)
}
def findCustomerById(String id) {
try {
def mongoDatabase = dataSourceFactory.getOrCreteMongoDatabase('<MONGODB-DATASOURCE-ALIAS>', '<DB-NAME>')
return mongoDatabase.getCollection('customers').find(Filters.eq('_id', new ObjectId(id))).first()
} catch (e) {
println('Hata Oldu: {}' + e)
return { id: -1 };
}
}
}
IDE yardımı ile yazığım bu kodu apimin yönlendirme tabında bulunan editöre taşıyorum. Taşıma sonucunda API tanımında bulunan kodum şu hali almış oluyor.
package com.mirket.gateway.groovy
import jakarta.servlet.http.HttpServletRequest
import java.util.HashMap
import com.mirket.datasources.DataSourceFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.jdbc.core.RowMapper
import java.lang.Object
import java.lang.Override
import java.sql.ResultSet
import java.sql.SQLException
import java.io.Serializable
import org.json.JSONObject
import groovy.json.JsonOutput
import com.mongodb.client.model.Filters
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.bson.types.ObjectId
public class GroovyRouteScriptImpl implements GroovyRouteScript {
private static final Logger LOG = LoggerFactory.getLogger('GroovyLogger')
@Autowired
private final DataSourceFactory dataSourceFactory
public void execute(HttpServletRequest request, RoutingContext context) {
Map<String, String> responseHeaders = new HashMap<>()
String responseBody = "{\"status\": \"OK\"}"
int statusCode = 200
context.setStatusCode(statusCode)
String id = request.getParameter('id')
def customer = this.findCustomerById(id)
def responseJson = JsonOutput.toJson(customer)
context.setResponseBody(responseJson)
context.setResponseHeaders(responseHeaders)
}
def findCustomerById(String id) {
try {
def mongoDatabase = dataSourceFactory.getOrCreteMongoDatabase('<MONGODB-DATASOURCE-ALIAS>', '<DB-NAME>')
return mongoDatabase.getCollection('customers').find(Filters.eq('_id', new ObjectId(id))).first()
} catch (e) {
println('Hata Oldu: {}' + e)
return { id: -1 };
}
}
}
Kaydet butonuna tıklayarak apimi kaydediyorum.
Test
Oluşturulan API’nin güncelle butonuna tıklanır. Test sekmesine tıklanır. Path Parametrelerinde id değerine veritabanında kayıtlı bir müşterinin id değerini girilir. Çalıştır’a tıklanır.
Örnek cevap:
{
"_id": "6426ab336b6e999250d5ccd2",
"name": "Russell",
"surname": "K. Dailey",
"email": "RussellKDailey@rhyta.com"
}