REST APIs与微服务:关键差异
REST api GraphQL有7种方式:cURL、Python、PHP、JS、Ruby、Java、Postman
GraphQL 是一个强大的工具,用于构建查询以获取博客文章、产品以及其他来自第三方服务和你自己后端 API 的数据和内容。
您可以直接通过 HTTP 通过 GraphQL 访问数据,无需库或 SDK,因此在跨平台应用程序中很受欢迎。
在本文中,我们将向您展示如何编写示例 GraphQL 查询,并使用它通过 cURL、Python、PHP、JavaScript、Ruby、Java 和 Postman 中的 HTTP 请求获取数据。
如何编写 GraphQL 查询
GraphQL 用于查询存储在后端系统中的数据,允许您通过 HTTP API 获取和操作数据。
本教程中的示例使用一个简单的 GraphQL API,该 API 提供来自员工数据库的信息,其中包含每个员工的唯一 ID、他们的姓名、职称、他们开始在那里工作的日期,以及他们的年龄(可选)。以下是对此进行建模的 GraphQL 架构:
type Employee {
ID: ID!
name: String!
jobTitle: String!
startDate: String!
age: Int
}
您可以将此架构用作入门模板,并对其进行修改以匹配您自己的数据。如果您想使用示例员工架构来尝试这些文章中的任何示例代码,可以通过模拟 GraphQL API 来模拟它,GraphQL API 对于想要开始处理前端查询但尚未构建后端的开发人员来说,这是一个强大的工具。
如果您是 Contentful 用户,学习 GraphQL 会更加容易 — 您还可以使用我们的 GraphQL Playground 在浏览器中开始学习 GraphQL(无需模拟服务器或使用 cURL 进行调试),并使用 GraphQL 查询您的博客文章、产品以及您在 Contentful 可组合内容平台上创建的任何其他内容。
获得要使用 GraphQL 查询的数据的架构后,您就可以编写查询了。以下示例查询在上面的示例架构中搜索职务为“janitor”的员工:
query {
employees(jobTitle: "janitor") {
ID
name
jobTitle
startDate
age
}
}
现在,让我们看看它在各种流行的编程语言和环境中的实际应用。
1. 如何使用 cURL/bash 进行 GraphQL 查询
首先,让我们通过 cURL 发出 GraphQL 请求。cURL 从终端运行,是在使用特定编程语言实现查询之前探索查询的好方法,允许您在实现和调试响应之前查看响应应该是什么样子。
请注意,在此页面上的所有代码片段中,我们将使用 example.com 作为 API 端点,因此您需要将其替换为实际端点。此页面上的所有 HTTP API 请求都使用 HTTP POST 方法,因为它们将 GraphQL 查询数据提交到后端。
以下是从命令行查询 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 格式发送其响应)以及 Authorization 标头(如果您的 API 需要授权令牌)。-d 选项设置将在 POST 请求中发送的数据 — 在本例中为 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 的任何匹配记录。如果发生错误,将返回一个 error 对象,其中包含所遇到问题的详细信息。
2. 如何使用 Python 发送 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 客户端发出 GraphQL HTTP 请求
无需安装任何其他库即可从 PHP 客户端发出 GraphQL HTTP 请求。您可以使用内置的 stream_context_create 函数完成请求,然后使用 file_get_contents 函数读取响应的内容。
<?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 函数对其进行解析:
$responseObj = json_decode($response);
print_r($responseObj);
4. 来自 JavaScript 和 Node.js 的 GraphQL
在 JavaScript 中发出 GraphQL 请求的方式取决于您是从 Web 浏览器还是在 Node.js 环境中运行代码。
JavaScript (浏览器)
JavaScript 的 Fetch API 允许您使用简化的语法从 JavaScript 发出 HTTP 请求。下面的代码使用 fetch 发送示例 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 有一些不同,但在大多数情况下它们是相同的:
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 中发出 GraphQL HTTP 请求
使用 Ruby 发出 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 中发出 HTTP 请求可能非常冗长;在 Java 11 之前的版本中,它需要手动打开连接并读取和写入数据。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 与 cURL 一样,是一种用于发出 HTTP 请求的工具,专为测试 API 而设计。许多开发人员更喜欢它,因为它允许他们编写 HTTP 请求(包括 GraphQL 查询),然后测试和调试它们,所有这些都通过一个简化、用户友好的界面完成。
Postman 包含用于通过 HTTP 发出 GraphQL 请求的特定 GraphQL 模式,允许您设置 HTTP 标头、编写查询、设置变量值以及导入 GraphQL 架构。它甚至可以验证您的 GraphQL 查询语法。
要在 Postman 中访问 GraphQL 模式,请转到 File > New 并选择 GraphQL 请求类型:
然后,输入 GraphQL 终端节点的 URL,并在 Query 框中输入 GraphQL 查询:
就是这样!查询结果将显示在 Response body.Postman 允许您在不同的选项卡中测试不同的 API 和应用程序,每个选项卡都有自己的标头和设置,并记录每个请求的历史记录,从而使调试 GraphQL 查询变得更加简单。
将 GraphQL 与 Contentful 结合使用
一旦你弄清楚了如何用你选择的语言通过 HTTP 请求进行 GraphQL 查询,你就会想用你的新技能来构建一些很酷的东西。这就是 Contentful 发挥作用的地方!使用我们的可组合内容平台,您可以定义博客文章、图像、视频和产品等内容,然后通过我们的 GraphQL 内容 API 检索其所有数据。
通过在 Contentful 上构建,您可以将您的内容发布到您的所有应用程序和网站,并让它们都通过 GraphQL 提取其内容,无论您使用的是 PHP、JavaScript、Java、Ruby 还是任何其他编程语言或平台。我们的无头 CMS 允许您定义内容及其外观,包括应用程序所需的字段和属性,并创建、编辑和实时预览您的内容,正如用户所看到的那样。
如果您想查看将 GraphQL 与 Content 结合使用的完整示例,包括在查询中使用 GraphQL 变量在 TypeScript 中提供类型安全性,请查看此内容。
我们还提供完整的 GraphQL 课程,使开发人员能够尽可能轻松地开始使用 GraphQL。了解如何开始使用 GraphQL、React 和 Contentful,包括 GraphQL 工具、片段、指令、变量和查询复杂性成本(等等)。
原文链接:https://www.contentful.com/blog/graphql-via-http-in-five-ways/