欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Fetch API執(zhí)行GraphQL查詢和變體問題

 更新時間:2024年04月22日 10:53:30   作者:一紙忘憂  
這篇文章主要介紹了使用Fetch API執(zhí)行GraphQL查詢和變體問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

GraphQL 簡介

GraphQL 是從遠(yuǎn)程服務(wù)器查詢數(shù)據(jù)的強(qiáng)大工具,也是我構(gòu)建 API 的首選方式。對一些人來說,學(xué)習(xí)它可能有一定難度,因為教程通常使用 Apollo 或 Relay 等工具進(jìn)行編寫。

這些工具很不錯,但通常更適用于復(fù)雜項目。在某些情況下,最好選擇更輕量級的方法,并且不要通過添加額外的庫增加包大小。

在這種情況下,你可以直接使用瀏覽器中提供的工具,在本快速教程中,我們將使用在你的瀏覽器中通??捎玫?fetch。

讓我們首先簡單地回顧一下 fetch 是什么以及它如何通常與 REST API 一起使用,在這之后我們就可以開始執(zhí)行簡單的 GraphQL 查詢了。

使用 Fetch 進(jìn)行 GET 請求

Fetch 是用于發(fā)送網(wǎng)絡(luò)請求的現(xiàn)代替代品,取代了較舊的 XMLHttpRequest 工具。它解決了從服務(wù)器獲取數(shù)據(jù)時出現(xiàn)的一些問題,例如 Promise 鏈?zhǔn)教幚怼?/p>

雖然我們不會在本文詳細(xì)討論較舊的 XMLHttpRequest,但重要的是因歷史原因你需要知道 fetch 在較舊的瀏覽器中不受支持。

關(guān)于 fetch 在瀏覽器之外的使用,在 Node.js 17 中你可以作為實驗性功能直接使用它,在較早版本中,你可以安裝比如 node-fetch 庫。

以下是一個用于獲取數(shù)據(jù)簡單請求示例:

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 函數(shù)中傳入了兩個參數(shù),即 URLoptions 參數(shù)。

options 用于附加配置,比如請求的方法、頭部信息、跨源資源共享(CORS)配置以及 POST 請求時的主體內(nèi)容。

隨后的 .then() 調(diào)用允許我們鏈?zhǔn)教幚懋惒?promise,這意味著你首先需要等待來自 API 的結(jié)果。如果成功,我們將獲得響應(yīng),并使用 .json() 方法進(jìn)行轉(zhuǎn)換。

然后再次等待轉(zhuǎn)換結(jié)果,在這里最終可以將數(shù)據(jù)記錄到控制臺上。

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

你會注意到 .catch() 方法尚未被觸發(fā)。如果一切正常運行,只有成功的回調(diào)函數(shù)會被執(zhí)行;但是,如果我們在請求過程中遇到錯誤,則會觸發(fā)錯誤回調(diào)。

使用 Fetch 進(jìn)行 GraphQL 查詢

在先前的示例中,我們使用了雅虎金融的公共 REST API 來執(zhí)行 GET 請求以檢索數(shù)據(jù)。在第二個示例中,我們需要 Star Wars API 的 GraphQL 接口。

GraphQL 提供了所謂的模式內(nèi)省,它允許我們輕松地記錄可以從服務(wù)器檢索到什么數(shù)據(jù),你可以在文檔鏈接中看到。

為了執(zhí)行 GraphQL 查詢,我們需要使用 POST 方法,設(shè)置內(nèi)容為 application/json,并且將字符串化的 GraphQL 文檔發(fā)送至 JSON 主體。

附加到請求的 GraphQL 文檔將如下所示:

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

查詢類似于 REST API 中的 GET 請求,只檢索數(shù)據(jù)。使用 GraphQL,我們需要準(zhǔn)確描述要檢索的數(shù)據(jù)。你可以看到我們已經(jīng)指定了要檢索具有標(biāo)題和發(fā)布日期的電影。

$first 是所謂的變量,這是必要的以將動態(tài)數(shù)據(jù)傳遞給查詢,并允許我們從查詢中獲取前 n 個電影。

