使用Fetch API执行GraphQL查询和变体问题

 更新时间:2024年04月22日 10:53:30   作者:一纸忘忧  
这篇文章主要介绍了使用Fetch API执行GraphQL查询和变体问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

GraphQL 简介

GraphQL 是从远程服务器查询数据的强大工具,也是我构建 API 的首选方式。对一些人来说,学习它可能有一定难度,因为教程通常使用 Apollo 或 Relay 等工具进行编写。

这些工具很不错,但通常更适用于复杂项目。在某些情况下,最好选择更轻量级的方法,并且不要通过添加额外的库增加包大小。

在这种情况下,你可以直接使用浏览器中提供的工具,在本快速教程中,我们将使用在你的浏览器中通常可用的 fetch

让我们首先简单地回顾一下 fetch 是什么以及它如何通常与 REST API 一起使用,在这之后我们就可以开始执行简单的 GraphQL 查询了。

使用 Fetch 进行 GET 请求

Fetch 是用于发送网络请求的现代替代品,取代了较旧的 XMLHttpRequest 工具。它解决了从服务器获取数据时出现的一些问题,例如 Promise 链式处理。

虽然我们不会在本文详细讨论较旧的 XMLHttpRequest,但重要的是因历史原因你需要知道 fetch 在较旧的浏览器中不受支持。

关于 fetch 在浏览器之外的使用,在 Node.js 17 中你可以作为实验性功能直接使用它,在较早版本中,你可以安装比如 node-fetch 库。

以下是一个用于获取数据简单请求示例:

const url = 'https://query1.finance.yahoo.com/v8/finance/chart/BTC-USD'

const options = {
  method: 'GET',
}

fetch(url, options)
  .then((response) => {
    return response.json()
  })
  .then((data) => {
    const res = data.chart.result
    console.info(res)
    return res
  })
  .catch((err) => {
    console.log('err', err)
  })

我们可以看到在 fetch 函数中传入了两个参数,即 URLoptions 参数。

options 用于附加配置,比如请求的方法、头部信息、跨源资源共享(CORS)配置以及 POST 请求时的主体内容。

随后的 .then() 调用允许我们链式处理异步 promise,这意味着你首先需要等待来自 API 的结果。如果成功,我们将获得响应,并使用 .json() 方法进行转换。

然后再次等待转换结果,在这里最终可以将数据记录到控制台上。

{
  "data": {
    "allFilms": {
      "films": [
        {
          "title": "A New Hope",
          "releaseDate": "1977-05-25"
        },
        {
          "title": "The Empire Strikes Back",
          "releaseDate": "1980-05-17"
        }
      ]
    }
  }
}

你会注意到 .catch() 方法尚未被触发。如果一切正常运行,只有成功的回调函数会被执行;但是,如果我们在请求过程中遇到错误,则会触发错误回调。

使用 Fetch 进行 GraphQL 查询

在先前的示例中,我们使用了雅虎金融的公共 REST API 来执行 GET 请求以检索数据。在第二个示例中,我们需要 Star Wars API 的 GraphQL 接口。

GraphQL 提供了所谓的模式内省,它允许我们轻松地记录可以从服务器检索到什么数据,你可以在文档链接中看到。

为了执行 GraphQL 查询,我们需要使用 POST 方法,设置内容为 application/json,并且将字符串化的 GraphQL 文档发送至 JSON 主体。

附加到请求的 GraphQL 文档将如下所示:

query ($first: Int) {
  allFilms(first: $first) {
   films {
    title
    releaseDate
   }
  }
}

查询类似于 REST API 中的 GET 请求,只检索数据。使用 GraphQL,我们需要准确描述要检索的数据。你可以看到我们已经指定了要检索具有标题和发布日期的电影。

$first 是所谓的变量,这是必要的以将动态数据传递给查询,并允许我们从查询中获取前 n 个电影。

现在让我们转换成 JavaScript 代码:

const url = 'https://swapi-graphql.netlify.app/.netlify/functions/index';

const GET_FILMS = `query ($first: Int) {
  allFilms(first: $first) {
   films {
    title
    releaseDate
   }
  }
}`;

const options = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    query: GET_FILMS,
    variables: {
      first: 2
    }
  })
};

