I am using the apollo-client
library to query data from my Graphql
server. Some of the queries are sent to the server every 5 seconds through apollo polling ability.
Is there a generic way to add a custom header to all requests that are sent by my polling client?
There are two ways to do that. One is quick and easy and will work for a specific query with some limitation, and the other is a general solution that is safer and can work for multiple queries.
Advantages
When you configure your query you can configure it using its options
field, that has a context
field. The value of context
will be processed by the network chain. The context
itself is not sent to the server, but if you add a headers
field to it, it will be used in the HTTP request.
Example:
const someQuery = graphql(gql`query { ... }`, {
options: {
context: {
headers: {
"x-custom-header": "pancakes" // this header will reach the server
}
},
// ... other options
}
})
With Apollo you can add an Apollo Link that will act as a middleware and add a custom header to the request based on the context
that was set by your query operation.
From the docs:
Apollo Client has a pluggable network interface layer, which can let you configure how queries are sent over HTTP
Read more about Apollo Link, the network link and Middleware concepts.
Advantages:
Setting the context
Same as the quick and easy solution, only this time we don't set the headers
directly:
{
options: {
context: {
canHazPancakes: true //this will not reach the server
}
}
}
Adding the middleware
Apollo has a specific middleware for setting the context apollo-link-context
(the same can be achieved with a more general middleware).
import {setContext} from 'apollo-link-context'
//...
const pancakesLink = setContext((operation, previousContext) => {
const { headers, canHazPancakes } = previousContext
if (!canHazPancakes) {
return previousContext
}
return {
...previousContext,
headers: {
...headers,
"x-with-pancakes": "yes" //your custom header
}
}
})
Don't forget to concat it to the network chain somewhere before your http link
const client = new ApolloClient({
// ...
link: ApolloLink.from([
pancakesLink,
<yourHttpLink>
])
})
There is another useful example in the docs: using a middleware for authentication.
That's it! You should get some pancakes from the server now. Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With