Wykorzystanie i użycie komunikacji REST API w systemie AMAGE

Wstęp

System AMAGE udostępnia możliwość komunikacji z zewnętrznymi systemami za pomocą REST API. W celu ułatwienia integracji z systemem AMAGE udostępniamy przykładowe skrypty, które mogą być wykorzystane do integracji z systemem AMAGE. W tym dokumencie przedstawiamy przykłady wykorzystania REST API w systemie AMAGE.

Klucze API, autoryzacja i nagłówki danych

Aby umożliwić dostęp do interfejsu API oraz mieć możliwość komunikacji się poprzez ten interfejs, musimy utworzyć klucze API służące do autoryzacji/podpisywania zapytań, tak aby system AMAGE był w stanie poprawnie rozpoznać zapytanie i udostępnić dane. Wygeneruj klucze API w sekcji konfiguracji i nie zapomnij go aktywować. Zapisz trzy parametry - device-uuid, klucz oraz sekret, które zostaną użyte do generowania podpisu zapytania.

Więcej:

Identyfikacja obiektów/UUID

Obiekty w systemie identyfikują się poprzez swój unikalny identyfikator UUID. W celu pobrania obiektu z systemu należy znać jego UUID. UUID można znaleźć w interfejsie użytkownika, w plikach eksportu, w bazie danych, w logach systemowych. Zwykle w interfejsie użytkownika, dla każdego obiektu pojawia się dodatkowy przycisk w podglądzie danych lub jego edytorze z ikoną (I). Po jego wybraniu wyświetla się informacja o danych identyfikacyjnych obiektu, w tym UUID. Użyj tego UUID do interakcji, tam gdzie wymagane jest podanie UUID.

image 2024 05 26 09 21 39 780
Rysunek 1. Przycisk informacyjny
image 2024 05 26 09 22 10 636
Rysunek 2. Dane identyfikacyjne w tym UUID

Podpis API

Do każdej komunikacji z systemem AMAGE przez interfejs REST wymagane jest dołączenie trzech nagłówków (headers) z danymi:

  • amage-device-uuid - identyfikator urządzenia, dla którego generowany jest podpis

  • amage-api-key - klucz API

  • amage-api-sign - podpis zapytania

Device UUID oraz klucz API podajemy bezpośrednio z wygenerowanego klucza API. Podpis generowany jest na podstawie ścieżki zapytania oraz sekretu klucza API. Podpis jest generowany za pomocą algorytmu SHA-256, a wynik jest przekazywany w postaci binarnej. Następnie wynik jest konwertowany do postaci szesnastkowej i przekazywany jako nagłówek amage-api-sign.

Więcej w przykładach kodu poniżej.

Przykład Pobranie załącznika

Aby pobrać załącznik z systemu AMAGE, należy wykonać zapytanie HTTP GET na odpowiedni adres URL. W zapytaniu należy podać UUID załącznika, który chcemy pobrać. W odpowiedzi otrzymamy plik binarny, który należy zapisać na dysku lokalnym.

Metoda: GET Ścieżka: rest/amage/v1/attachment/get/by-uuid/{uuid} Generuje: APPLICATION_OCTET_STREAM_VALUE Wymaga: TEXT_PLAIN_VALUE, APPLICATION_JSON_VALUE Autoryzacja: podpis API (device-uuid, api-key, api-sign)

Po wykonaniu zapytania w odpowiedzi otrzymamy plik binarny, który należy zapisać na dysku lokalnym. Kod przykładu w Pythonie poniżej.

Przykłady pobrania treści raportu w formacie JSON

Aby otrzymać treść raportu z systemu AMAGE, należy wykonać zapytanie HTTP GET na odpowiedni adres URL. W zapytaniu należy podać UUID zakładki raportu, który chcemy pobrać. W odpowiedzi otrzymamy dane JSON, które można przetworzyć w dowolny sposób. W tm przypadku (dla raportów) możemy przesyłać w zapytaniu parametry device-uuid, api-key oraz bezpośrednio api-secret. Ułatwia to generowanie zapytań i wykorzystani API raportów przy pomocy systemów Business Intelligence (BI). Należy podkreślić, że metoda z podpisywaniem za pomocą api-sign zawsze działa.

Metoda: GET Ścieżka: rest/amage/v1/reports/generate/raw-json/by-bookmark-uuid/{uuid}