const fetchAPI = async () => {
  try {
    const result = await fetch(
      url,
      options
    );
    const data = await result.json();
    console.info(data);
  } catch (err) {
    console.info(err)
  }
}
await fetchAPI();

我们已经为 GraphQL API 和我们的 GraphQL 文档定义了 URL。在这种情况下,我们需要将选项指定为第二个参数。

如上所述,选项方法需要设置为 POST,并且内容应该设置为 application/jsonbody 应该是有两个键的字符串化 JSON:

  • query:我们将传递 GraphQL 文档
  • variables:这些变量应该与服务器上文件和模式中的变量定义匹配

你还可以注意到,在第一个使用 GET 请求的示例中, 我们使用了 .thenable() Promise 链接方式,但在此处我们已经使用了 async await

现在,当我们执行结果时,我们会得到以下结果:

{
  "data": {
    "allFilms": {
      "films": [
        {
          "title": "A New Hope",
          "releaseDate": "1977-05-25"
        },
        {
          "title": "The Empire Strikes Back",
          "releaseDate": "1980-05-17"
        }
      ]
    }
  }
}

总结

这是对 GraphQL 查询获取用法的简要介绍,变体的原理实际上与查询相同,即传递查询和变量。

在复杂的项目中,你应该使用 GraphQL 客户端,如 Apollo、Relay 或其他。

当你需要将项目规模保持在最低限度时,获取具有重要作用。Axios 也是一种很好的获取方式。使用获取时,请务必考虑浏览器支持。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nodejs 最新版安装npm 的使用详解

    nodejs 最新版安装npm 的使用详解

    本篇文章主要介绍了nodejs 最新版安装npm 的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Node.js实现登陆注册功能

    Node.js实现登陆注册功能

    这篇文章主要为大家详细介绍了Node.js实现登陆注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 整理 node-sass 安装失败的原因及解决办法(小结)

    整理 node-sass 安装失败的原因及解决办法(小结)

    这篇文章主要介绍了整理 node-sass 安装失败的原因及解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Node.js报错信息Error: Cannot find module 'XXX'问题及解决

    Node.js报错信息Error: Cannot find module 'XXX'问题及解

    这篇文章主要介绍了Node.js报错信息Error: Cannot find module 'XXX'问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • express的中间件cookieParser详解

    express的中间件cookieParser详解

    这篇文章主要介绍了node.js中express的中间件cookieParser的使用方法,需要的朋友可以参考下
    2014-12-12
  • nodejs高版本降为低版本的详细解决方案

    nodejs高版本降为低版本的详细解决方案

    部分老旧项目需要使用低版本的node,网上很多是无效的,高版本无法直接安装低版本node,但是低版本nodejs可以安装部分高版本node,从而达到升级效果,下面这篇文章主要给大家介绍了关于nodejs高版本降为低版本的详细解决方案,需要的朋友可以参考下
    2022-12-12
  • 从零学习node.js之利用express搭建简易论坛(七)

    从零学习node.js之利用express搭建简易论坛(七)

    这篇文章主要介绍了node.js利用express搭建简易论坛的方法,我们需要搭建的这个简易的论坛主要的功能有:注册、登录、发布主题、回复主题。下面我们来一步步地讲解这个系统是如何实现的,需要的朋友可以参考借鉴。
    2017-02-02
  • 在node.js中读写文件的三种方法总结

    在node.js中读写文件的三种方法总结

    nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法,接下来小编就和大家一起来分析一下这三种方法
    2023-09-09
  • NodeJS中的命令行程序、工程目录、NPM

    NodeJS中的命令行程序、工程目录、NPM

    使用NodeJS编写的东西,要么是一个包,要么是一个命令行程序,而前者最终也会用于开发后者,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码,NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题
    2023-11-11
  • Node.js包管理工具(npm、yarn、cnpm)

    Node.js包管理工具(npm、yarn、cnpm)

    本文主要介绍了Node.js包管理工具,包含npm、yarn、cnpm者三种,借助包管理工具,可以快速开发项目,提升开发效率,下面就来具体介绍一下如何使用,感兴趣的可以了解一下
    2024-08-08

最新评论