Azure / Azure/data-api-builder

Omit optional parameter in the variables field of a request when the parameter value is null

Ouverte
#1,871 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
C#
Étoiles
1.5k
Forks
370
Merge moyen
3 j 22 h
PR mergées (30 j)
9

Description

I posted this originally in _Discussions_ ~ _Ideas_. However, it now seems worthy to be promoted to an _Issue_. According to ChatGPT-4, the behavior of the server (at least as hosted by the DAB CLI -- I haven't tested it when deployed to Azure SWA) [is not compliant with the GraphQL spec.](https://github.com/Azure/data-api-builder/discussions/1867#discussioncomment-7509762). After having subsequently perused the Data API Builder's source code, I see that it uses ChilliCream's server libraries extensively. Therefore, also it seems like an issue that ChilliCream's StawberryClient null-parameter handling differs from the expectation of the server.

### Discussed in https://github.com/Azure/data-api-builder/discussions/1867

Originally posted by **CalvinQuark** November 7, 2023
There is a compatibility issue when using a ChilliCream StrawberryShake generated client to fetch data from an Azure Data API Builder CLI-generated GraphQL endpoint.

If a query is defined with an optional `$filter` parameter such as:

```gql
query Todos(
$filter: TodoFilterInput
) {
todos(
filter: $filter
) {
items {
Id
Title
DueOn
}
}
}
```

When a `null` value is passed to `filter` parameter via a ChilliCream StrawberryShake-generated client query's `.ExecuteAsync(filter: null)` method, the request does not include the `"filter": null` node in the `variables` section:

```json
{
"id": "ec304833fcb193a31fdd994a6c503e21",
"query": "query Todos($filter: TodoFilterInput) { todos(filter: $filter) { __typename items { __typename Id Title DueOn } } }",
"operationName": "Todos",
"variables": {}
}
```

Unfortunately, the Azure Data API Builder CLI's GraphQL endpoint responds to this request with:

```json
{
"errors": [
{
"message": "The variable with the name `filter` does not exist."
}
]
}
```

unless the `null`-valued `filter` variable is specifically included in the request payload. I.e., this works:

```json
{
"id": "ec304833fcb193a31fdd994a6c503e21",
"query": "query Todos($filter: TodoFilterInput) { todos(filter: $filter) { __typename items { __typename Id Title DueOn } } }",
"operationName": "Todos",
"variables": {
"filter": null
}
}
```

I haven't discovered a workaround for this issue either on the client side with StrawberryShake or on the server side with Azure Data API Builder. Is there a particular reason why it is necessary to include the unused null `filter` variable? If so, this seems unintuitive since the query parameter is declared as nullable `$filter: TodoFilterInput`. I.e., it's not suffixed with the required operator (`!`).

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par reproduire la requête contre le endpoint GraphQL de Azure Data API Builder CLI, en utilisant la variable optionnelle $filter et les deux payloads de variables présentés dans l’issue. Lisez la Discussion #1867 associée et inspectez l’intégration de la server-library ChilliCream qui y est mentionnée. C’est terminé lorsque la requête avec la variable nullable est traitée de manière cohérente sans l’erreur signalée de variable manquante.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp, graphql
Domaine
api, backend-api-design
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.