現(xiàn)在讓我們轉(zhuǎ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();

我們已經(jīng)為 GraphQL API 和我們的 GraphQL 文檔定義了 URL。在這種情況下,我們需要將選項指定為第二個參數(shù)。

如上所述,選項方法需要設(shè)置為 POST,并且內(nèi)容應(yīng)該設(shè)置為 application/json。body 應(yīng)該是有兩個鍵的字符串化 JSON:

  • query:我們將傳遞 GraphQL 文檔
  • variables:這些變量應(yīng)該與服務(wù)器上文件和模式中的變量定義匹配

你還可以注意到,在第一個使用 GET 請求的示例中, 我們使用了 .thenable() Promise 鏈接方式,但在此處我們已經(jīng)使用了 async await

現(xiàn)在,當(dāng)我們執(zhí)行結(jié)果時,我們會得到以下結(jié)果:

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

總結(jié)

這是對 GraphQL 查詢獲取用法的簡要介紹,變體的原理實際上與查詢相同,即傳遞查詢和變量。

在復(fù)雜的項目中,你應(yīng)該使用 GraphQL 客戶端,如 Apollo、Relay 或其他。

當(dāng)你需要將項目規(guī)模保持在最低限度時,獲取具有重要作用。Axios 也是一種很好的獲取方式。使用獲取時,請務(wù)必考慮瀏覽器支持。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs 最新版安裝npm 的使用詳解

    nodejs 最新版安裝npm 的使用詳解

    本篇文章主要介紹了nodejs 最新版安裝npm 的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Node.js實現(xiàn)登陸注冊功能

    Node.js實現(xiàn)登陸注冊功能

    這篇文章主要為大家詳細(xì)介紹了Node.js實現(xiàn)登陸注冊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 整理 node-sass 安裝失敗的原因及解決辦法(小結(jié))

    整理 node-sass 安裝失敗的原因及解決辦法(小結(jié))

    這篇文章主要介紹了整理 node-sass 安裝失敗的原因及解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    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高版本降為低版本的詳細(xì)解決方案

    nodejs高版本降為低版本的詳細(xì)解決方案

    部分老舊項目需要使用低版本的node,網(wǎng)上很多是無效的,高版本無法直接安裝低版本node,但是低版本nodejs可以安裝部分高版本node,從而達(dá)到升級效果,下面這篇文章主要給大家介紹了關(guān)于nodejs高版本降為低版本的詳細(xì)解決方案,需要的朋友可以參考下
    2022-12-12
  • 從零學(xué)習(xí)node.js之利用express搭建簡易論壇(七)

    從零學(xué)習(xí)node.js之利用express搭建簡易論壇(七)

    這篇文章主要介紹了node.js利用express搭建簡易論壇的方法,我們需要搭建的這個簡易的論壇主要的功能有:注冊、登錄、發(fā)布主題、回復(fù)主題。下面我們來一步步地講解這個系統(tǒng)是如何實現(xiàn)的,需要的朋友可以參考借鑒。
    2017-02-02
  • 在node.js中讀寫文件的三種方法總結(jié)

    在node.js中讀寫文件的三種方法總結(jié)

    nodejs中所有與文件相關(guān)的操作都在fs模塊中,而讀寫操作又是我們會經(jīng)常用到的操作,nodejs的fs模塊針對讀操作為我們提供了readFile,read, createReadStream三個方法,接下來小編就和大家一起來分析一下這三種方法
    2023-09-09
  • NodeJS中的命令行程序、工程目錄、NPM

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

    使用NodeJS編寫的東西,要么是一個包,要么是一個命令行程序,而前者最終也會用于開發(fā)后者,一般我們會同時提供命令行模式和API模式兩種使用方式,并且我們會借助三方包來編寫代碼,NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題
    2023-11-11
  • Node.js包管理工具(npm、yarn、cnpm)

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

    本文主要介紹了Node.js包管理工具,包含npm、yarn、cnpm者三種,借助包管理工具,可以快速開發(fā)項目,提升開發(fā)效率,下面就來具體介紹一下如何使用,感興趣的可以了解一下
    2024-08-08

最新評論