En son kararlı sürüm için lütfen Mirket Geliştirici Dokümanı v4.9.x!

Javascript Request & Response Dönüşümü

REST to SOAP

Rest’ten Soap’a bir JavaScript dönüşüm örneği yapalım. Bu örnek için senaryomuz şu şekilde, dışarda bir SOAP servisimiz olduğunu varsayalım. Biz bu SOAP servisine Rest bir Mirket apisi ile istek yapmaya çalışalım.

API Oluşturma

Tanım sekmesinde aşağıdaki bilgiler doldurulur:

Ad: Number to Dollars | REST to SOAP | JS

Açıklama: Geçirilen sayının sıfır olmayan dolar tutarını döndüren, açık kaynak soap apisine istek & cevap dönüşümü kullanarak soap isteği atan rest bir mirket apisi. Kaynak: https://documenter.getpostman.com/view/8854915/Szf26WHn#2d448676-ccb9-44b6-87f6-4d311a

Durum: Aktif

Tip: REST

EndPoint: /js/number-to-dollars

Metot: POST

API Oluşturma
Figure 1. API Oluşturma

Yönlendirme sekmesine tıklanır ve Basit Yönlendirme seçilir.

Yönlendirme
Figure 2. Yönlendirme

Dönüşüm sekmesine tıklanır ve İstek Veri Dönüşümü tabında JavaScript seçilir.

Bu adımda karşımıza çıkan örnek bir javascript kodu editörde gözükecek.

function transform(input) {
    return input;
}

Bu örnek kodu IDE üzerinde düzenleyerek REST request body’imi json’dan SOAP XML’ine dönüştüreceğim.

IDE üzerinde RequestTransformation adında bir javascript dosyası oluşturuyorum. Hemen ardından transform metotumuzu tanımlıyoruz.

function transform(input) {
    return input;
}

JavaScript JSON.parse metodu ile input olarak gelen request body’imi ayrıştırıyorum.

const requestBody = JSON.parse(input);
const num = requestBody.num;

Gidiceğimiz SOAP Servisin request xml’i aşağıdaki şekilde.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <NumberToDollars xmlns="http://www.dataaccess.com/webservicesserver/">
      <dNum>100</dNum>
    </NumberToDollars>
  </soap:Body>
</soap:Envelope>

Json request’imizden aldığımız num değerini alıp, soap request xml’inde <dNum> tagları arasına ekleyip return ediyoruz.

return `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <NumberToDollars xmlns="http://www.dataaccess.com/webservicesserver/">
      <dNum>${num}</dNum>
    </NumberToDollars>
  </soap:Body>
</soap:Envelope>`;

SOAP xml’imin düzgün oluşup oluşmadığını görmek için javascript dosyamızda transform metodumuzu json request body’imiz ile çağırıp, return değerini console loguna yazdırıyorum.

let soapXML = transform(`{"num": 50}`);
console.log(soapXML);

Metodumu çalıştırdıktan sonra aşağıdaki gibi bir çıktının console’a çıktığını görüyorum.

$ node RequestTransformation.js
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <NumberToDollars xmlns="http://www.dataaccess.com/webservicesserver/">
      <dNum>50</dNum>
    </NumberToDollars>
  </soap:Body>
</soap:Envelope>

Geliştirme sonrasında javascript kodumuz aşağıda bulunuyor.

function transform(input) {
    const requestBody = JSON.parse(input);
    const num = requestBody.num;

    return `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <NumberToDollars xmlns="http://www.dataaccess.com/webservicesserver/">
      <dNum>${num}</dNum>
    </NumberToDollars>
  </soap:Body>
</soap:Envelope>`;
}

let soapXML = transform(`{"num": 50}`);
console.log(soapXML);

Bu javascript dosyasınıda yaptığımız transform’u api üzerine taşıyalım.

function transform(input) {
    const requestBody = JSON.parse(input);
    const num = requestBody.num;

    return `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <NumberToDollars xmlns="http://www.dataaccess.com/webservicesserver/">
      <dNum>${num}</dNum>
    </NumberToDollars>
  </soap:Body>
</soap:Envelope>`;
}

Cevap Veri Dönüşümü tabında JavaScript seçilir.

Gittiğimiz SOAP servisin bize döndüğü cevap xml’ini json’a dönüştürmek için bir response transformation kodu yazalım.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <m:NumberToDollarsResponse xmlns:m="http://www.dataaccess.com/webservicesserver/">
            <m:NumberToDollarsResult>one hundred dollars</m:NumberToDollarsResult>
        </m:NumberToDollarsResponse>
    </soap:Body>
