Partager via


Objets de base de données développés dans le générateur d’API de données

Le générateur d’API de données prend en charge les vues et les procédures stockées comme alternatives au mappage à des tables ou conteneurs de base de données. Ces objets de base de données distincts nécessitent une configuration personnalisée pour mapper en toute transparence aux points de terminaison REST ou GraphQL. Une configuration personnalisée est nécessaire pour utiliser le générateur d’API de données avec des vues et des procédures stockées.

Cet article comprend une répartition de l’utilisation des vues et des procédures stockées avec le générateur d’API de données.

Affichage

Les vues peuvent être utilisées de manière similaire à la façon dont une table peut être utilisée dans le générateur d’API de données. L’utilisation de l’affichage doit être définie en spécifiant le type source de l’entité comme view. En plus de cela, la propriété key-fields doit être fournie, afin que le générateur d’API de données sache comment il peut identifier et retourner un seul élément, si nécessaire.

Si vous avez une vue, par exemple dbo.vw_books_details elle peut être exposée à l’aide de la commande dab suivante :

dab add BookDetail --source dbo.vw_books_details --source.type View --source.key-fields "id" --permissions "anonymous:read"

Note

--source.key-fields est obligatoire pour les vues lors de la génération de la configuration via l’interface CLI.

Le fichier dab-config.json ressemble à l’exemple suivant :

"BookDetail": {
  "source": {
    "type": "view",
    "object": "dbo.vw_books_details",
    "key-fields": [ "id" ]
  },
  "permissions": [{
    "role": "anonymous",
    "actions": [ "read" ]
  }]
}

Note

Notez que vous devez configurer l’autorisation en conséquence avec la possibilité de la vue d’être mise à jour ou non. Si une vue n’est pas modifiable, vous devez autoriser uniquement un accès en lecture à l’entité en fonction de cette vue.

Prise en charge REST des vues

Une vue, du point de vue REST, se comporte comme une table. Toutes les opérations REST sont prises en charge.

Prise en charge de GraphQL pour les vues

Une vue, du point de vue GraphQL, se comporte comme une table. Toutes les opérations GraphQL sont prises en charge.

Procédures stockées

Les procédures stockées peuvent être utilisées en tant qu’objets liés aux entités exposées par le générateur d’API de données. L’utilisation de la procédure stockée doit être définie en spécifiant que le type source de l’entité est stored-procedure.

Note

Le générateur d’API de données prend en charge les procédures stockées pour les bases de données relationnelles (par exemple, MSSQL), mais pas pour les bases de données non relationnelles (c’est-à-dire NoSQL).

Si vous avez une procédure stockée, par exemple dbo.stp_get_all_cowritten_books_by_author elle peut être exposée à l’aide de la commande dab suivante :

dab add GetCowrittenBooksByAuthor --source dbo.stp_get_all_cowritten_books_by_author --source.type "stored-procedure" --source.params "searchType:s" --permissions "anonymous:execute" --rest.methods "get" --graphql.operation "query"

Le fichier dab-config.json ressemble à l’exemple suivant :

"GetCowrittenBooksByAuthor": {
  "source": {
    "type": "stored-procedure",
    "object": "dbo.stp_get_all_cowritten_books_by_author",
    "parameters": {
      "searchType": "s"
    }
  },
  "rest": {
    "methods": [ "GET" ]
  },
  "graphql": {
    "operation": "query"
  },
  "permissions": [{
   "role": "anonymous",
    "actions": [ "execute" ]
  }]
}

La parameters définit quels paramètres doivent être exposés et fournit également des valeurs par défaut à passer aux paramètres de procédure stockée, si ces paramètres ne sont pas fournis dans la requête HTTP.

Limitations

  • Seul le premier jeu de résultats retourné par la procédure stockée est utilisé par le générateur d’API de données.
  • Seules les procédures stockées dont les métadonnées pour le premier jeu de résultats décrit par sys.dm_exec_describe_first_result_set sont prises en charge.
  • Pour les points de terminaison REST et GraphQL : lorsqu’un paramètre de procédure stockée est spécifié à la fois dans le fichier de configuration et dans la chaîne de requête d’URL, le paramètre de la chaîne de requête URL est prioritaire.
  • Les entités sauvegardées par une procédure stockée ne disposent pas de toutes les fonctionnalités automatiquement fournies pour les entités sauvegardées par des tables, des collections ou des vues.
    • Les entités sauvegardées de procédure stockée ne prennent pas en charge la pagination, l’ordre ou le filtrage. De même, ces entités ne prennent pas en charge le retour d’éléments spécifiés par les valeurs de clé primaire.
    • Les règles d’autorisation au niveau du champ/paramètre ne sont pas prises en charge.

