问题描述
我有一个正在运行的后端服务器,该服务器在端点/api
上提供GraphQL。像魔术一样工作,但我仍然可以从外部打开它,并且无需身份验证即可访问。
因此,我开始尝试Google刚刚发布的API Gateway beta。除了必须配置OpenAPI 2.0配置YAML的那一部分之外,所有这些都非常简单。
swagger: "2.0"
info:
title: myapp-backend-graphql-api
description: "API for GraphQL queries and mutations"
version: "1.0.0"
schemes:
- "https"
paths:
"/api":
post:
description: "GraphQL Endpoint"
operationId: "graphqlEndpoint"
x-google-backend:
address: https://myapp-backend-43Jasfasd-ew.a.run.app
parameters:
- in: body
name: GraphQl
schema:
type: object
responses:
200:
description: "Success."
schema:
type: object
这是我的openapi-config.yml
。我有点挣扎了b
它在这里定义了“ REST”端点,因为我有一个GraphQL端点。但这只是一个POST请求,对不对?因此,我认为对于OpenAPI 2.0而言,这没什么常事。
但是-现在通过网关URL https://mystuff-api-9kytelt5.ew.gateway.dev
和端点/api
调用API失败。
xetra11@pop-os:~$ curl https://mystuff-api-9kytelt5.ew.gateway.dev/api/schema.json
{"message":"Path does not match any requirement URI template.","code":404}
该错误消息让我有些失落,不知道该在哪里调整。
解决方法
在openapi-config.yml文件中,例如示例here,您需要将主机添加在schemes条目上方。主机是Cloud Run创建的URL的主机名部分。此外,您的路径和方案都使用双引号,而不必使用双引号。我对您的示例进行了一些修改,看看是否有帮助。
示例:
swagger: "2.0"
info:
title: myapp-backend-graphql-api
description: "API for GraphQL queries and mutations"
version: "1.0.0"
host: myapp-backend-43Jasfasd-ew.a.run.app
schemes:
- https
paths:
/api:
post:
description: "GraphQL Endpoint"
operationId: "graphqlEndpoint"
x-google-backend:
address: https://myapp-backend-43Jasfasd-ew.a.run.app
parameters:
- in: body
name: GraphQl
schema:
type: object
responses:
'200':
description: Success
schema:
type: object
,
您仅在openAPI规范中定义了POST动词。在您的curl命令中添加一个-X POST
,以将默认的GET动词更改为POST