
REST APIs與微服務(wù):關(guān)鍵差異
GraphQL 用于查詢存儲(chǔ)在后端系統(tǒng)中的數(shù)據(jù),允許您通過(guò) HTTP API 獲取和操作數(shù)據(jù)。
本教程中的示例使用一個(gè)簡(jiǎn)單的 GraphQL API,該 API 提供來(lái)自員工數(shù)據(jù)庫(kù)的信息,其中包含每個(gè)員工的唯一 ID、他們的姓名、職稱、他們開(kāi)始在那里工作的日期,以及他們的年齡(可選)。以下是對(duì)此進(jìn)行建模的 GraphQL 架構(gòu):
type Employee {
ID: ID!
name: String!
jobTitle: String!
startDate: String!
age: Int
}
您可以將此架構(gòu)用作入門模板,并對(duì)其進(jìn)行修改以匹配您自己的數(shù)據(jù)。如果您想使用示例員工架構(gòu)來(lái)嘗試這些文章中的任何示例代碼,可以通過(guò)模擬 GraphQL API 來(lái)模擬它,GraphQL API 對(duì)于想要開(kāi)始處理前端查詢但尚未構(gòu)建后端的開(kāi)發(fā)人員來(lái)說(shuō),這是一個(gè)強(qiáng)大的工具。
如果您是 Contentful 用戶,學(xué)習(xí) GraphQL 會(huì)更加容易 — 您還可以使用我們的 GraphQL Playground 在瀏覽器中開(kāi)始學(xué)習(xí) GraphQL(無(wú)需模擬服務(wù)器或使用 cURL 進(jìn)行調(diào)試),并使用 GraphQL 查詢您的博客文章、產(chǎn)品以及您在 Contentful 可組合內(nèi)容平臺(tái)上創(chuàng)建的任何其他內(nèi)容。
獲得要使用 GraphQL 查詢的數(shù)據(jù)的架構(gòu)后,您就可以編寫查詢了。以下示例查詢?cè)谏厦娴氖纠軜?gòu)中搜索職務(wù)為“janitor”的員工:
query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}
現(xiàn)在,讓我們看看它在各種流行的編程語(yǔ)言和環(huán)境中的實(shí)際應(yīng)用。
首先,讓我們通過(guò) cURL 發(fā)出 GraphQL 請(qǐng)求。cURL 從終端運(yùn)行,是在使用特定編程語(yǔ)言實(shí)現(xiàn)查詢之前探索查詢的好方法,允許您在實(shí)現(xiàn)和調(diào)試響應(yīng)之前查看響應(yīng)應(yīng)該是什么樣子。
請(qǐng)注意,在此頁(yè)面上的所有代碼片段中,我們將使用 example.com 作為 API 端點(diǎn),因此您需要將其替換為實(shí)際端點(diǎn)。此頁(yè)面上的所有 HTTP API 請(qǐng)求都使用 HTTP POST 方法,因?yàn)樗鼈儗?GraphQL 查詢數(shù)據(jù)提交到后端。
以下是從命令行查詢 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 選項(xiàng)指定 POST 請(qǐng)求方法。-H 選項(xiàng)設(shè)置 Content-Type 標(biāo)頭(GraphQL API 以 JSON 格式發(fā)送其響應(yīng))以及 Authorization 標(biāo)頭(如果您的 API 需要授權(quán)令牌)。-d 選項(xiàng)設(shè)置將在 POST 請(qǐng)求中發(fā)送的數(shù)據(jù) — 在本例中為 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
}
]
}
}
響應(yīng)包括來(lái)自 API 的任何匹配記錄。如果發(fā)生錯(cuò)誤,將返回一個(gè) error 對(duì)象,其中包含所遇到問(wèn)題的詳細(xì)信息。
有幾種不同的方法可以在 Python 中進(jìn)行 HTTP 請(qǐng)求。我非常喜歡 requests 庫(kù),它使用起來(lái)非常簡(jiǎn)單 — 盡管與 urllib 不同,您必須安裝它。
下面是一個(gè)示例 Python 腳本,該腳本使用 requests 庫(kù)通過(guò) HTTP 進(jìn)行 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())
運(yùn)行后,將返回查詢的 JSON 輸出,就像使用 cURL 一樣。
無(wú)需安裝任何其他庫(kù)即可從 PHP 客戶端發(fā)出 GraphQL HTTP 請(qǐng)求。您可以使用內(nèi)置的 stream_context_create 函數(shù)完成請(qǐng)求,然后使用 file_get_contents 函數(shù)讀取響應(yīng)的內(nèi)容。
<?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 響應(yīng)字符串轉(zhuǎn)換為 PHP 對(duì)象,可以使用 json_decode 函數(shù)對(duì)其進(jìn)行解析:
$responseObj = json_decode($response);
print_r($responseObj);
在 JavaScript 中發(fā)出 GraphQL 請(qǐng)求的方式取決于您是從 Web 瀏覽器還是在 Node.js 環(huán)境中運(yùn)行代碼。
JavaScript 的 Fetch API 允許您使用簡(jiǎn)化的語(yǔ)法從 JavaScript 發(fā)出 HTTP 請(qǐng)求。下面的代碼使用 fetch 發(fā)送示例 GraphQL 查詢,并在收到響應(yīng)后將響應(yīng)打印到控制臺(tái):
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 沒(méi)有內(nèi)置 Fetch API,但您可以通過(guò)安裝 node-fetch 包來(lái)添加等效 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)));
請(qǐng)注意,上面的示例腳本需要保存到 .mjs 文件(例如,run_query.mjs),因?yàn)樽钚掳姹镜?node-fetch 需要作為 JavaScript 模塊導(dǎo)入。
使用 Ruby 發(fā)出 HTTP 請(qǐng)求可以在不安裝庫(kù)的情況下完成。以下示例中使用的 net/http、JSON 和 URI 模塊已內(nèi)置到 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 請(qǐng)求可能非常冗長(zhǎng);在 Java 11 之前的版本中,它需要手動(dòng)打開(kāi)連接并讀取和寫入數(shù)據(jù)。OkHttp 庫(kù)使用 Java 編寫 HTTP 請(qǐng)求變得更加簡(jiǎn)單。
下面的示例 GraphQL 查詢是使用 OkHttp 在 Java 中進(jìn)行的:
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 請(qǐng)求的工具,專為測(cè)試 API 而設(shè)計(jì)。許多開(kāi)發(fā)人員更喜歡它,因?yàn)樗试S他們編寫 HTTP 請(qǐng)求(包括 GraphQL 查詢),然后測(cè)試和調(diào)試它們,所有這些都通過(guò)一個(gè)簡(jiǎn)化、用戶友好的界面完成。
Postman 包含用于通過(guò) HTTP 發(fā)出 GraphQL 請(qǐng)求的特定 GraphQL 模式,允許您設(shè)置 HTTP 標(biāo)頭、編寫查詢、設(shè)置變量值以及導(dǎo)入 GraphQL 架構(gòu)。它甚至可以驗(yàn)證您的 GraphQL 查詢語(yǔ)法。
要在 Postman 中訪問(wèn) GraphQL 模式,請(qǐng)轉(zhuǎn)到 File > New 并選擇 GraphQL 請(qǐng)求類型:
然后,輸入 GraphQL 終端節(jié)點(diǎn)的 URL,并在 Query 框中輸入 GraphQL 查詢:
就是這樣!查詢結(jié)果將顯示在 Response body.Postman 允許您在不同的選項(xiàng)卡中測(cè)試不同的 API 和應(yīng)用程序,每個(gè)選項(xiàng)卡都有自己的標(biāo)頭和設(shè)置,并記錄每個(gè)請(qǐng)求的歷史記錄,從而使調(diào)試 GraphQL 查詢變得更加簡(jiǎn)單。
一旦你弄清楚了如何用你選擇的語(yǔ)言通過(guò) HTTP 請(qǐng)求進(jìn)行 GraphQL 查詢,你就會(huì)想用你的新技能來(lái)構(gòu)建一些很酷的東西。這就是 Contentful 發(fā)揮作用的地方!使用我們的可組合內(nèi)容平臺(tái),您可以定義博客文章、圖像、視頻和產(chǎn)品等內(nèi)容,然后通過(guò)我們的 GraphQL 內(nèi)容 API 檢索其所有數(shù)據(jù)。
通過(guò)在 Contentful 上構(gòu)建,您可以將您的內(nèi)容發(fā)布到您的所有應(yīng)用程序和網(wǎng)站,并讓它們都通過(guò) GraphQL 提取其內(nèi)容,無(wú)論您使用的是 PHP、JavaScript、Java、Ruby 還是任何其他編程語(yǔ)言或平臺(tái)。我們的無(wú)頭 CMS 允許您定義內(nèi)容及其外觀,包括應(yīng)用程序所需的字段和屬性,并創(chuàng)建、編輯和實(shí)時(shí)預(yù)覽您的內(nèi)容,正如用戶所看到的那樣。
如果您想查看將 GraphQL 與 Content 結(jié)合使用的完整示例,包括在查詢中使用 GraphQL 變量在 TypeScript 中提供類型安全性,請(qǐng)查看此內(nèi)容。
我們還提供完整的 GraphQL 課程,使開(kāi)發(fā)人員能夠盡可能輕松地開(kāi)始使用 GraphQL。了解如何開(kāi)始使用 GraphQL、React 和 Contentful,包括 GraphQL 工具、片段、指令、變量和查詢復(fù)雜性成本(等等)。
原文鏈接:https://www.contentful.com/blog/graphql-via-http-in-five-ways/
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)