Azure / Azure/data-api-builder
Omit optional parameter in the variables field of a request when the parameter value is null
- Lenguaje dominante
- C#
- Estrellas
- 1.5k
- Forks
- 370
- Merge medio
- 3 d 22 h
- PR fusionados (30 d)
- 9
Descripción
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 (`!`).
Guía de contribución
Línea de trabajo
Comienza reproduciendo la solicitud contra el endpoint GraphQL de Azure Data API Builder CLI, usando la variable opcional $filter y los dos payloads de variables mostrados en el issue. Lee la Discussion #1867 relacionada e inspecciona la integración de la server-library de ChilliCream mencionada allí. Se considera terminado cuando la solicitud con la variable nullable se gestiona de forma coherente sin el error reportado de variable faltante.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- csharp, graphql
- Área
- api, backend-api-design
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100