最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

GraphQL 簡(jiǎn)介

GraphQL 是從遠(yuǎn)程服務(wù)器查詢數(shù)據(jù)的強(qiáng)大工具,也是我構(gòu)建 API 的首選方式。對(duì)一些人來(lái)說(shuō),學(xué)習(xí)它可能有一定難度,因?yàn)榻坛掏ǔJ褂?Apollo 或 Relay 等工具進(jìn)行編寫。

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

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

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

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

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

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

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

以下是一個(gè)用于獲取數(shù)據(jù)簡(jiǎn)單請(qǐng)求示例:

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

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

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

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

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

你會(huì)注意到 .catch() 方法尚未被觸發(fā)。如果一切正常運(yùn)行,只有成功的回調(diào)函數(shù)會(huì)被執(zhí)行;但是,如果我們?cè)谡?qǐng)求過(guò)程中遇到錯(cuò)誤,則會(huì)觸發(fā)錯(cuò)誤回調(diào)。

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

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

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

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

附加到請(qǐng)求的 GraphQL 文檔將如下所示:

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

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

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

現(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。在這種情況下,我們需要將選項(xiàng)指定為第二個(gè)參數(shù)。

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

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

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

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

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

總結(jié)

這是對(duì) GraphQL 查詢獲取用法的簡(jiǎn)要介紹,變體的原理實(shí)際上與查詢相同,即傳遞查詢和變量。

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

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

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

相關(guān)文章

  • Node.js?中常用內(nèi)置模塊(path?路徑模塊)

    Node.js?中常用內(nèi)置模塊(path?路徑模塊)

    這篇文章主要介紹了Node.js?中常用內(nèi)置模塊(path?路徑模塊),文章圍繞主題展開(kāi)詳細(xì)的相關(guān)介紹,具有一定的參考價(jià)值,感興趣的朋友可以參考一下
    2022-09-09
  • node.js Sequelize實(shí)現(xiàn)單實(shí)例字段或批量自增、自減

    node.js Sequelize實(shí)現(xiàn)單實(shí)例字段或批量自增、自減

    Sequelize 可以實(shí)現(xiàn)針對(duì)單個(gè)實(shí)例的一或多個(gè)字段的自增、自減操作,也可以對(duì)符合條件的數(shù)據(jù)進(jìn)行批量的自增、自減操作。單個(gè)實(shí)例字段的自增、自減可以利用Instance的相應(yīng)方法實(shí)現(xiàn),而批量自增、自減則需要借助sequelize提供的字面量方法實(shí)現(xiàn)。下面來(lái)看看詳細(xì)的介紹吧。
    2016-12-12
  • NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析

    NodeJS 創(chuàng)建目錄和文件的方法實(shí)例分析

    這篇文章主要介紹了NodeJS 創(chuàng)建目錄和文件的方法,涉及node.js中fs模塊mkdir、writeFile及目錄判斷existsSync等方法的功能與相關(guān)使用技巧,需要的朋友可以參考下
    2023-04-04
  • 詳解Node.js中單線程限制的有效解決方法

    詳解Node.js中單線程限制的有效解決方法

    Node.js?是一個(gè)基于事件驅(qū)動(dòng)、非阻塞?I/O?模型的?JavaScript?運(yùn)行時(shí)環(huán)境,特別適合構(gòu)建高并發(fā)的網(wǎng)絡(luò)應(yīng)用,本文介紹了幾種解決?Node.js單線程限制的方法,希望對(duì)大家有所幫助
    2024-12-12
  • node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理

    node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理

    這篇文章主要介紹了node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理
    2023-07-07
  • Nodejs拉取??低曅熊囉涗泝x攝像頭視頻流的實(shí)現(xiàn)方法

    Nodejs拉取??低曅熊囉涗泝x攝像頭視頻流的實(shí)現(xiàn)方法

    在市場(chǎng)上??低暤漠a(chǎn)品一直處于領(lǐng)先地位,提供了一系列高質(zhì)量的視頻監(jiān)控解決方案,下面這篇文章主要介紹了Nodejs拉取??低曅熊囉涗泝x攝像頭視頻流的實(shí)現(xiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • Node.js使用MySQL連接池的方法實(shí)例

    Node.js使用MySQL連接池的方法實(shí)例

    這篇文章主要介紹了Node.js使用MySQL連接池的方法,結(jié)合具體實(shí)例形式分析了nodejs操作mysql連接池的相關(guān)模塊安裝、連接、查詢等使用技巧,需要的朋友可以參考下
    2018-02-02
  • 阿里云ecs服務(wù)器中安裝部署node.js的步驟

    阿里云ecs服務(wù)器中安裝部署node.js的步驟

    這篇文章給大家介紹了在阿里云ecs服務(wù)器中安裝部署node.js的詳細(xì)步驟,對(duì)大家安裝node.js具有一定的參考借鑒價(jià)值,有需要的朋友們下面來(lái)一起看看吧。
    2016-10-10
  • websocket結(jié)合node.js實(shí)現(xiàn)雙向通信的示例代碼

    websocket結(jié)合node.js實(shí)現(xiàn)雙向通信的示例代碼

    本文主要介紹了websocket結(jié)合node.js實(shí)現(xiàn)雙向通信的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Node.js EventEmmitter事件監(jiān)聽(tīng)器用法實(shí)例分析

    Node.js EventEmmitter事件監(jiān)聽(tīng)器用法實(shí)例分析

    這篇文章主要介紹了Node.js EventEmmitter事件監(jiān)聽(tīng)器用法,結(jié)合實(shí)例形式分析了EventEmmitter事件監(jiān)聽(tīng)器相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2019-01-01

最新評(píng)論

永福县| 南通市| 高邮市| 铜梁县| 毕节市| 海阳市| 荔波县| 都匀市| 塔城市| 韶山市| 南城县| 余庆县| 绍兴市| 师宗县| 凯里市| 调兵山市| 涞水县| 四会市| 攀枝花市| 浦县| 海门市| 万荣县| 灯塔市| 金湖县| 莱西市| 通城县| 台湾省| 黄山市| 岳阳市| 淳安县| 罗定市| 多伦县| 华亭县| 靖江市| 安泽县| 政和县| 大洼县| 拉孜县| 长葛市| 昌乐县| 龙南县|