Batch requests

Batch multiple GraphQL queries or mutations in a single API request, with results returned after complete execution.

A GraphQL request is basically a JSON object that has the following form:

{
  "query" : "..."
  "variables" : {}
  "operationname" : "..."
}

The OperationName property is optional, but if present, it must match the operation name from the query. To exemplify, let’s consider the following request:

Query

query read_accounts($cid : Int,
                    $pagesize : Int){
  useCompany(no: $cid) {
    generalLedgerAccount(first: $pagesize) {
      totalCount
      pageInfo {
        hasNextPage
        hasPreviousPage
        startCursor
        endCursor
      }
      items {
        accountNo
        name
      }
    }
  }
}
Result

{
  "cid" : 987654321,
  "pagesize" : 10
}

This query is formatted as the following JSON content when dispatched to the GraphQL API:

{
  "query" : "query read_accounts($cid : Int,\n                    $pagesize : Int){\n    useCompany(no: $cid) {\n        generalLedgerAccount(first: $pagesize) {\n            totalCount\n            pageInfo {\n                hasNextPage\n                hasPreviousPage\n                startCursor\n                endCursor\n            }\n            items {\n                accountNo\n                name\n            }\n        }\n    }\n}",
  "variables": {"cid": 987654321, "pagesize" : 10},
}

Note

Notice that JSON does not support multiple line strings. Therefore, new lines must be escaped, and the entire query provided as a single line string.

The result you get back is also a JSON object, such as the following:

{
  "data": {
    "useCompany": {
      "generalLedgerAccount": {
        "totalCount": 412,
        "pageInfo": {
          "hasNextPage": true,
          "hasPreviousPage": false,
          "startCursor": "MA==",
          "endCursor": "MTA="
        },
        "items": [
          {
            "accountNo": 1200,
            "name": "Plant and machinery"
          },
          {
            "accountNo": 1209,
            "name": "Depreciation plant and machinery"
          },
          ...
        ]
      }
    }
  },
  "extensions": {
    "vbnxt-trace-id": "a2f3f1ad045d7bd2f62f833e136ff0b0"
  }
}

It is possible that a single request contains multiple parts. For instance, you can query orders, products, and customers in a single request. You can also create an order and its order lines in a single mutation. However, it’s not possible to mix queries and mutations inside the same request.

VBNXT GraphQL allows you to batch multiple queries inside a single API requests. That is possible by sending an array of JSON objects, as follows:

[
  {
    "query" : "..."
    "variables" : {}
    "operationname" : "..."
  },
  {
    "query" : "..."
    "variables" : {}
    "operationname" : "..."
  }
]

The result, is also an array of objects, one for each requested operation.

[
  <result for query 0>,
  <result for query 1>,
  ...
  <result for query n>
]

An example with two requests (a query and a mutation) batched together is shown below:

[
  {
    "query" : "query read($cid : Int, $pagesize : Int){\n    useCompany(no: $cid) {\n        generalLedgerAccount(first: $pagesize) {\n            totalCount\n            pageInfo {\n                hasNextPage\n                hasPreviousPage\n                startCursor\n                endCursor\n            }\n            items {\n                accountNo\n                name\n            }\n        }\n    }\n}",
    "variables": {"cid": 987654321, "pagesize" : 10},
    "operationname" : "read"
  },
  {
    "query" : "mutation update_gla($cid : Int!, $no : Int!, $name : String!)\n{\n    useCompany(no: $cid) \n    {\n        generalLedgerAccount_update(\n          filter : {accountNo : {_eq: $no}},\n          value : {shortName : $name})\n        {\n          affectedRows\n          items {\n            accountNo\n            name\n            shortName\n          }\n      }\n    }\n}",
    "variables": {"cid": 987654321, "no" : 9999, "name": "test"},
    "operationname" : "update_gla"
  }
]
[
  {
    "data": {
      "useCompany": {
        "generalLedgerAccount": {
          "totalCount": 117,
          "pageInfo": {
            "hasNextPage": true,
            "hasPreviousPage": false,
            "startCursor": "MA==",
            "endCursor": "MTA="
          },
          "items": [
            {
              "accountNo": 1200,
              "name": "Plant and machinery"
            },
            {
              "accountNo": 1209,
              "name": "Depreciation plant and machinery"
            },
            {
              "accountNo": 1210,
              "name": "Buildings"
            },
            {
              "accountNo": 1211,
              "name": "Land"
            },
            {
              "accountNo": 1219,
              "name": "Depreciation, Buildings"
            },
            {
              "accountNo": 1220,
              "name": "Office Equipment"
            },
            {
              "accountNo": 1229,
              "name": "Depreciation, Office Equipment"
            },
            {
              "accountNo": 1240,
              "name": "Motor vehicles"
            },
            {
              "accountNo": 1249,
              "name": "Depreciation motor vehicles"
            },
            {
              "accountNo": 1300,
              "name": "Goodwill"
            }
          ]
        }
      }
    }
  },
  {
    "data": {
      "useCompany": {
        "generalLedgerAccount_update": {
          "affectedRows": 1,
          "items": [
            {
              "accountNo": 9999,
              "name": "SUSPENSE ACCOUNT",
              "shortName": "test"
            }
          ]
        }
      }
    }
  }
]

It is possible to batch both queries and mutations together in any order. They are executed individually, one by one, in the order they where provided.

When batching multiple request, the results will only be returned after all the requests have been executed. A large number of requests could make the overall operation exceed the HTTP timeout interval. In this case, the operation will timeout and the result will be lost.

Note

There is currently a limit of the number of requests that can be batched together. This limit is set to 32 requests.

This limit may be subject to future changes.

Tip

Use batching requests judiciously, making sure their overall execution time will not trigger an operation timeout!

Last modified September 24, 2024