所有文章 > 技术杂货铺 > REST api GraphQL有7种方式:cURL、Python、PHP、JS、Ruby、Java、Postman
REST api GraphQL有7种方式:cURL、Python、PHP、JS、Ruby、Java、Postman

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 发送 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 请求

无需安装任何其他库即可从 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 和 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 中发出 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 中的 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 测试 GraphQL 请求

Postman 与 cURL 一样,是一种用于发出 HTTP 请求的工具,专为测试 API 而设计。许多开发人员更喜欢它,因为它允许他们编写 HTTP 请求(包括 GraphQL 查询),然后测试和调试它们,所有这些都通过一个简化、用户友好的界面完成。

Postman 包含用于通过 HTTP 发出 GraphQL 请求的特定 GraphQL 模式,允许您设置 HTTP 标头、编写查询、设置变量值以及导入 GraphQL 架构。它甚至可以验证您的 GraphQL 查询语法。

要在 Postman 中访问 GraphQL 模式,请转到 File New 并选择 GraphQL 请求类型:

在 Postman 中访问 GraphQL 模式

然后,输入 GraphQL 终端节点的 URL,并在 Query 框中输入 GraphQL 查询:

在 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/

#你可能也喜欢这些API文章!