使用 Prisma GraphQL API

概览

Prisma API 基于 HTTP 协议。这意味着您可以使用任何您喜欢的 HTTP 工具/库与 Prisma API 进行通信。

以下是 createUser mutation 的 HTTP POST 请求的结构:

Header

  • Authorization:携带用于验证请求的 service token(前缀 Bearer); 仅在使用 service secret 部署服务时才需要。

  • Content-Type:指定请求正文(JSON)的格式,通常为 application/json

Body(JSON)

  • query:要发送到 API 的 GraphQL 操作; 请注意,尽管该字段被称为 query,但它也用于 mutations!

  • variables:一个 JSON 对象,包含在提交的 GraphQL 操作中定义的 query 中的变量。

此页面上的所有示例均基于具有以下 service 配置的 Prisma service:

prisma.yml

datamodel: datamodel.prisma
secret: my-secret-42

datamodel.prisma

type User {
  id: ID! @unique
  name: String!
}

curl

curl 是一个命令行工具,除此之外,它允许您向 URL 发送 HTTP 请求。

以下是使用 curl 发送 createUser mutation 到 Prisma API 的方法:

curl '__YOUR_PRISMA_ENDPOINT__' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer __YOUR_SERVICE_TOKEN__' \
--data-binary '{"query":"mutation ($name: String!) { createUser(data: { name: $name }) { id } }","variables":{"name":"Sarah"}}'

要试用此示例,请使用 Prisma service 中的相应值替换 __YOUR_PRISMA_ENDPOINT____YOUR_SERVICE_TOKEN__ 占位符,并将相应的代码段粘贴到终端中。

这相对于向 Prisma API 发送了以下的 mutation 请求:

mutation {
  createUser(data: {
    name: "Sarah"
  }) {
    id
  }
}

试试这个例子:

  1. 用 Prisma service 中的相应值替换 __YOUR_PRISMA_ENDPOINT____YOUR_SERVICE_TOKEN__占位符

  2. 将相应代码段粘贴到终端中,然后按Enter键

fetch(Node.JS)

fetch 允许您使用 JavaScrip t向 URL 发送 HTTP 请求。

以下是在 node 脚本中,使用 fetch 向 Prisma API 发送 createUser mutation 的方法:

const fetch = require('node-fetch')

const endpoint = '__YOUR_PRISMA_ENDPOINT__'

const query = `
mutation($name: String!) {
  createUser(data: {
    name: $name
  }) {
    id
  }
}
`

const variables = { name: 'Sarah' }

fetch(endpoint, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization:
      'Bearer __YOUR_SERVICE_TOKEN__',
  },
  body: JSON.stringify({ query: query, variables: variables }),
})
  .then(response => response.json())
  .then(data => console.log(JSON.stringify(data)))

这相当于向 Prisma API 发送了如下 mutation:

mutation {
  createUser(data: {
    name: "Sarah"
  }) {
    id
  }
}

试试这个例子:

  1. 用 Prisma service 中的相应值替换__YOUR_PRISMA_ENDPOINT____YOUR_SERVICE_TOKEN__占位符

  2. 将相应代码段存储在名为的 script.js 的 JavaScript 文件中

  3. script.js 同一目录下,运行 yarn add node-fetch 安装 node-fetch

  4. 使用以下 terminal 命令行执行脚本: node script.js

graphql-request

graphql-request 库是 fetch 上包装的一个轻量级库,您可以使用它来保存和编写样板代码。它主要用于需要与 GraphQL API 通信的脚本和较小的应用程序。

使用 request

request 不支持将 headers 传递给请求(尚未)。因此,此特定示例假定您的 Prisma 服务已部署,并且没有 service secret。

const { request } = require('graphql-request')

const query = `
mutation($name: String!) {
  createUser(data: {
    name: $name
  }) {
    id
  }
}
`

const variables = { name: 'Sarah' }

request('__YOUR_PRISMA_ENDPOINT__', query,  variables)
  .then(data => console.log(data))

试试这个例子:

  1. 用 Prisma service 中的相应值替换__YOUR_PRISMA_ENDPOINT____YOUR_SERVICE_TOKEN__占位符

  2. 将相应代码段存储在名为的 script.js 的 JavaScript 文件中

  3. script.js 同一目录下,运行库 yarn add graphql-request 命令安装 graphql-request

  4. 使用以下 terminal 命令行执行脚本: node script.js

使用 GraphQLClient

const { GraphQLClient } = require('graphql-request')

const client = new GraphQLClient('__YOUR_PRISMA_ENDPOINT__', {
  headers: {
    Authorization: 'Bearer __YOUR_SERVICE_TOKEN__',
  },
})

const query = `
mutation($name: String!) {
  createUser(data: {
    name: $name
  }) {
    id
  }
}
`

const variables = { name: 'Sarah' }

client.request(query, variables)
  .then(data => console.log(data))

试试这个例子:

  1. 用 Prisma service 中的相应值替换__YOUR_PRISMA_ENDPOINT____YOUR_SERVICE_TOKEN__占位符

  2. 将相应代码段存储在名为的 script.js 的 JavaScript 文件中

  3. script.js 同一目录下,运行库 yarn add graphql-request 命令安装 graphql-request

  4. 使用以下 terminal 命令行执行脚本:node script.js

GraphQL Playground

GraphQL Playground 是一个 GraphQL IDE,允许您向 GraphQL API 发送 queries,mutations 和 subscriptions。

您可以通过将终端,导航到 service 的 prisma.yml 所在目录,然后运行以下命令,来打开 Prisma API 的 Playground:

prisma playground

Apollo Client

Apollo Client 是一个复杂的 GraphQL client 库,常用于大型前端应用程序。虽然所有前面的例子中都使用的类似工具来发送 queries 和 mutations 一样,Apollo Client 暴露了用于发送 queries 和 mutations 的专用方法:querymutate

query 查询

const { ApolloClient } = require('apollo-boost')
const gql = require('graphql-tag')

const endpoint = 'https://eu1.prisma.sh/nikolas-burk/demodofin/dev'

const client = new ApolloClient({
  uri: endpoint
});

const query = gql`
  query {
    users {
      id
      name
    }
  }
`

client.query({
  query: query,
})
  .then(data => console.log(data))

mutate 变换

const { ApolloClient } = require('apollo-boost')
const gql = require('graphql-tag')

const endpoint = 'https://eu1.prisma.sh/nikolas-burk/demodofin/dev'

const client = new ApolloClient({
  uri: endpoint
});

const mutation = gql`
  mutation($name: String!) {
    createUser(data: {
      name: $name
    }) {
      id
    }
  }
  `

const variables = { name: 'Sarah' }

client.mutate({
  mutation: mutation,
  variables: variables
})
  .then(data => console.log(data))

参考链接:https://github.com/graphql/graphql-js