如何在 GraphQL Server 上接受来自远程服务器的 POST 请求

问题描述 投票:0回答:2

我正在开发一个当前使用 GrapQL 的项目。我正在集成一个支付处理器,当用户支付成功时,支付处理器会向 webhook URL 发送一个 POST 请求,该 URL 旨在指向我的服务器。现在我想知道如何实现这一目标,考虑到 GraphQL 仅公开一个端点(在我的例子中

/graphql
)。如何捕获传入的 POST 请求?为了更好的上下文,

如果我使用 REST API,则在成功付款后,Webhook 会向

/payment/verify
发送包含付款数据的 POST 请求。但是,如何使用 GraphQL 服务器实现此目的,将数据从 webhook 直接获取到 GraphQL 服务器中的解析器?谢谢您,期待您的回复。

javascript node.js express graphql apollo-server
2个回答
0
投票

除非支付处理器发送的post请求符合graphql请求的形式。请求负载必须满足标准 GraphQL AST。只有这样,服务器端的 GraphQL 才能解析 AST,进行 validationexecution 工作。

GraphQL 发布请求表单为:

require('isomorphic-fetch');

fetch('http://localhost:4000', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ query: `
    query {
      todos {
        edges {
          node {
            completed
            id
            text
          }
        }
      }
    }` 
  }),
})
.then(res => res.json())
.then(res => console.log(res.data));

您可以创建额外的路由和端点来用作Webhooks,但更好的方法是将Webhooks功能提取到独立的服务中。连接数据库,执行业务逻辑,处理数据。

您的 GraphQL API 服务器只有一个端点

/graphql
用于 API 网关服务。 webhook 服务是后端服务之一。


0
投票

是的,简短的回答是不可能。

要接收 Webhook,您需要一个具有特定正文的 POST HTTP 端点,而 graphql 使用了不同的正文格式,以“查询或突变”开头,并需要它特定的响应,例如:

mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}

并且不可能以简单的方式进行映射。

我的建议是创建一个简单的 HTTP 端点来接收 webwook 请求

例如,使用 NestJS(这是我最喜欢的后端框架),您可以创建它。

$ nest g resource web-hook

你会收到...

您可以像这样指定您的端点:

@Controller("webhooks")
export class WebhooksController {
  constructor(private readonly webhooksService: WebhooksService) {}

  @Post("/order-payment/khipu")
  confirmPayment(@Body() confirmPaymentInput: ConfirmPaymentInput) {
    return this.webhooksService.confirmPayment(confirmPaymentInput);
  }
}

确认付款输入在哪里

export class ConfirmPaymentInput {
  @IsString()
  notification_token: string;
}

这样,您就可以接收 Webhook 的有效负载。

© www.soinside.com 2019 - 2024. All rights reserved.