</soap:Envelope>

IDE üzerinde ResponseTransformation adında bir javascript dosyası oluşturuyorum. Hemen ardından transform metotumuzu tanımlıyoruz.

function transform(input) {
    return input;
}

Response soap xml’inde NumberToDollarsResult tagları arasındaki result değerimizi alabilmek için bir pattern tanımlıyorum.

const numberToDollarsResultPattern = Pattern.compile("<m:NumberToDollarsResult>(.*?)</m:NumberToDollarsResult>");

Tanımladığımız pattern ile eşleşen değeri bize dönen bir metot yazıyorum.

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}

Yazdığımız metodu transform mateodumuzda çağırıp, json response’umuzu oluşturuyorum.

const result = getValueByPattern(input, numberToDollarsResultPattern);
return `{
      "result": ${result}
}`;

Geliştirme sonrasında javascript kodumuz aşağıda bulunuyor.

function transform(input) {
    const numberToDollarsResultPattern = Pattern.compile("<m:NumberToDollarsResult>(.*?)</m:NumberToDollarsResult>");

    const result = getValueByPattern(input, numberToDollarsResultPattern);
    return `{
          "result": ${result}
    }`;
}

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}

JavaScript kodumuzda kullandığımız Pattern sınıfı bir Java sınıfıdır. Java sınıflarını JavaScript kodunuzda kullanmak isterseniz aşağıdaki örnekteki gibi JavaScript kodunuza tanımlayıp kullanabilirsiniz.

const Pattern = Java.type('java.util.regex.Pattern');

Pattern sınıfı sık kullanılan bir Java sınıfı olduğundan context’e tanımlıdır. Esktra tanımlamanıza gerek yoktur. Pattern harici başka Java sınıfı kullanma ihtiyacınız oluşursa bu örnekteki gibi tanımlayıp kullanabilirsiniz.

Bu javascript dosyasınıda yaptığımız transform’u api üzerine taşıyalım.

function transform(input) {
    const numberToDollarsResultPattern = Pattern.compile("<m:NumberToDollarsResult>(.*?)</m:NumberToDollarsResult>");

    const result = getValueByPattern(input, numberToDollarsResultPattern);
    return `{
          "result": ${result}
    }`;
}

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}
Dönüşüm
Figure 3. Dönüşüm

API İsteği Başlıkları tabında aşağıdaki gibi bir istek başlığı tanımlanır.

İstek Başlığı İsmi: Content-Type

İstekte Gelen Başlığın Üzerine Yaz: İşaretli

Değer Kaynağı: Sabit

Sabit Değer: text/xml; charset=utf-8

Kaydet butonuna tıklayarak apimi kaydediyorum.

Test

Oluşturulan API’nin güncelle butonuna tıklanır. Test sekmesine tıklanır.

İstek bölümünde Gövde tabına tıklanır. Aşağıdaki gibi bir istek gövdesi eklenir.

{
  "num": 50
}

Çalıştır’a tıklanır.

Örnek cevap:

{
  "results": "five hundred dollars"
}

SOAP to REST

JSONPlaceholder’da bulunan gönderi güncelleme public apisine, SOAP bir mirket apisi ile istek atmaya çalışalım.

API Oluşturma

Tanım sekmesinde aşağıdaki bilgiler doldurulur:

Ad: Update Post - JSONPlaceholder | SOAP to REST | JS

Açıklama: JSONPlaceholder da REST bir api olan gönderi güncelleme apisine istek ve cevap dönüşümü ile soap isteği yapabilmeyi sağlayan mirket apisi.

Durum: Aktif

Tip: SOAP

EndPoint: /js/posts-operations

Metot: updatePostRequest

API Oluşturma
Figure 4. API Oluşturma

Yönlendirme sekmesine tıklanır ve Basit Yönlendirme seçilir.

Backend Http Metod: PUT

Yönlendirme
Figure 5. Yönlendirme

Dönüşüm sekmesine tıklanır ve İstek Veri Dönüşümü tabında JavaScript seçilir.

Bu adımda karşımıza çıkan örnek bir javascript kodu editörde gözükecek.

function transform(input) {
    return input;
}

Bu örnek kodu IDE üzerinde düzenleyerek REST request body’imi json’dan SOAP XML’ine dönüştüreceğim.