Przykładowe wywołanie poprzez HTTP Client:

image 2024 05 24 10 52 17 956
Rysunek 3. Wywołanie HTTP Client

Wynik zapytania dla raportu w formacie JSON:

{
  "item": {
    "GROUP_UUID": "",
    "INVENTORY_NUMBER": "X/23/333/2023",
    "TESTING_LABORATORY_UUID": "",
    "MANUFACTURER_NAME": "AMAGE",
    "TYPE_MANUFACTURER_UUID": "b133c9d3-a018-405e-b632-d124ea5c342e",
    "SERIAL_NUMBER": "XX15/1/1[A]",
    "MANUFACTURER_UUID": "b133c9d3-a018-405e-b632-d124ea5c342e",
    "TYPE_MANUFACTURER_NAME": "AMAGE",
    "MAP_SHAPE_MAP_NAME": "",
    "NOTE": "Testowe urządzenie",
    "PARENT_NAME": "100DE15 SPOOL-1",
    "IS_EQUIPMENT": "false",
    "UUID": "1d3b6c7a-d522-4062-9f23-3376694a6ac5",
    "TESTING_LABORATORY_NAME": "",
    "PARENT_UUID": "da6243db-abef-44ee-b535-3b1556de6407",
    "IDENTIFIERS": " ",
    "TYPE_CATALOG_NUMBER": "",
    "LOCATION_UUID": "",
    "NAME": "100DE15 SPOOL-1 PT-NO-1[A] IC 26_LL PIPE SL, CS, CE, TC2, 114.3X6.3",
    "TYPE_UUID": "b4b0c37e-7c39-4946-ab81-7c373c17e37c",
    "GROUP_NAME": "",
    "TYPE_ORDER_NUMBER": "",
    "EQUIPMENT_VALID_TILL_DATE": "-",
    "MAP_SHAPE_LONGITUDE": "",
    "MAP_SHAPE_LATITUDE": "",
    "COUNT": "0,00",
    "TYPE_NAME": "Element Produktu",
    "LOCATION_NAME": ""
  }
}

Przykład Python

Kod w przykładzie poniżej przedstawia skrypt w języku Python, który pobiera załącznik z systemu AMAGE. Skrypt wykorzystuje bibliotekę requests do komunikacji z serwerem oraz hashlib do generowania podpisu API. W miejscu <amage_server_address> należy podać adres serwera AMAGE.

#!/usr/bin/python3

import binascii
import requests
import hashlib

PARAM_SEPARATOR = ";"

path = 'attachment/get/by-uuid/d18ed480-febd-4f0c-a979-a773bca83423'
device_uuid = "86947df1-ba7d-46d7-83a8-a90e1fdca8bf"
api_key = "e3d1acd2c8b5e47d9e612cf46f08523f"
api_secret = "7fe1cde52dc14ecc4b222090c72b4380"

def calc_api_sign(path, api_secret):
    message_digest = hashlib.sha256()
    message_digest.update(api_secret)
    message_digest.update(PARAM_SEPARATOR.encode('utf-8'))
    message_digest.update(path.encode('utf-8'))
    return message_digest.digest()

def download_file(url, headers, local_filename):
    with requests.get(url, headers=headers, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192):
                f.write(chunk)
    return local_filename

api_sign = binascii.hexlify(calc_api_sign(path, bytearray.fromhex(api_secret))).decode()

url = "https://<amage_server_address>/rest/amage/v1/" + path
headers = {
    "Content-Type": "text/plain",
    "Accept": "application/octet-stream",
    "amage-device-uuid": device_uuid,
    "amage-api-key": api_key,
    "amage-api-sign": api_sign
}

local_filename = "item.png"
download_file(url, headers, local_filename)

Więcej

Howto powstało na bazie wersji systemu 1.27.0.0 (05.2024) oraz przedstawia funkcje, które mogą nie być dostępne w Twoim systemie. Zapytaj AMAGE o udostępnienie tej funkcjonalności.
Ze względu na ciągły rozwój systemu niektóre ekrany lub pliki konfiguracji mogą wyglądać nieznacznie inaczej, ale zachowają nadal pełną funkcjonalność tutaj opisaną. Nie wpływa to na zasadnicze funkcje opisywane w tym dokumencie.