Interrogation de ressources Azure Cosmos DB à l’aide de l’API REST
Azure Cosmos DB est une base de données multimodèle distribuée à l’échelle mondiale avec prise en charge de plusieurs API. Cet article explique comment utiliser REST pour interroger des ressources à l’aide de l’API SQL.
Comment interroger une ressource à l'aide de REST ?
Pour exécuter une requête SQL sur une ressource, procédez comme suit :
- Exécutez une
POST
méthode sur un chemin d’accès de ressource à l’aide de JSON avec laquery
propriété définie sur la chaîne de requête SQL et la propriété « parameters » définie sur le tableau de valeurs de paramètre facultatives. - Attribuez à l’en-tête
x-ms-documentdb-isquery
la valeurTrue
. - Attribuez à l’en-tête
Content-Type
la valeurapplication/query+json
.
Pour obtenir un exemple montrant comment effectuer une requête SQL sur une ressource à l’aide de .NET, consultez EXEMPLE REST à partir de .NET.
Exemple
Vous trouverez ci-dessous un exemple d'opération de requête REST sur des ressources de document. Dans cet exemple, nous souhaitons rechercher tous les documents dont « Don » est l'auteur.
POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1
x-ms-documentdb-isquery: True
x-ms-date: Mon, 18 Apr 2015 13:05:49 GMT
authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3d
x-ms-version: 2015-12-16
x-ms-query-enable-crosspartition: True
Accept: application/json
Content-Type: application/query+json
Host: contosomarketing.documents.azure.com
Content-Length: 50
{
"query": "SELECT * FROM root WHERE (root.Author.id = 'Don')",
"parameters": []
}
Détails de la demande
Méthode | URI de demande |
---|---|
POST | Requis. Type d'authentification et jeton de signature. Seul le jeton de clé principale est autorisé pour cette opération. Pour plus d’informations, consultez Access Control sur les ressources Cosmos DB. |
En-têtes de requête
Le tableau suivant contient les en-têtes courants utilisés pour effectuer des opérations de requête.
En-tête standard | Description |
---|---|
Autorisation | Requis. Type d'authentification et jeton de signature. Seul le jeton de clé principale est autorisé pour cette opération. Pour plus d’informations, consultez Access Control sur les ressources Cosmos DB. |
Content-Type | Requis. Doit être défini sur application/query+json. |
Accepter | Facultatif. Pour le moment, Cosmos DB retourne toujours la charge utile de réponse au format JSON standard. Le client doit pouvoir accepter le corps de la réponse au format JSON standard. |
User-Agent | Facultatif. Agent utilisateur effectuant la demande. Le format recommandé est {nom de l'agent utilisateur}/{version}. Par exemple, le Kit de développement logiciel (SDK) .NET de l’API SQL définit la chaîne User-Agent sur Microsoft.Document.Client/1.0.0.0. |
En-tête personnalisé | Description |
---|---|
x-ms-date | Requis. Date de la demande, comme spécifié dans RFC 1123. Le format de date est exprimé en temps universel coordonné (UTC), par exemple. Vendredi 08 avril 2015 03:52:31 GMT. |
x-ms-documentdb-isquery | Requis. Cette propriété doit être définie sur true. |
x-ms-max-item-count | Facultatif. Pour parcourir un jeu de résultats, définissez cet en-tête sur le nombre maximal d'éléments à renvoyer dans une seule page. |
x-ms-continuation | Facultatif. Pour accéder à la page suivante d'éléments, définissez cet en-tête sur le jeton de liaison de la page suivante. |
x-ms-version | Facultatif. Version du service REST Cosmos DB. La dernière version est utilisée quand l'en-tête n'est pas fourni. Pour plus d’informations, consultez Informations de référence sur l’API REST Azure Cosmos DB. |
x-ms-documentdb-query-enable-scan | Facultatif. Utiliser une analyse d'index pour traiter la requête si le chemin d'accès d'index approprié du type n'est pas disponible. |
x-ms-session-token | Facultatif. Jeton de session pour la demande. Utilisé pour la cohérence de la session. |
x-ms-partition-key | Facultatif. Si elle est spécifiée, la requête est exécutée uniquement sur les documents qui correspondent à la valeur de clé de partition dans l’en-tête. |
x-ms-documentdb-query-enablecrosspartition | Facultatif. Doit avoir la valeur true pour toutes les requêtes qui ne filtrent pas sur une clé de partition unique. Les requêtes qui filtrent par rapport à une seule valeur de clé de partition sont exécutées sur une seule partition, même si cette valeur est définie sur true. |
x-ms-documentdb-populatequerymetrics |
Facultatif. Doit être défini sur True pour retourner des métriques de requête |
Corps de la requête
Le corps de la demande doit être un document JSON valide contenant la requête SQL et les paramètres. Si l'entrée est mal formée ou si la syntaxe SQL est incorrecte, l'opération échoue en renvoyant une erreur 400 Demande incorrecte.
Vous obtiendrez également une requête incorrecte 400 si une requête ne peut pas être traitée par la passerelle.
Propriété | Description |
---|---|
query | Requis. Chaîne de requête SQL de la requête. Pour plus d’informations, consultez Informations de référence sur la syntaxe SQL Azure Cosmos DB. |
parameters | Requis. Tableau JSON de paramètres, spécifié sous la forme de paires nom-valeur. Le tableau de paramètres peut contenir de zéro à plusieurs paramètres. Chaque paramètre doit avoir les valeurs suivantes :name : le nom du paramètre. Les noms de paramètres doivent être des littéraux de chaîne valides et commencer par « @ ». value : valeur du paramètre. Peut être toute valeur JSON valide (string, number, object, array, Boolean ou null). |
Exemple de demande
L’exemple suivant crée une requête SQL paramétrable avec un paramètre de chaîne pour @author.
POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1
x-ms-documentdb-isquery: True
x-ms-date: Mon, 18 Apr 2015 13:05:49 GMT
authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3d
x-ms-version: 2015-04-08
Accept: application/json
Content-Type: application/query+json
Host: contosomarketing.documents.azure.com
Content-Length: 50
{
"query": "SELECT * FROM root WHERE (root.Author.id = @author)",
"parameters":
[
{ "name": "@author", "value": "Leo Tolstoy"}
]
}
Pour plus d’informations sur les requêtes SQL, consultez Requêtes SQL pour Azure Cosmos DB.
Détails de la réponse
Voici les codes d'état courants renvoyés par cette opération. Pour plus d’informations sur les codes d’erreur status, consultez Codes d’état HTTP pour Azure Cosmos DB.
Code | Description |
---|---|
200 OK | L'opération a réussi. |
400 Demande incorrecte | La syntaxe de l'instruction SQL est incorrecte. |
401 Non autorisé | Soit l'en-tête Authorization, soit l'en-tête x-ms-date n'est pas défini. 401 est également renvoyé quand la valeur définie pour l'en-tête Autorization est un jeton d'autorisation non valide. |
403 Interdit | Le jeton d'autorisation a expiré. |
404 Introuvable | La collection n'est plus une ressource. Par exemple, la ressource a peut-être été supprimée. |
En-têtes de réponse
Cette opération renvoie les en-têtes courants suivants. Des en-têtes standard et courants supplémentaires peuvent être renvoyés.
En-tête standard | Description |
---|---|
Content-Type | La valeur Content-Type est application/json. Cosmos DB retourne toujours le corps de la réponse au format JSON standard. |
Date | Date/heure de l'opération de réponse. Ce format date/heure est conforme au format date/heure [RFC1123] exprimé en temps universel coordonné (UTC). |
En-tête personnalisé | Description |
---|---|
x-ms-item-count | Nombre d'éléments renvoyés par l'opération. |
x-ms-continuation | Il s’agit d’une chaîne opaque retournée lorsque la requête a potentiellement plus d’éléments à récupérer. L'en-tête x-ms-continuation peut être inclus dans des demandes suivantes, en tant qu'en-tête de demande pour reprendre l'exécution de la requête. |
x-ms-request-charge | Il s’agit du nombre d’unités de requête (RU) consommées par l’opération. Pour plus d’informations sur les unités de requête, consultez Unités de requête dans Azure Cosmos DB. |
x-ms-activity-id | Il s’agit d’un identificateur unique pour l’opération. Il peut être utilisé pour le suivi de l’exécution des requêtes Cosmos DB. |
x-ms-session-token | Jeton de session à utiliser pour les demandes suivantes. Utilisé pour la cohérence de la session. |
Corps de la réponse
Le corps de la réponse correspondant à l'opération de requête se compose de l'ID de ressource _rid de la ressource parent de la ressource en cours d'interrogation et du tableau des ressources contenant les propriétés de ressource pour la projection et la sélection. Selon l'exemple, si une requête a été effectuée sur le chemin d'accès docs de la collection avec un ID de ressource _rid XP0mAJ3H-AA=, la réponse se présente comme suit :
{"_rid":" XP0mAJ3H-AA=","Documents": [ …. …. ],"_count":10}
Propriété | Description |
---|---|
_rid | ID de ressource pour la collection utilisée dans la requête. |
_Compter | Nombre d'éléments renvoyés. |
Tableau de ressources | Tableau contenant les résultats de la requête. |
Génération du corps de la demande de requête
La demande de requête doit être un document JSON valide comprenant une propriété query contenant une chaîne de requête SQL valide, et une propriété parameters contenant un tableau de paramètres facultatifs. Chaque paramètre doit avoir des propriétés name et value spécifiées dans la requête. Les noms de paramètres doivent commencer par le caractère « @ ». Les valeurs peuvent être toute valeur JSON valide : chaîne, entier, valeur booléenne et valeur NULL.
Il est valide de spécifier uniquement un sous-ensemble de paramètres spécifiés dans le texte de la requête . Les expressions qui font référence à ces paramètres non spécifiés sont évaluées comme undefined. Il est également correct de spécifier des paramètres supplémentaires qui ne sont pas utilisés dans le texte de query.
Voici quelques exemples de demandes de requête valides. Par exemple, la requête suivante a un seul paramètre @id.
{
"query": "select * from docs d where d.id = @id",
"parameters": [
{"@id": "newdoc"}
]
}
L'exemple suivant comprend deux paramètres, l'un avec une valeur de chaîne et l'autre avec une valeur entière.
{
"query": "select * from docs d where d.id = @id and d.prop = @prop",
"parameters": [
{"@id": "newdoc"},
{"@prop": 5}
]
}
L'exemple suivant utilise des paramètres dans la clause SELECT, ainsi qu'une propriété accessible via le nom du paramètre en tant que paramètre.
{
"query": "select @id, d[@propName] from docs d",
"parameters": [
{"@id": "newdoc"},
{"@propName": "prop"}
]
}
Requêtes qui ne peuvent pas être traitées par la passerelle
Toute requête qui nécessite un état entre les continuations ne peut pas être traitée par la passerelle. notamment :
- Haut de la page
- ORDER BY
- OFFSET LIMIT
- Agrégats
- DISTINCT
- GROUP BY
Les requêtes qui peuvent être traitées par la passerelle sont les suivantes :
- Projections simples
- Filtres
Lorsqu’une réponse est retournée pour une requête qui ne peut pas être traitée par la passerelle, elle contient le code status 400 (BadRequest) et le message suivant :
{"code":"BadRequest","message":"The provided cross partition query can not be directly served by the gateway.
This is a first chance (internal) exception that all newer clients will know how to handle gracefully.
This exception is traced, but unless you see it bubble up as an exception (which only happens on older SDK clients),
then you can safely ignore this message.\r\nActivityId: db660ee4-350a-40e9-bc2c-99f92f2b445d, Microsoft.Azure.Documents.Common/2.2.0.0",
"additionalErrorInfo":"{\"partitionedQueryExecutionInfoVersion\":2,\"queryInfo\":{\"distinctType\":\"None\",\"top\":null,\"offset\":null,\"limit\":null,
\"orderBy\":[\"Ascending\"],\"orderByExpressions\":[\"c._ts\"],\"aggregates\":[],
\"rewrittenQuery\":\"SELECT c._rid, [{\\\"item\\\": c._ts}] AS orderByItems,
c AS payload\\nFROM c\\nWHERE ({documentdb-formattableorderbyquery-filter})\\nORDER BY c._ts\"},
\"queryRanges\":[{\"min\":\"\",\"max\":\"FF\",\"isMinInclusive\":true,\"isMaxInclusive\":false}]}"}
Pagination des résultats de requête
Les demandes de requête prennent en charge la pagination via les en-têtes x-ms-max-item-count et x-ms-continuation request. L'en-tête x-ms-max-item-count spécifie le nombre maximal de valeurs qui peuvent être renvoyées par l'exécution de la requête. Ce nombre peut être compris entre 1 et 1 000 (inclus), et sa valeur par défaut est 100.
Les requêtes renvoient de zéro aux valeurs x-ms-max-item-count maximales spécifiées à partir des résultats de l'exécution. Le résultat de la requête inclut un en-tête x-ms-item-count qui spécifie le nombre réel de documents renvoyés par la requête. Si des résultats supplémentaires peuvent être récupérés à partir de la requête, la réponse inclut une valeur non vide pour l'en-tête x-ms-continuation.
Les clients peuvent extraire les pages de résultats suivantes en répercutant l'en-tête x-ms-continuation en tant qu'autre demande. Pour lire tous les résultats, les clients doivent répéter ce processus jusqu'à ce qu'un en-tête x-ms-continuation vide soit renvoyé.
Les exécutions de requêtes Cosmos DB sont sans état côté serveur et peuvent être reprises à tout moment à l’aide de l’en-tête x-ms-continuation . La valeur x-ms-continuation utilise le dernier ID de ressource de document traité (_rid) pour suivre la progression de l'exécution. Par conséquent, si des documents sont supprimés et réinscrits entre l’extraction des pages, les documents peuvent potentiellement être exclus de n’importe quel lot de requête. Toutefois, le comportement et le format de l'en-tête x-ms-continuation pourront changer dans une mise à jour future du service.