IDE üzerinde RequestTransformation adında bir javascript dosyası oluşturuyorum. Hemen ardından transform metotumuzu tanımlıyoruz.

function transform(input) {
    return input;
}

Mirket API’mize geldiğimiz SOAP XML request’imizi JSONPlaceholder’a giderken kullanacağımız JSON request’imize dönüştürmek için request transformation kodumuzu yazalım.

Mirket apimizi tetiklemek için kullandığımız SOAP request xml’i:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://jsonplaceholder.com/wsdl/">
    <soapenv:Header/>
    <soapenv:Body>
        <wsdl:updatePostRequest>
            <userId>1</userId>
            <id>2</id>
            <title>qui est esse</title>
            <body>est rerum tempore vitae sequi sint nihil reprehenderit</body>
        </wsdl:updatePostRequest>
    </soapenv:Body>
</soapenv:Envelope>

Transform metodumuz içerisinde SOAP request’imizdeki değerleri almak için patternleri tanımlayalım.

const userIdPattern = Pattern.compile("<userId>(.*?)</userId>");
const idPattern = Pattern.compile("<id>(.*?)</id>");
const titlePattern = Pattern.compile("<title>(.*?)</title>");
const bodyPattern = Pattern.compile("<body>(.*?)</body>");

Tanımladığımız pattern ile eşleşen değeri bize dönen bir metot yazalım.

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}

Yazdığımız metodu transform mateodumuzda çağırıp, json response’umuzu oluşturuyorum.

    const userId = getValueByPattern(input, userIdPattern);
    const id = getValueByPattern(input, idPattern);
    const title = getValueByPattern(input, titlePattern);
    const body = getValueByPattern(input, bodyPattern);

    return JSON.stringify({userId, id, title, body});

Geliştirme sonrasında javascript kodumuz aşağıda bulunuyor.

function transform(input) {
    const userIdPattern = Pattern.compile("<userId>(.*?)</userId>");
    const idPattern = Pattern.compile("<id>(.*?)</id>");
    const titlePattern = Pattern.compile("<title>(.*?)</title>");
    const bodyPattern = Pattern.compile("<body>(.*?)</body>");

    const userId = getValueByPattern(input, userIdPattern);
    const id = getValueByPattern(input, idPattern);
    const title = getValueByPattern(input, titlePattern);
    const body = getValueByPattern(input, bodyPattern);

    return JSON.stringify({userId, id, title, body});
}

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}

JavaScript kodumuzda kullandığımız Pattern sınıfı bir Java sınıfıdır. Java sınıflarını JavaScript kodunuzda kullanmak isterseniz aşağıdaki örnekteki gibi JavaScript kodunuza tanımlayıp kullanabilirsiniz.

const Pattern = Java.type('java.util.regex.Pattern');

Pattern sınıfı sık kullanılan bir Java sınıfı olduğundan context’e tanımlıdır. Esktra tanımlamanıza gerek yoktur. Pattern harici başka Java sınıfı kullanma ihtiyacınız oluşursa bu örnekteki gibi tanımlayıp kullanabilirsiniz.

Bu javascript dosyasınıda yaptığımız transform’u api üzerine taşıyalım.

function transform(input) {
    const userIdPattern = Pattern.compile("<userId>(.*?)</userId>");
    const idPattern = Pattern.compile("<id>(.*?)</id>");
    const titlePattern = Pattern.compile("<title>(.*?)</title>");
    const bodyPattern = Pattern.compile("<body>(.*?)</body>");

    const userId = getValueByPattern(input, userIdPattern);
    const id = getValueByPattern(input, idPattern);
    const title = getValueByPattern(input, titlePattern);
    const body = getValueByPattern(input, bodyPattern);

    return JSON.stringify({userId, id, title, body});
}

function getValueByPattern(input, pattern) {
    const matcher = pattern.matcher(input);

    if (matcher.find()) {
        return matcher.group(1);
    }
    return null;
}

Cevap Veri Dönüşümü tabında JavaScript seçilir.

Gittiğimiz REST apinin bize döndüğü cevap json’ını soap xml’ine dönüştürmek için bir response transformation kodu yazalım.

{
    "id": 1,
    "title": "foo",
    "body": "bar",
    "userId": 1
}

IDE üzerinde ResponseTransformation adında bir javascript dosyası oluşturuyorum. Hemen ardından transform metotumuzu tanımlıyoruz.

