Roman Klimenko
EN

Automatiser UI-handlinger med CluedIn GraphQL API

Som Master Data Management-system giver CluedIn brugerne mulighed for at arbejde med data via en brugerflade og low-code-værktøjer. Du kan gennemføre hele datalivscyklussen, fra indlæsning til modellering, transformation, rensning, berigelse, deduplikering og eksport, uden at skrive en eneste linje kode.

Noget arbejde er stadig nemmere at automatisere. Et lille script kan spare forretningsbrugere for gentagne UI-opgaver, især når udviklings-, staging- og produktionsinstanser skal holdes synkroniseret gennem en CI/CD-pipeline.

I denne artikel bygger vi en grundlæggende automatisering uden at kende API'et på forhånd. Udgangspunktet er, at CluedIns UI kommunikerer med serveren gennem et GraphQL API.

To GraphQL API-endpoints

CluedIn tilbyder to GraphQL API-endpoints:

  • /api/api/graphql: Endpointet til dataforespørgsler.
  • /graphql: Endpointet til UI-interaktioner.

Autentificering

CluedIn bruger JSON Web Tokens (JWT) til autorisation.

Der er to slags tokens i CluedIn: API Tokens og Access Tokens.

API Tokens bruges til at hente data ud af CluedIn eller læse data ind. Du kan oprette eller kopiere et fra Administration -> API Tokens.

Access Tokens genereres, når du logger ind i CluedIn som bruger.

Du skal bruge et API Token for at bruge /api/api/graphql-endpointet.

/graphql-endpointet accepterer kun Access Tokens, så du skal logge ind med din e-mail og adgangskode for at få et.

Artiklen Using Postman to interact with the CluedIn API viser, hvordan du henter et Access Token med Postman.

Hvis du vil forespørge data med Python SDK'et, kan du læse Search Entities with CluedIn Python SDK.

Udforskning af GraphQL API

Vi automatiserer en handling, der normalt udføres i UI'et, med CluedIn GraphQL API og CluedIn Python SDK.

Antag, at du skal synkronisere Vocabularies fra et andet system. Du kan oprette dem en ad gangen i CluedIns UI, men det er en oplagt opgave at automatisere.

Start med at oprette et test-Vocabulary i browseren og holde øje med API-requests. Du kan bruge fanen Network eller GraphQL Network Inspector. Jeg synes, GraphQL Network Inspector er nemmere.

Jeg viser begge metoder. Først opretter jeg et test-Vocabulary i CluedIn, mens fanen Network er åben:

Vocabulary Network tab

I listen over GraphQL-requests kan jeg se et kald til mutationen createVocabulary:

Network tab

GraphQL Network Inspector gør kaldet nemmere at finde:

GraphQL Inspector

Uanset metode kan vi nu kopiere GraphQL-forespørgslen:

mutation createVocabulary($vocabulary: InputVocabulary) {
  management {
    id
    createVocabulary(vocabulary: $vocabulary) {
      ...Vocabulary
      __typename
    }
    __typename
  }
}

fragment Vocabulary on Vocabulary {
  vocabularyId
  vocabularyName
  keyPrefix
  isCluedInCore
  entityTypeConfiguration {
    icon
    entityType
    displayName
    __typename
  }
  isDynamic
  isProvider
  isActive
  grouping
  createdAt
  providerId
  description
  connector {
    id
    name
    about
    icon
    __typename
  }
  __typename
}

Requesten indeholder også disse variabler:

{
  "vocabulary": {
    "vocabularyName": "Test",
    "entityTypeConfiguration": {
      "new": false,
      "icon": "Profile",
      "entityType": "/IMDb/Name",
      "displayName": "IMDb Name"
    },
    "providerId": "",
    "keyPrefix": "test",
    "description": ""
  }
}

Python SDK

Nu kan vi bruge CluedIn Python SDK til at oprette et Vocabulary.

Jeg starter med at oprette en fil med mine loginoplysninger til CluedIn. Du kan også angive dem som environment-variabler:

{
  "domain": "172.167.52.102.sslip.io",
  "org_name": "foobar",
  "user_email": "admin@foobar.com",
  "user_password": "mysecretpassword"
}

Så installerer jeg CluedIn Python SDK:

%pip install cluedin

Derefter logger jeg ind i CluedIn for at få et Access Token:

import cluedin

ctx = cluedin.Context.from_json_file('cluedin.json')
ctx.get_token()

ctx-objektet indeholder nu et Access Token og kan bruges til at oprette et Vocabulary:

def create_vocabulary(ctx, name, prefix):
  query = """
mutation createVocabulary($vocabulary: InputVocabulary) {
  management {
    id
    createVocabulary(vocabulary: $vocabulary) {
      ...Vocabulary
    }
  }
}
fragment Vocabulary on Vocabulary {
  vocabularyId
  vocabularyName
  keyPrefix
  entityTypeConfiguration {
    icon
    entityType
    displayName
  }
  providerId
  description
}
"""

  variables = {
    "vocabulary": {
      "vocabularyName": name,
      "entityTypeConfiguration": {
        "new": False,
        "icon": "Profile",
        "entityType": "/IMDb/Name",
        "displayName": "IMDb Name"
      },
      "providerId": "",
      "keyPrefix": prefix,
      "description": ""
    }
  }

  return cluedin.gql.org_gql(ctx, query, variables)

Kald funktionen:

print(create_vocabulary(ctx, 'Foo Bar', 'foo.bar'))

Output:

{
  "data": {
    "management": {
      "id": "management",
      "createVocabulary": {
        "vocabularyId": "e4528e92-f4ad-406a-aeab-756acc20fd01",
        "vocabularyName": "Foo Bar",
        "keyPrefix": "foo.bar",
        "entityTypeConfiguration": {
          "icon": "Profile",
          "entityType": "/IMDb/Name",
          "displayName": "IMDb Name"
        },
        "providerId": null,
        "description": ""
      }
    }
  }
}

Det nye Vocabulary vises i UI'et:

New Vocabulary

Jeg har brugt samme metode i rigtige projekter, for eksempel til at: