如何从命令行向 AWS AppSync 发送 GraphQL 查询?
Posted
技术标签:
【中文标题】如何从命令行向 AWS AppSync 发送 GraphQL 查询?【英文标题】:How to send a GraphQL query to AWS AppSync from the commandline? 【发布时间】:2020-05-20 22:23:11 【问题描述】:AWS CLI for AppSync 具有一系列可爱的功能,可以从我的工作站的命令行远程管理它,这样我就不必使用浏览器控制台了。
但要进行查询,我必须进入 Web 浏览器控制台并在 AppSync 下找到 GraphQl 查询。我可以通过 CLI 更改各种方式,但我找不到简单地发出 graphql 查询的命令。
我错过了吗?有吗? 我不想再看这个屏幕了...
【问题讨论】:
【参考方案1】:Appsync 查询页面实际上是几件事情的结合。您不能根据 (https://docs.aws.amazon.com/cli/latest/reference/appsync/index.html) 从 CLI 发出查询
但是,您可以使用 GUI 客户端工具将 POST 发送到您的 Appsync 端点。像邮递员或失眠症(我个人最喜欢的)。但是,如果您的目标是真正通过 CLI 发送符合 GraphQL 的查询,那么您将不得不求助于'curl's
这是我的一个示例 python 脚本,它向我的 Appsync API 发送 curl 请求。
#!/usr/bin/env python3
import os
cmd = """curl -i -H 'Content-Type: application/json' -H "x-api-key: <ENTER YOUR API KEY FROM THE APPSYNC SETTINGS PAGE>" -H "Host: <ENTER YOUR HOST ENDPOINT FROM THE APPSYNC API SETTINGS PAGE >" -X POST -d '"query": "query listEvents items id"' https://<ENTER YOUR HOST ENDPOINT FROM THE APPSYNC API SETTINGS PAGE>/graphql"""
def doGraphqlRequest():
os.system(cmd)
print("Starting request to Appsync endpoint")
doGraphQLRequest()
print("Finsihed request to Appsync endpoint")
稍微解释一下,您正在向给定 '/graphql/ 端点的 appsync 查询发出 POST 请求。 您有 3 个标头(由 -H 标志表示)
-
x-api-key:仅当您使用 API KEY 作为身份验证类型时才适用。其他身份验证类型也可以使用,您可能有 AuthToken: Bearer ,Cognito 也可以使用,但 CLI 复杂得多
主机:这是您的 api 提供的 ec2 主机的名称。您可以通过查看分配的端点并删除 https:// 和 /graphql 来找到它
内容类型:应用程序/json。这有点标准,不知道为什么,但这是必须的。
希望这会有所帮助!
【讨论】:
python 可以使用requests
而不是分叉 curl,除非您知道 python graphql 客户端可以轻松完成此操作?
谢谢。只是确保我没有忽略命令。你确认我没有,因此我现在可以继续大声抱怨它:-)
别担心,约翰。作为功能请求向 AppSync 团队投诉。我想我们会更感兴趣从你那里知道的是'你试图解决的问题是什么,你认为用于查询的 Appsync cli 命令可以解决?我们在 aws 控制台上托管的 graphiql 页面有问题吗?你的痛点到底是什么?如果您可以给我发 DM 或发送电子邮件至 baladavi@amazon.com,我绝对很乐意听到他们的声音。此外,您绝对可以使用“请求”库,这只是我的风格,以愚蠢的方式去做。首先仅使用 cli 进行测试,然后编写 cli 命令:)
三个痛点:1) 测试:如果我可以编写脚本,我可以编写测试以针对端点运行,以检查一切是否正常并按预期工作 2) DEV:当浏览器超时时,它通常会忘记我正在处理的查询;记住定期将我的查询保存到临时文件是很痛苦的;忘记更糟糕 3) 开发:我通常更喜欢在 IDE 中开发文件,而不是浏览器文本输入,我这样做,但开发周期是(在 IDE 中破解后端 -> 部署 -> 在浏览器中破解查询)(重复)。这是一个缓慢而糟糕的循环。
嘿约翰。如果您需要通过 Cognito,那么您仍然可以像这样进行 HTTP 调用,但是当使用 Cognito 完成身份验证时,您将传递“授权:”而不是 x-api-key(我在这里简化了很多,但要解释一下),Cognito 返回 3 个令牌,一个 AccessToken、一个 IDToken 和一个 RefreshToken。将身份验证设置为 Cognito 的 AppSync API 的每个请求都需要在 http 标头中传递访问令牌。对于开发,如果您需要使用访问令牌,请查看 Cognito 文档中的“管理员启动身份验证”。它会给你一个管理员令牌供开发人员使用【参考方案2】:
你可以用 Curl 做到这一点:
$ curl -H 'x-api-key: <API KEY>' -d '"query":"query ..."' <API URL>
【讨论】:
【参考方案3】:我不知道 CLI,但您可以从 windows/linux 控制台使用 Curl。
在AWS at API_KEY Authorization中描述为:
curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:ABC123" -d ' "query": "query movies id " ' https://YOURAPPSYNCENDPOINT/graphql
只需将 3 个字段替换为您可以在 APPSYNC SERVICE 的 AWS 账户中找到的字段:
-
API_KEY
APP 端点
查询
如果您使用 windows,请记住它不喜欢单引号,因此请尝试仅使用 " 和 \" 而不是 ' 进行查询,例如:
Ubuntu 控制台:
curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:**YOUR_API_KEY**" -d **' "query":"query listTodos items title " '** https://**YOUR_END_POINT**.amazonaws.com/graphql
Windows 控制台(检查查询引号):
curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:**YOUR_API_KEY**" -d **" \\"query\\":\\"query listTodos items title \\" "** https://**YOUR_END_POINT**.amazonaws.com/graphql
【讨论】:
【参考方案4】:graphql-python/gql 自 version 3.0.0rc0 起支持 AWS AppSync。
它支持实时端点上的查询、变异甚至订阅。
它支持IAM、api key和JWT认证方式。
它有一个gql-cli 脚本,允许您从命令行执行查询、突变和订阅。
文档可在here获取
对于查询和突变,使用--transport appsync_http
参数:
# Put the request in a file
$ echo 'mutation createMessage($message: String!)
createMessage(input: message: $message)
id
message
createdAt
' > mutation.graphql
# Execute the request using gql-cli with --transport appsync_http
$ cat mutation.graphql | gql-cli $AWS_GRAPHQL_API_ENDPOINT --transport appsync_http -V message:"Hello world!"
对于订阅,使用--transport appsync_websockets
参数:
echo "subscriptiononCreateMessagemessage" | gql-cli $AWS_GRAPHQL_API_ENDPOINT --transport appsync_websockets
【讨论】:
以上是关于如何从命令行向 AWS AppSync 发送 GraphQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 $util.error 在 AppSync 中发送自定义错误
如何将枚举类型字段从反应发送到 GraphQL/AWS appsync