Setting HTTP Request Bodies

Set bodies in HTTP requests


Apollo Connectors support POST, PUT, PATCH, and DELETE requests, including request bodies. The http.body field defines a JSON body to send with requests using the mapping language.

Example request bodies

Basic http.body example

This example uses the id and quantity fields from the input argument to create the following JSON body.

GraphQL
type Mutation {
  addProduct(input: AddProductInput!): Product
    @connect(
      source: "ecomm"
      http: {
        POST: "/products/add"
        body: """
        $args.input {
          id
          quantity
        }
        """
      }
      selection: "id"
    )
}
JSON
{
  "id": 1,
  "quantity": 2
}

Example http.body with methods

This example updates a product country code using the slice method in the body.

GraphQL
type Mutation {
  updateProduct(id: ID!, countryName: String!): Product
    @connect(
      source: "ecomm"
      http: {
        PUT: "/products/{$args.id}"
        body: "countryCode: $args.countryName->slice(0, 2)"
      }
      selection: "id"
    )
}

Given a countryName of "FRANCE" the request body would look like this:

JSON
{
  "countryCode": "FR"
}

Example http.body with literal value

This example shows how to include literal values in your request body using the $() syntax.

GraphQL
type Mutation {
  deleteProduct(id: ID!): DeleteResult
    @connect(
      source: "ecomm"
      http: {
        DELETE: "/products/{$args.id}"
        body: """
        $({
          reason: "User requested deletion",
          permanentDelete: true,
        })
        """
      }
      selection: "success"
    )
}
JSON
{
  "reason": "User requested deletion",
  "permanentDelete": true,
}

Form URL encoding

By adding a Content-Type header of exactly application/x-www-form-urlencoded, GraphOS Router encodes the request body as a form URL encoded string.

GraphQL
Form URL encoding
1type Mutation {
2  createPost(input: CreatePostInput!): Post
3    @connect(
4      http: {
5        POST: "https://api.example.com/posts"
6        headers: [{ name: "Content-Type", value: "application/x-www-form-urlencoded" }],      
7        body: """
8        $args.input {
9          title
10          content
11        }
12        """
13      }
14    )
15  }

The router first maps the request body to a JSON object:

JSON
{
  "title": "Hello, world!",
  "content": "This is a post."
}

Then, it encodes the object as a x-www-form-urlencoded string:

plaintext
title=Hello%2C+world%21&content=This+is+a+post.

URL encoding details

Connectors follow these rules for URL encoding:

  • List values are indexed starting from 0 using the list[0]=value syntax.

  • Nested objects use the parent[child]=value syntax.

  • Spaces are encoded as +.

GraphQL
Example: form URL encoding
1type Mutation {
2  example(input: ExampleInput!): Example
3  @connect(
4    http: { POST: "/example", headers: [{ name: "content-type", value: "application/x-www-form-urlencoded" }] }
5    body: """
6      $args.input {
7        name
8        tags
9        addresses {
10          street
11          city
12          state
13          zip
14        }
15      }
16    """
17  )
18}
19
20input ExampleInput {
21  name: String!
22  tags: [String!]
23  addresses: [AddressInput!]
24}
25
26input AddressInput {
27  street: String!
28  city: String!
29  state: String!
30  zip: String!
31}
plaintext
Result (new lines added for readability)
1name=Example
2&tags[0]=tag1
3&tags[1]=tag2
4&addresses[0][street]=123+Main+St
5&addresses[0][city]=Anytown
6&addresses[0][state]=CA
7&addresses[0][zip]=12345
8&addresses[1][street]=456+Elm+St
9&addresses[1][city]=Othertown
10&addresses[1][state]=NY
11&addresses[1][zip]=54321
Feedback

Ask Community