
REST APIs與微服務:關鍵差異
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)境中的實際應用。
首先,讓我們通過 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 對象,其中包含所遇到問題的詳細信息。
有幾種不同的方法可以在 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 一樣。
無需安裝任何其他庫即可從 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);
在 JavaScript 中發(fā)出 GraphQL 請求的方式取決于您是從 Web 瀏覽器還是在 Node.js 環(huán)境中運行代碼。
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);
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 模塊導入。
使用 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))
在 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());
}
}
Postman 與 cURL 一樣,是一種用于發(fā)出 HTTP 請求的工具,專為測試 API 而設計。許多開發(fā)人員更喜歡它,因為它允許他們編寫 HTTP 請求(包括 GraphQL 查詢),然后測試和調試它們,所有這些都通過一個簡化、用戶友好的界面完成。
Postman 包含用于通過 HTTP 發(fā)出 GraphQL 請求的特定 GraphQL 模式,允許您設置 HTTP 標頭、編寫查詢、設置變量值以及導入 GraphQL 架構。它甚至可以驗證您的 GraphQL 查詢語法。
要在 Postman 中訪問 GraphQL 模式,請轉到 File > New 并選擇 GraphQL 請求類型:
然后,輸入 GraphQL 終端節(jié)點的 URL,并在 Query 框中輸入 GraphQL 查詢:
就是這樣!查詢結果將顯示在 Response body.Postman 允許您在不同的選項卡中測試不同的 API 和應用程序,每個選項卡都有自己的標頭和設置,并記錄每個請求的歷史記錄,從而使調試 GraphQL 查詢變得更加簡單。
一旦你弄清楚了如何用你選擇的語言通過 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/