function transform(input) {
    return input;
}

Response body’i de bulunan değerlere erişebilmek için JSON.parse metodu yardımı ile ayrıştırıp response adında değişkene atıyorum. JSONPlaceholder JSON response’undan gelen değerleri key’leri ile değişkene çıkarıyorum.

const response = JSON.parse(input);
const userId = response.userId;
const id = response.id;
const title = response.title;
const body = response.body;

SOAP Response’umuzu bu değerler ile oluşturup dönüyorum.

return `<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsdl=\"http://jsonplaceholder.com/wsdl/\">
    <soapenv:Header/>
    <soapenv:Body>
        <wsdl:updatePostResponse>
            <userId>${userId}</userId>
            <id>${id}</id>
            <title>${title}</title>
            <body>${body}</body>
        </wsdl:updatePostResponse>
    </soapenv:Body>
</soapenv:Envelope>`

Transform metodumuzu örnek bir json response’u ile çağırıp console’a log olarak yazdıralım.

const res = transform(`{"userId": 2, "id": 1, "title": "Başlık", "body": "Gövde"}`);
console.log("Response: ", res);

Metodumuzu çalıştırdıktan sonra aşağıdaki gibi bir çıktının console’a çıktığını görüyoruruz.

$ node ResponseTransformation.js
Response:  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://jsonplaceholder.com/wsdl/">
    <soapenv:Header/>
    <soapenv:Body>
        <wsdl:updatePostResponse>
            <userId>2</userId>
            <id>1</id>
            <title>Başlık</title>
            <body>Gövde</body>
        </wsdl:updatePostResponse>
    </soapenv:Body>
</soapenv:Envelope>

Geliştirme sonrasında javascript kodumuz aşağıda bulunuyor.

function transform(input) {
    const response = JSON.parse(input);
    const userId = response.userId;
    const id = response.id;
    const title = response.title;
    const body = response.body;

    return `<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsdl=\"http://jsonplaceholder.com/wsdl/\">
    <soapenv:Header/>
    <soapenv:Body>
        <wsdl:updatePostResponse>
            <userId>${userId}</userId>
            <id>${id}</id>
            <title>${title}</title>
            <body>${body}</body>
        </wsdl:updatePostResponse>
    </soapenv:Body>
</soapenv:Envelope>`
}

const res = transform(`{"userId": 2, "id": 1, "title": "Başlık", "body": "Gövde"}`);
console.log("Response: ", res);

Bu javascript dosyasınıda yaptığımız transform’u api üzerine taşıyalım.

function transform(input) {
    const response = JSON.parse(input);
    const userId = response.userId;
    const id = response.id;
    const title = response.title;
    const body = response.body;

    return `<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsdl=\"http://jsonplaceholder.com/wsdl/\">
    <soapenv:Header/>
    <soapenv:Body>
        <wsdl:updatePostResponse>
            <userId>${userId}</userId>
            <id>${id}</id>
            <title>${title}</title>
            <body>${body}</body>
        </wsdl:updatePostResponse>
    </soapenv:Body>
</soapenv:Envelope>`
}
Dönüşüm
Figure 6. Dönüşüm

API İsteği Başlıkları tabında aşağıdaki gibi bir istek başlığı tanımlanır.

İstek Başlığı İsmi: Content-Type

İstekte Gelen Başlığın Üzerine Yaz: İşaretli

Değer Kaynağı: Sabit

Sabit Değer: application/json

Kaydet butonuna tıklayarak apimi kaydediyorum.

Test

Oluşturulan API’nin güncelle butonuna tıklanır. Test sekmesine tıklanır.

İstek bölümünde Gövde tabına tıklanır. Aşağıdaki gibi bir istek gövdesi eklenir.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://jsonplaceholder.com/wsdl/">
  <soapenv:Body>
    <wsdl:updatePostRequest>
      <userId>1</userId>
      <id>2</id>
      <title>qui est esse</title>
      <body>est rerum tem</body>
    </wsdl:updatePostRequest>
  </soapenv:Body>
</soapenv:Envelope>

Çalıştır’a tıklanır.

Örnek cevap:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://jsonplaceholder.com/wsdl/">
  <soapenv:Body>
    <wsdl:updatePostResponse>
       <userId>1</userId>
       <id>2</id>
       <title>qui est esse</title>
       <body>est rerum tem</body>
    </wsdl:updatePostResponse>
  </soapenv:Body>
</soapenv:Envelope>