如何編寫 GraphQL 查詢

GraphQL 用于查詢存儲在后端系統(tǒng)中的數(shù)據,允許您通過 HTTP API 獲取和操作數(shù)據。

本教程中的示例使用一個簡單的 GraphQL API,該 API 提供來自員工數(shù)據庫的信息,其中包含每個員工的唯一 ID、他們的姓名、職稱、他們開始在那里工作的日期,以及他們的年齡(可選)。以下是對此進行建模的 GraphQL 架構:

type Employee {
ID: ID!
name: String!
jobTitle: String!
startDate: String!
age: Int
}

您可以將此架構用作入門模板,并對其進行修改以匹配您自己的數(shù)據。如果您想使用示例員工架構來嘗試這些文章中的任何示例代碼,可以通過模擬 GraphQL API 來模擬它,GraphQL API 對于想要開始處理前端查詢但尚未構建后端的開發(fā)人員來說,這是一個強大的工具。

如果您是 Contentful 用戶,學習 GraphQL 會更加容易 — 您還可以使用我們的 GraphQL Playground 在瀏覽器中開始學習 GraphQL(無需模擬服務器或使用 cURL 進行調試),并使用 GraphQL 查詢您的博客文章、產品以及您在 Contentful 可組合內容平臺上創(chuàng)建的任何其他內容。

獲得要使用 GraphQL 查詢的數(shù)據的架構后,您就可以編寫查詢了。以下示例查詢在上面的示例架構中搜索職務為“janitor”的員工:

query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}

現(xiàn)在,讓我們看看它在各種流行的編程語言和環(huán)境中的實際應用。

1. 如何使用 cURL/bash 進行 GraphQL 查詢

首先,讓我們通過 cURL 發(fā)出 GraphQL 請求。cURL 從終端運行,是在使用特定編程語言實現(xiàn)查詢之前探索查詢的好方法,允許您在實現(xiàn)和調試響應之前查看響應應該是什么樣子。

請注意,在此頁面上的所有代碼片段中,我們將使用 example.com 作為 API 端點,因此您需要將其替換為實際端點。此頁面上的所有 HTTP API 請求都使用 HTTP POST 方法,因為它們將 GraphQL 查詢數(shù)據提交到后端。

以下是從命令行查詢 HTTP GraphQL API 的 cURL 命令的完整示例:

curl -X POST https://example.com/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"query": "query { employees(jobTitle: \"janitor\") { ID name jobTitle startDate age } }"
}'

在上面的命令中,-X 選項指定 POST 請求方法。-H 選項設置 Content-Type 標頭(GraphQL API 以 JSON 格式發(fā)送其響應)以及 Authorization 標頭(如果您的 API 需要授權令牌)。-d 選項設置將在 POST 請求中發(fā)送的數(shù)據 — 在本例中為 GraphQL 看門人搜索查詢。

上述示例 cURL 命令的輸出如下所示:

{
"data": {
"employees": [
{
"ID": "1",
"name": "Joe Simpson",
"jobTitle": "janitor",
"startDate": "2021-01-01",
"age": 40
},
{
"ID": "2",
"name": "Jane Smith",
"jobTitle": "janitor",
"startDate": "2017-05-15",
"age": 37
}
]
}
}

響應包括來自 API 的任何匹配記錄。如果發(fā)生錯誤,將返回一個 error 對象,其中包含所遇到問題的詳細信息。

2. 如何使用 Python 發(fā)送 GraphQL 請求

如何使用 Python 發(fā)送 GraphQL 請求

有幾種不同的方法可以在 Python 中進行 HTTP 請求。我非常喜歡 requests 庫,它使用起來非常簡單 — 盡管與 urllib 不同,您必須安裝它。

下面是一個示例 Python 腳本,該腳本使用 requests 庫通過 HTTP 進行 GraphQL 查詢:

import requests

url = 'https://example.com/graphql'
query = """
query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}
"""

headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}

response = requests.post(url, json={'query': query}, headers=headers)

# Print the JSON response
print(response.json())

運行后,將返回查詢的 JSON 輸出,就像使用 cURL 一樣。

3. 從 PHP 客戶端發(fā)出 GraphQL HTTP 請求

從 PHP 客戶端發(fā)出 GraphQL HTTP 請求

無需安裝任何其他庫即可從 PHP 客戶端發(fā)出 GraphQL HTTP 請求。您可以使用內置的 stream_context_create 函數(shù)完成請求,然后使用 file_get_contents 函數(shù)讀取響應的內容。

<?php

$url = 'https://example.com/graphql';
$query = 'query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}';

$data = array('query' => $query);
$options = [
'http' => [
'method' => 'POST',
'header' => [
"Content-Type: application/json",
"Authorization: Bearer YOUR_ACCESS_TOKEN"
],
'content' => json_encode($data),
],
];

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

echo $response;

如果您希望將 JSON 響應字符串轉換為 PHP 對象,可以使用 json_decode 函數(shù)對其進行解析:

$responseObj = json_decode($response);
print_r($responseObj);

4. 來自 JavaScript 和 Node.js 的 GraphQL

來自 JavaScript 和 Node.js 的 GraphQL

在 JavaScript 中發(fā)出 GraphQL 請求的方式取決于您是從 Web 瀏覽器還是在 Node.js 環(huán)境中運行代碼。

JavaScript (瀏覽器)

JavaScript 的 Fetch API 允許您使用簡化的語法從 JavaScript 發(fā)出 HTTP 請求。下面的代碼使用 fetch 發(fā)送示例 GraphQL 查詢,并在收到響應后將響應打印到控制臺:

const url = 'https://example.com/graphql';
const query = `
query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}`;

const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
},
body: JSON.stringify({ query })
});

const responseData = await response.json();
console.log(responseData);

JavaScript (Node.js)

Node.js 沒有內置 Fetch API,但您可以通過安裝 node-fetch 包來添加等效 API。雖然與在瀏覽器中使用 fetch 有一些不同,但在大多數(shù)情況下它們是相同的:

const fetch = require('node-fetch');

const url = 'https://example.com/graphql';
const query = `
query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}`;

fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
},
body: JSON.stringify({ query })
}).then(response => response.json().then(data => console.log(data)));

請注意,上面的示例腳本需要保存到 .mjs 文件(例如,run_query.mjs),因為最新版本的 node-fetch 需要作為 JavaScript 模塊導入。

5. 在 Ruby 中發(fā)出 GraphQL HTTP 請求

在 Ruby 中發(fā)出 GraphQL HTTP 請求

使用 Ruby 發(fā)出 HTTP 請求可以在不安裝庫的情況下完成。以下示例中使用的 net/http、JSON 和 URI 模塊已內置到 Ruby 中:

require 'net/http'
require 'json'
require 'uri'

url = URI('https://example.com/graphql')
query = {
"query" => "query { employees(jobTitle: \"janitor\") { ID name jobTitle startDate age } }"
}.to_json

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true if url.scheme == 'https'
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer YOUR_ACCESS_TOKEN"
request.body = query

response = http.request(request)

puts(JSON.parse(response.body))

6. Java 中的 GraphQL 請求

Java 中的 GraphQL 請求

在 Java 中發(fā)出 HTTP 請求可能非常冗長;在 Java 11 之前的版本中,它需要手動打開連接并讀取和寫入數(shù)據。OkHttp 庫使用 Java 編寫 HTTP 請求變得更加簡單。

下面的示例 GraphQL 查詢是使用 OkHttp 在 Java 中進行的:

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class GraphQLRequest {

public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();

String url = "https://example.com/graphql";
MediaType mediaType = MediaType.get("application/json; charset=utf-8");

String query = """
{
"query": "query { \
employees(jobTitle: \\"janitor\\") { \
ID \
name \
jobTitle \
startDate \
age \
} \
} "
}
""";

RequestBody body = RequestBody.create(query, mediaType);
Request request = new Request.Builder()
.url(url)
.post(body)
.addHeader("Authorization", "Bearer YOUR_ACCESS_TOKEN")
.build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}

7. 使用 Postman 測試 GraphQL 請求

使用 Postman 測試 GraphQL 請求

Postman 與 cURL 一樣,是一種用于發(fā)出 HTTP 請求的工具,專為測試 API 而設計。許多開發(fā)人員更喜歡它,因為它允許他們編寫 HTTP 請求(包括 GraphQL 查詢),然后測試和調試它們,所有這些都通過一個簡化、用戶友好的界面完成。

Postman 包含用于通過 HTTP 發(fā)出 GraphQL 請求的特定 GraphQL 模式,允許您設置 HTTP 標頭、編寫查詢、設置變量值以及導入 GraphQL 架構。它甚至可以驗證您的 GraphQL 查詢語法。

要在 Postman 中訪問 GraphQL 模式,請轉到 File New 并選擇 GraphQL 請求類型:

在 Postman 中訪問 GraphQL 模式

然后,輸入 GraphQL 終端節(jié)點的 URL,并在 Query 框中輸入 GraphQL 查詢:

在 Query 框中輸入您的 GraphQL 查詢

就是這樣!查詢結果將顯示在 Response body.Postman 允許您在不同的選項卡中測試不同的 API 和應用程序,每個選項卡都有自己的標頭和設置,并記錄每個請求的歷史記錄,從而使調試 GraphQL 查詢變得更加簡單。

將 GraphQL 與 Contentful 結合使用

一旦你弄清楚了如何用你選擇的語言通過 HTTP 請求進行 GraphQL 查詢,你就會想用你的新技能來構建一些很酷的東西。這就是 Contentful 發(fā)揮作用的地方!使用我們的可組合內容平臺,您可以定義博客文章、圖像、視頻和產品等內容,然后通過我們的 GraphQL 內容 API 檢索其所有數(shù)據。

通過在 Contentful 上構建,您可以將您的內容發(fā)布到您的所有應用程序和網站,并讓它們都通過 GraphQL 提取其內容,無論您使用的是 PHP、JavaScript、Java、Ruby 還是任何其他編程語言或平臺。我們的無頭 CMS 允許您定義內容及其外觀,包括應用程序所需的字段和屬性,并創(chuàng)建、編輯和實時預覽您的內容,正如用戶所看到的那樣。

如果您想查看將 GraphQL 與 Content 結合使用的完整示例,包括在查詢中使用 GraphQL 變量在 TypeScript 中提供類型安全性,請查看此內容。

我們還提供完整的 GraphQL 課程,使開發(fā)人員能夠盡可能輕松地開始使用 GraphQL。了解如何開始使用 GraphQL、React 和 Contentful,包括 GraphQL 工具、片段、指令、變量和查詢復雜性成本(等等)。

原文鏈接:https://www.contentful.com/blog/graphql-via-http-in-five-ways/

上一篇:

TypeScript CSRF保護指南:示例及如何啟用

下一篇:

React XML外部實體指南:示例及預防
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數(shù)據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費