Skip to content

GraphQL - JQuery Integration

GraphQL - Basic Client Integration (Fetch/jQuery)

Section titled “GraphQL - Basic Client Integration (Fetch/jQuery)”

While dedicated GraphQL client libraries like Apollo Client offer many advantages (caching, UI integration), it’s important to understand that you can interact with any GraphQL API using standard HTTP requests. This is useful for simple clients, scripts, server-to-server communication, or when using frameworks without dedicated GraphQL libraries (like older jQuery applications).

The core principle is sending an HTTP POST request to the GraphQL endpoint with the query in the request body.

A standard GraphQL HTTP request typically involves:

  • URL: The single endpoint provided by the GraphQL server (e.g., http://yourserver.com/graphql).
  • Method: POST (while GET can sometimes be used for queries, POST is standard for queries and required for mutations).
  • Headers:
    • Content-Type: application/json: Indicates the request body format.
    • Accept: application/json: (Optional but good practice) Indicates the client expects a JSON response.
    • Authorization: Bearer <token>: (If authentication is required) Passes the auth token.
  • Body: A JSON object containing:
{
"query": "... your GraphQL query string ...",
"variables": { ... optional variables object ... },
"operationName": "... optional operation name ..."
}
    • query: (Required) The GraphQL query or mutation string.
    • variables: (Optional) An object containing values for variables defined in your query string.
    • operationName: (Optional) Specifies which operation to execute if the query string contains multiple named operations.

Let’s create a simple HTML page using jQuery’s $.ajax() method to interact with a GraphQL server. This demonstrates the fundamental HTTP interaction.

Ensure you have a running GraphQL server. You can reuse the server from previous examples (like the ‘Basic Server Example’ or ‘React Integration’ chapters). For this example, let’s assume the server is running at http://localhost:9000/graphql and supports the following schema:

# Server Schema (Example)
type Query {
greeting: String
sayHello(name: String!): String
}

Create an HTML file (e.g., jquery-client.html) in a new folder or anywhere accessible by your browser.

<!DOCTYPE html>
<html>
<head>
<title>jQuery GraphQL Client</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<style>
body { font-family: sans-serif; }
section { margin-bottom: 20px; padding: 15px; border: 1px solid #ccc; }
#greetingResult, #sayHelloResult { margin-top: 10px; font-weight: bold; min-height: 20px; }
.error { color: red; }
.loading { color: blue; }
</style>
</head>
<body>
<h1>Simple jQuery GraphQL Client</h1>
<section>
<h2>Get Greeting</h2>
<button id="btnGreet">Fetch Greeting</button>
<div id="greetingResult"></div>
</section>
<hr/>
<section>
<h2>Say Hello</h2>
<label for="txtName">Enter Name:</label>
<input type="text" id="txtName" value="jQuery User"/>
<button id="btnSayHello">Say Hello</button>
<div id="sayHelloResult"></div>
</section>
<script>
$(document).ready(function() {
const GRAPHQL_ENDPOINT = 'http://localhost:9000/graphql';
// --- Helper function for making GraphQL requests ---
function makeGraphQLRequest(query, variables, resultElementId) {
const resultDiv = $('#' + resultElementId);
resultDiv.html('Loading...').removeClass('error').addClass('loading');
$.ajax({
url: GRAPHQL_ENDPOINT,
method: 'POST',
contentType: 'application/json',
headers: {
'Accept': 'application/json'
// Add Authorization header here if needed:
// 'Authorization': 'Bearer YOUR_TOKEN'
},
data: JSON.stringify({
query: query,
variables: variables || null // Send null if no variables
}),
success: function(response) {
resultDiv.removeClass('loading');
if (response.errors) {
console.error('GraphQL Errors:', response.errors);
resultDiv.html('Error: ' + response.errors[0].message).addClass('error');
} else if (response.data) {
console.log('GraphQL Data:', response.data);
// Display data (adjust based on your query structure)
if (resultElementId === 'greetingResult' && response.data.greeting) {
resultDiv.html('Server says: ' + response.data.greeting);
} else if (resultElementId === 'sayHelloResult' && response.data.sayHello) {
resultDiv.html('Server says: ' + response.data.sayHello);
} else {
resultDiv.html(JSON.stringify(response.data)); // Fallback display
}
} else {
resultDiv.html('Unexpected response format.').addClass('error');
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('AJAX Error:', textStatus, errorThrown, jqXHR.responseText);
resultDiv.removeClass('loading');
resultDiv.html('AJAX Error: ' + textStatus).addClass('error');
}
});
}
// --- Button Click Handlers ---
// Greet Button
$('#btnGreet').click(function() {
const greetingQuery = `
query GetGreeting {
greeting
}
`;
makeGraphQLRequest(greetingQuery, null, 'greetingResult');
});
// Say Hello Button
$('#btnSayHello').click(function() {
const name = $('#txtName').val();
if (!name) {
$('#sayHelloResult').html('Please enter a name.').addClass('error');
return;
}
const sayHelloQuery = `
query SayHello($name: String!) {
sayHello(name: $name)
}
`;
const variables = { name: name };
makeGraphQLRequest(sayHelloQuery, variables, 'sayHelloResult');
});
});
</script>
</body>
</html>
  • Include jQuery: We link to the jQuery library from a CDN.
  • HTML Structure: Basic buttons and divs to trigger requests and display results.
  • GRAPHQL_ENDPOINT: Stores the URL of your server.
  • makeGraphQLRequest Function:
    • Takes the query string, optional variables object, and the ID of the HTML element to display results in.
    • Sets loading state.
    • Uses $.ajax() configured for a POST request.
    • Sets contentType and Accept headers to application/json.
    • Crucially, sets the data option to a stringified JSON object containing the query and variables.
    • Handles success and error callbacks.
    • In success, it checks for response.errors (GraphQL errors) and response.data (successful result).
    • Updates the target div with the result or error message.
  • Button Handlers:
    • Define the GraphQL query strings (using template literals for readability).
    • For sayHello, create a variables object matching the query variable ($name).
    • Call makeGraphQLRequest with the appropriate query, variables, and result div ID.
  1. Make sure your GraphQL server is running (npm start or npm run dev in the server project folder).

  2. Open the jquery-client.html file directly in your web browser (File > Open File, or double-click).

  3. Click the ‘Fetch Greeting’ and ‘Say Hello’ buttons. You should see the results fetched from your GraphQL server displayed on the page. Check the browser’s developer console (F12) for detailed logs.

You can achieve the same result without jQuery using the browser’s native fetch API, which is standard in modern browsers:

async function fetchGraphQL(query, variables) {
const GRAPHQL_ENDPOINT = 'http://localhost:9000/graphql';
try {
const response = await fetch(GRAPHQL_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
// 'Authorization': 'Bearer YOUR_TOKEN' // If needed
},
body: JSON.stringify({
query: query,
variables: variables || null
})
});
if (!response.ok) {
// Handle HTTP errors (e.g., 4xx, 5xx)
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json(); // Parse JSON response
return data; // Contains either { data: ... } or { errors: [...] }
} catch (error) {
console.error("Error fetching GraphQL:", error);
// Return an object indicating error for consistent handling
return { errors: [{ message: error.message || 'Network request failed' }] };
}
}
// Example Usage:
document.getElementById('btnGreet').addEventListener('click', async () => {
const resultDiv = document.getElementById('greetingResult');
resultDiv.textContent = 'Loading...';
resultDiv.classList.remove('error');
resultDiv.classList.add('loading');
const greetingQuery = '{ greeting }';
const response = await fetchGraphQL(greetingQuery);
resultDiv.classList.remove('loading');
if (response.errors) {
resultDiv.textContent = 'Error: ' + response.errors[0].message;
resultDiv.classList.add('error');
} else if (response.data) {
resultDiv.textContent = 'Server says: ' + response.data.greeting;
}
});
// Add similar listener for sayHello button...

This fetch example mirrors the $.ajax logic but uses modern async/await syntax and standard browser APIs.

Interacting with GraphQL over HTTP boils down to sending a POST request with a specific JSON payload containing your query and variables. While client libraries automate this, understanding the underlying mechanism is valuable.