如何从命令行向 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

golang exec 在正在运行的二进制/进程上执行命令

如何使用 Amplify 为 GraphQL API (AWS AppSync) 生成类

通过命令行向程序发送消息

如何在 Graphql 架构级别检查 AWS AppSync OIDC 指令的角色或权限