Semantyka a syntaktyka – kodowanie treści w Azure Logic Apps

Semantyka a syntaktyka – kodowanie treści w Azure Logic Apps

Semantyka i syntaktyka naleza do istotnych elementow kodowania tresci. Inaczej w XML, inaczej w JSON. Jak się okazuje, nie inaczej jest w Logic Apps, których znajomość składni może zaoszczędzić nam niemało czasu. Różne klocki zwracają nam dane w różnych formatach, przez co kod użyty do przetworzenia jednego rodzaju output’u może nie współpracować z innym rodzajem output’u. Klocek z Blob Storage zwróci nam inaczej zakodowaną zawartość (content) niż klocek z Azure Functions. Po wielu próbach związanych z integracją funkcji z Logic Apps, postaram się opisać przykładowe problemy z jakimi miałem do czynienia oraz wyjasnić zastosowane do nich rozwiązania. W skróce mówiąc – jak odwolywac sie do treści oraz jak ją kodowac w ramach tworzonych Logic Apps.

Dokumentacja Logic Apps (LINK) mówi nam o następujących funkcjach, transformujących jeden content-type na drugi:

  • @json() – casts data to application/json
  • @xml() – casts data to application/xml
  • @binary() – casts data to application/octet-stream
  • @string() – casts data to text/plain
  • @base64() – converts content to a base64 string
  • @base64toString() – converts a base64 encoded string to text/plain
  • @base64toBinary() – converts a base64 encoded string to application/octet-stream
  • @encodeDataUri() – encodes a string as a dataUri byte array
  • @decodeDataUri() – decodes a dataUri into a byte array

Przypadków użycia jest wiele, także opowiem o kilku “ciekawszych”:

Zapis pliku zwróconego przez funkcję do Azure Blob Storage

Posiadając prostą funkcję, która na przykład wygeneruje nam miniarurkę zdjęcia, plik PDF bądź arkusz Excela musimy pamiętać, że odwołanie

@body('GetFileFunctionName')

zwróci nam nasz plik… ale w formie base64 🙁 . Dlatego musimy to jeszcze ubrać w magiczną formułkę

@base64toBinary(body('GetFileFunctionName'))

która dopiero zwróci nam oczekiwany wynik wywołania funkcji.

Dostęp do JSONa zapisanego w Azure Blob Storage

Do JSONa możemy odwołać się takim kawałkiem kodu

@json(body('Get_blob_content'))

Ciekawe jest, że chcąc odwołać się do JSONa zwróconego przez funkcję, nie musimy stosować

@json(body('FunctionWithJson')['JsonPropertyName'])

gdyż taki kawałek jest wystarczający

@body('FunctionWithJson')['JsonPropertyName']

Odczyt propertiesów JSONa i ich przekazanie dalej

Na koniec wisienka na torcie, z którą trochę przyszło mi się pomęczyć. Rzeczą tą jest odczyt elementów JSONa i ich ponowne wykorzystanie w innym JSONie (ponieważ Logic App to jeden wielki JSON).

Wykorzystanie następującego kodu:

{"ImageId": "@{body('GetImageByPath')['ImageId']}"}

zwróci nam:

{"ImageId": "1"}

Uzyskany efekt nie jest zazwyczaj pożądany, gdyż potrzebujemy wartość konkretnego typu (int, decimal, boolean), a nie jej serializację do stringa. Serializacji unikniemy stosując zmodyfikowaną wersję kodu powyżej:

 { "ImageId": "@body('GetImageByPath')['ImageId']" } 

Serializacja idzie zgodnie z naszą myślą i zamiast stringa mamy int.

{"ImageId": 1}

Podsumowanie

Opisane rozwiązania dotyczą tylko niektórych przypadków. Możliwych przypadków jest wiele i musimy liczyć się z faktem, że nie zawsze znajdziemy gotowe rozwiązanie na StackOverflow. Jako że dokumentacja również nie opisuje wszystkich z nich, najlepszą opcją jest uzbrojenie się w cierpliwość i próba integracji metodą prób i błędów. W końcu mamy skończoną ilość kombinacji możliwych formatowań 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *