Pipedream Üzerinde XML-JSON İşlemleri

Bir önceki yazıda Pipedream adında bir entegrasyon platformundan ve bu platformun ne tür amaçlarla, nasıl kullanılanıbileceğinden bahsetmiştim. Daha önce PHP ile gerçekleştirilen XML dosyası okuma ve sonucu bir uç noktaya iletme sürecini daha sonra Node.js ile yeniden ele aldık.

AA

Bu örnek içerisinde xml2js ve express.js modüllerini kullanılmıştı. Bu yazıda tüm bu süreci farklı modüllerle pipedream üzerinden gerçekleştireceğiz.

Pipedream

Pipedream ile ilgili yazıyı okumayan ve doğrudan bu yazıya ulaşanlar için pipedream hakkında kısa bir açıklama düşelim. Pipedream, iş akışı oluşturarak sunucu ve altyapı sınırlandırmaları olmaksızın uygulamalar ve API‘ler arasında entegrasyonlar gerçekleştirebilmemizi sağlayan bir entegrasyon platformu. Pek çok hazır uygulama bağlantılar aracılığıyla bu iş akışına dahil edilebilmekte. Ek olarak, uygulamalar arasındaki işlemler kod müdahaleleri ile özelleştirilebilmekte. Kodlama işlemi Node.js temelinde JavaScript kodları ile gerçekleştirilmekte ve modüller kolaylıkla iş akışlarına eklenebilmekte.

Pipedream Üzerinden XML-JSON İşlemi

Node.js İle XML-JSON İşlemleri başlıklı yazıda bir XML kaynağını (URL ve/veya dosya) JSON çıktısı haline getirmiştik. Dolayısıyla aynı işlemi tekrarlamak yerine süreci farklı bir şekilde ele alalım. İlk olarak kullandığımız modülleri değiştirelim. Ardındaın, bu işlemi komut satırı üzerinden yürütelim.

İhtiyacımız olan kullanım şu olsun.

curl -d '{
  "xml": "<xml-url>",
  "to": "<target-url>"
}' \
  -H "Content-Type: application/json" \
  <pipedream-url>

Bu komut satırında curl ile bir hedefe: <pipedream-url> 2 değer iletmekteyiz; "xml": "<xml-url>" ve "to": "<target-url>. xml bizim sahip olduğumuz bir XML yolunu (dosya da olabilirdi) to ise XML’in dönüştürüleceği JSON çıktısının hangi URL’e iletileceğini belirtmekte.

XML örneklerinde daha önce node tanımlarını kullanmıştık. Bu defa attr tanımlarının olduğu bir örnek üzerinden ilerleyeceğim. xml-url için bulduğum bir XML kaynağını kullanacağım. Websayfasındaki dükkan ID’lerini kullanarak farklı XML içeriklerini üretmek mümkün.

target-url için ise webhook.site sitesinden faydalanacağım.

Sırada pipedream iş akışının oluşturulması var. Elbette uygulamamız gereği ilk olarak pipedream-url için bir HTTP/Webhook tetikleyicisi oluşturmamız gerekmekte.

Pipedream HTTP/Webhook

Bu bilgiler sonucunda komutumuzun eksik alanlarını tamamlamış olduk.

curl -d '{
  "xml": "https://www.haydigiytoptan.com/FaprikaXml/DG36SX/1/",
  "to": "https://webhook.site/ea994303-0ab3-4506-8b33-0f31f8cdb339"
}' \
  -H "Content-Type: application/json" \
  https://en5bxyd2ehwly83.m.pipedream.net

O halde bir sonraki aşamaya geçebiliriz. Yukarıdaki komutu uyguladığımızda pipedream hedefine 2 bilgi iletilmekte xml ve to. Ancak, bu bilgi elbette bir dönüşüme (encode) uğramakta. Dolayısıyla tekrar kullanılabilir (decode) hale getirmemiz gerekiyor. Dolayısıyla iş akışına bir sonraki adım olarak base64_decode_string alanını eklemeliyiz.

Decoded UTF-8 string

Artık son adımıza geçebilir ve edindiğimiz bu bilgileri düzenleyerek belirtilen hedefe iletebiliriz. Kullanacağımız modüllerimiz fast-xml-parser1 ve axios2.

const parser = require('fast-xml-parser');
const axios = require('axios');

Son durumda elimizde decode edilmiş bir string ifade var.

{
  "xml": "https://www.haydigiytoptan.com/FaprikaXml/DG36SX/1/",
  "to": "https://webhook.site/fe1f0117-0cb5-4a60-bb79-43d68d14badb"
}

Bu ifadeyi tekrar JSON formatına dönüştürmemiz gerekiyor.

let XML_data = JSON.parse(steps.base64_decode_string.data);

Bundan sonraki aşama artık XML dosyasının getirilmesi ve JSON formatına dönüştürülmesi işlemlerini barındırmakta.

const parser = require('fast-xml-parser');
const axios = require('axios');

let XML_data = JSON.parse(steps.base64_decode_string.data);

const XML_url = XML_data.xml;

let XML_file = (await axios({
  method: "GET",
  url: XML_url,
}));

const options = {
    attributeNamePrefix : "",
    attrNodeName: "attr",
    textNodeName : "#text",
    ignoreAttributes : false,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : true,
    trimValues: true,
    arrayMode: false
};

if( parser.validate(XML_file.data) === true) {
  try{
    var jsonObj = parser.parse(XML_file.data, options, true);
  }catch(error){
    console.log(error.message)
  }
}

await axios({
  method: 'post',
  url: XML_data.to,
  data: jsonObj.Products
});

$respond({
  body: 'OK'
})

Komut satırından yukarıda belirtilen komutu uyguladığımızda XMl içeriğimiz JSON olarak düzenlenerek belirtilen hedefe iletilecektir. İşlemin tamamlanmasının ardından konsoldan OK dönüşünü alırsınız. Şimdi, hedef URL’imize bakalım.

Evet, komut satırı üzerinden ilettiğimiz kod başarı ile işleme alınmış görünüyor. İlgili iş akışına XML-JSON Command3 adıyla ulaşabilirsiniz. Son olarak, fast-xml-parser1 options tanımlarına göre hareket etmekte. Dolayısıyla XML içeriğinize bağlı olarak bu alanları düzenlemeniz gerekebilir. Detaylı bilgi için GitHub4 ve örnek uygulama5 sayfasına göz atabilirsiniz.