Prise en charge REST des procédures stockées

Le comportement du point de terminaison REST, pour l’entité sauvegardée de procédure stockée, peut être configuré pour prendre en charge un ou plusieurs verbes HTTP (GET, POST, PUT, PATCH, DELETE). La section REST de l’entité ressemble à l’exemple suivant :

"rest": {
  "methods": [ "GET", "POST" ]
}

Toutes les requêtes REST pour l’entité échouent avec méthode HTTP 405 non autorisée lorsqu’une méthode HTTP non répertoriée dans la configuration est utilisée. Par exemple, l’exécution d’une requête PUT échoue avec le code d’erreur 405. Si la section methods est exclue de la configuration REST de l’entité, la méthode par défaut POST est déduite. Pour désactiver le point de terminaison REST de cette entité, configurez "rest": false et toutes les requêtes REST sur l’entité de procédure stockée échouent avec HTTP 404 Introuvable.

Si la procédure stockée accepte des paramètres, les paramètres peuvent être transmis dans la chaîne de requête d’URL lors de l’appel du point de terminaison REST avec le verbe HTTP GET. Par exemple :

GET http://<dab-server>/api/GetCowrittenBooksByAuthor?author=isaac%20asimov

Les procédures stockées exécutées à l’aide d’autres verbes HTTP tels que POST, PUT, PATCH, DELETE nécessitent que les paramètres soient transmis en tant que JSON dans le corps de la requête. Par exemple :

POST http://<dab-server>/api/GetCowrittenBooksByAuthor
{
  "author": "isaac asimov"
}

Prise en charge de GraphQL pour les procédures stockées

L’exécution de procédure stockée dans GraphQL peut être configurée à l’aide de l’option graphql d’une entité stockée sauvegardée par une procédure stockée. La définition explicite de l’opération de l’entité vous permet de représenter une procédure stockée dans le schéma GraphQL d’une manière qui s’aligne sur le comportement de la procédure stockée.

Note

GraphQL nécessite'un élément Query soit présent dans le schéma. Si vous exposez uniquement des procédures stockées, veillez à avoir au moins l’une d’entre elles prenant en charge l’opération de query ; sinon, vous obtiendrez une erreur GraphQL comme The object type Query has to at least define one field in order to be valid.

La définition d’une valeur pour l’opération entraîne la création d’une opération de mutation.

Par exemple, l’utilisation de la valeur query pour l’option operation entraîne la résolution de la procédure stockée en tant que champ de requête dans le schéma GraphQL.

Utilisation de l’interface CLI :

dab add GetCowrittenBooksByAuthor --source dbo.stp_get_all_cowritten_books_by_author --source.type "stored-procedure" --source.params "searchType:s" --permissions "anonymous:execute" --rest.methods "GET" --graphql.operation "query"

Configuration du runtime :

"graphql": {
  "operation": "query"
}

Composants de schéma GraphQL : type et champ de requête :

type GetCowrittenBooksByAuthor {
  id: Int!
  title: String
}

Dans le schéma, les opérations de requête et de mutation pour les procédures stockées ont execute comme préfixe. Pour la procédure stockée précédente, le champ de nom de requête exact généré est executeGetCowrittenBooksByAuthor. Le type GraphQL généré est :

type Query {
  executeGetCowrittenBooksByAuthor(
    searchType: String = "S"
  ): [GetCowrittenBooksByAuthor!]!
}

Vous pouvez également définir operation sur mutation afin qu’un champ de mutation représente la procédure stockée dans le schéma GraphQL. La commande dab update peut être utilisée pour modifier la operation:

dab update GetCowrittenBooksByAuthor --graphql.operation "mutation"

Configuration du runtime :

"graphql": {
  "operation": "mutation"
}

Le schéma GraphQL généré est :

type Mutation {
  executeGetCowrittenBooksByAuthor(
    searchType: String = "S"
  ): [GetCowrittenBooksByAuthor!]!
}

Si la procédure stockée accepte des paramètres, ces paramètres peuvent être passés en tant que paramètre de la requête ou de la mutation. Par exemple :

query {
  executeGetCowrittenBooksByAuthor(author:"asimov")
   {
    id
    title
    pages
    year
  }
}