成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

GraphQL 的入門指南

馬忠志 / 2647人閱讀

摘要:允許創(chuàng)建零配置的服務(wù)器。這是一種人類可讀的模式語法,稱為規(guī)范與描述語言。類型是表示外觀的自定義對(duì)象。為此,創(chuàng)建一個(gè)名為的新查詢。這意味著無論何時(shí)在服務(wù)器中發(fā)生事件,并且每當(dāng)調(diào)用該事件時(shí),服務(wù)器都會(huì)將相應(yīng)的數(shù)據(jù)發(fā)送到客戶端。

想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!

今天最常討論的術(shù)語之一是 API,很多人不知道 API 到底是什么,API 是 Application Programming Interface(應(yīng)用程序編程接口)。顧名思義,它是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開發(fā)人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。

你可以將 API 想象成一個(gè)酒保。你向酒保要一杯酒,他們會(huì)給你想要的。簡(jiǎn)單,但是傳統(tǒng)的 REST API 有什么問題的呢?

自從現(xiàn)代 Web 出現(xiàn)以來,構(gòu)建 Api 并不像聽起來那么困難,但是學(xué)習(xí)和理解 Api 才是比較難。開發(fā)人員是大多數(shù)據(jù)使用你的 API 來構(gòu)建某些內(nèi)容或僅使用數(shù)據(jù)。所以你的 API 應(yīng)該盡可能的簡(jiǎn)潔和直觀, 好的 API 是非常容易使用和學(xué)習(xí)的。直觀,在開始設(shè)計(jì) API 時(shí)常要記住的一點(diǎn)。

我們已經(jīng)使用 REST 構(gòu)建 Api 很長(zhǎng)時(shí)間了。隨之而來的也有一些問題,在使用 REST 設(shè)計(jì)構(gòu)建 API 時(shí),你會(huì)遇到以下問題:

涉及很多端

于開發(fā)人員來說,學(xué)習(xí)和理解你的 API 要困難得多

* 信息的獲取有多有少

為了解決這些問題,F(xiàn)acebook 創(chuàng)建了 GraphQL?,F(xiàn)在,作者認(rèn)為 GraphQL 是構(gòu)建 Api 的最佳方式。這篇文章將告訴你為什么要學(xué)習(xí)了解一下 GraphQL。

什么是 GraphQL

GraphQL 是 Facebook 開發(fā)的一種開源查詢語言。它為我們提供了一種更有效的設(shè)計(jì)、創(chuàng)建和使用 Api的方法。從根本上說,它是 REST 的替代品。

GraphQL有很多特性,比如:

GraphQL查詢總是能準(zhǔn)確獲得你想要的數(shù)據(jù),不多不少,所以返回的結(jié)果是可預(yù)測(cè)的, 不再像你使用 REST 那樣過度獲取信息。

它為我們提供了同一個(gè)端,對(duì)于同一個(gè) API,沒有版本2或版本3。給 GraphQL API 添加字段和類型而無需影響現(xiàn)有查詢,老舊字段可以廢棄,從工具中隱藏。

GraphQL是強(qiáng)類型的,通過它,可以在執(zhí)行之前驗(yàn)證 GraphQL 類型系統(tǒng)中的查詢, 它幫助我們構(gòu)建更強(qiáng)大的 Api。

這是對(duì) GraphQL 的基本介紹——為什么它這么強(qiáng)大,為什么它現(xiàn)在這么流行。如果你想了解更多關(guān)于它的信息,可以訪問 GraphQL網(wǎng)站 學(xué)習(xí)。

開始

本文的主要目的不是學(xué)習(xí)如何設(shè)置 GraphQL服務(wù)器,所以我們現(xiàn)在還沒有深入研究。 文本的目標(biāo)是了解 GraphQL 在實(shí)踐中的工作原理,因此這里使用簡(jiǎn)約的零配置 GraphQL 服務(wù)器的 Graphpack。

開始項(xiàng)目前,首先我們創(chuàng)建一個(gè)新文件名為 graphql-server, 在 mac 終端執(zhí)行

mkdir graphql-server

接著進(jìn)入該文件,執(zhí)行

npm init -y

或者執(zhí)行

yarn init

npm 將創(chuàng)建一個(gè)包 package.json 文件,這個(gè)包是你安裝的所有依賴項(xiàng)和命令。

現(xiàn)在,我們要安裝唯一的依賴項(xiàng)。

Graphpack 允許創(chuàng)建零配置的 GraphQL 服務(wù)器。由于剛剛開始使用 GraphQL,這將幫助我們繼續(xù)學(xué)習(xí)GraphQL 更多的內(nèi)容,而不必?fù)?dān)心服務(wù)器配置,執(zhí)行以下命令:

npm install --save-dev graphpack

或者使用 yarn 安裝:

yarn add --dev graphpack

安裝 Graphpack 之后,轉(zhuǎn)到 package.json文件中的腳本,并在其中輸入以下代碼:

"scripts": {
    "dev": "graphpack",
    "build": "graphpack build"
}

接著創(chuàng)建一個(gè)名為 src 的文件夾,它將是整個(gè)服務(wù)器中唯一的文件夾。

src 文件夾中創(chuàng)建一個(gè)名為 schema.graphql 的文件,并寫入以下代碼:

type Query {
  hello: String
}

schema.graphql 文件將是我們的整個(gè) GraphQL的模式(Schema)。

接著在 src 下創(chuàng)建文件 resolvers.js,并寫入以下代碼:

import { users } from "./db";

const resolvers = {
  Query: {
    hello: () => "Hello World!"
  }
};

export default resolvers;

這個(gè) resolvers.js 文件是我們提供 GraphQL 操作轉(zhuǎn)換為數(shù)據(jù)的指令的方式。

接著在 src 下創(chuàng)建一個(gè) db.js 文件并寫入以下代碼:

export let users = [
  { id: 1, name: "John Doe", email: "[email protected]", age: 22 },
  { id: 2, name: "Jane Doe", email: "[email protected]", age: 23 }
];

在本教程中,不使用真實(shí)的數(shù)據(jù)庫,所以這個(gè) db.js 文件將模擬一個(gè)數(shù)據(jù)庫,只是為了學(xué)習(xí)的目的。

現(xiàn)在 src 的結(jié)構(gòu)如下:

src
  |--db.js
  |--resolvers.js
  |--schema.graphql

接著運(yùn)行 npm run dev 或者 yarn dev 啟動(dòng)服務(wù)

在瀏覽器打開 localhost:4000。這里就實(shí)現(xiàn)我們?cè)?GraphQL 中的第一個(gè)查詢,更改和訂閱,打開界面如下:

你可以看到 GraphQL Playground,這是一個(gè)功能強(qiáng)大的 GraphQL IDE,可用于更好的開發(fā)工作流程。 如果你想了解有關(guān) GraphQL Playground的更多信息,請(qǐng)單擊此處。

模式(Schema)

GraphQL 有自己的語言類型,用于編寫模式。 這是一種人類可讀的模式語法,稱為規(guī)范與描述語言(SDL)。無論使用何種技術(shù),SDL 都是相同的 - 你可以將其用于你想要的任何語言或框架。

這種模式語言非常有用,因?yàn)樗庇^的看出 API 具有哪些類型,一看到 API 就知道怎么使用。

類型(Type)

類型是 GraphQL 最重要的特性之一。類型是表示 API 外觀的自定義對(duì)象。例如,如果你正在構(gòu)建一個(gè)社交媒體應(yīng)用程序,那么你的 API 應(yīng)該具有諸如文章、用戶、贊、組等類型。

類型具有字段,這些字段返回特定類型的數(shù)據(jù)。 例如,我們要?jiǎng)?chuàng)建一個(gè) User 類型,我們應(yīng)該有一些 nameemailage 字段。 類型字段可以是任何類型,并始終返回一種數(shù)據(jù)類型,如 Int,F(xiàn)loat,String,Boolean,ID,對(duì)象類型列表或自定義對(duì)象類型。

現(xiàn)在編寫的第一個(gè) Type,在 schema.graphql 文件中用以下內(nèi)容替換已存在的 Query 類型:

type User {
  id: ID!
  name: String!
  email: String!
  age: Int
}

每個(gè)用戶都將擁有一個(gè) ID,因此為其提供了 ID 類型。 用戶也會(huì)有一個(gè) nameemail,所以給它一個(gè)字符串類型和一個(gè) Int 類型。

但是,在每一行的結(jié)尾的 !呢? 感嘆號(hào)表示字段不可為空,這意味著每個(gè)字段必須在每個(gè)查詢中返回一些數(shù)據(jù)。 User 中唯一可以為空的字段是 age。

在GraphQL中,有三個(gè)主要概念:

query (查詢) — 從服務(wù)器獲取數(shù)據(jù)的方式。

mutation (更改) — 修改服務(wù)器上的數(shù)據(jù)并獲取更新數(shù)據(jù)的方法(創(chuàng)建、更新、刪除)。

subscription (訂閱) — 當(dāng)希望數(shù)據(jù)更改時(shí),可以進(jìn)行消息推送,使用 subscription 類型(針對(duì)當(dāng)前的日趨流行的 real-time 應(yīng)用提出的)。

query (查詢)

為了簡(jiǎn)單地解釋這一點(diǎn),GraphQL 中的查詢是獲取數(shù)據(jù)的方式。關(guān)于 GraphQL 中的查詢,最吸引人的地方之一就是你將獲得所需的確切數(shù)據(jù),不多不少。這對(duì)我們的 API 產(chǎn)生了巨大的積極影響——不再像 REST API 那樣獲取過多或不足的信息。

我們將在 GraphQL 中創(chuàng)建第一個(gè)類型的 Query。 我們所有的查詢都將以此類型結(jié)束。 首先,在文件 schema.graphql 編寫一個(gè)名為Query 的新類型:

type Query {
  users: [User!]!
}

這很簡(jiǎn)單:用戶查詢將返回給我們一個(gè)或多個(gè)用戶的數(shù)組。 它不會(huì)返回 null,因?yàn)槲覀兎湃肓?! ,這意味著它是一個(gè)不可為空的查詢, 它總會(huì)返回一些數(shù)據(jù)。

但我們也可以返回特定用戶。 為此,創(chuàng)建一個(gè)名為 user 的新查詢。 在我們的 Query 類型中,寫以下代碼:

user(id: ID!): User!

現(xiàn)在 Query 類型應(yīng)該是這樣的:

type Query {
  users: [User!]!
  user(id: ID!): User!
}

如上所見,使用 GraphQL 中的查詢,還可以傳遞參數(shù)。在本例中,要查詢特定用戶,所以要傳遞其用戶的 ID。

但是,你可能想知道: GraphQL 如何知道從哪里獲取數(shù)據(jù)? 這就是為什么我們應(yīng)該有一個(gè) resolvers.js 文件。該文件告訴 GraphQL 它將如何以及在何處獲取數(shù)據(jù)。

首先,看看我們的 resolvers.js 文件并里該文件里導(dǎo)入 db.js 文件。我們剛才創(chuàng)建的 resolvers.js 文件內(nèi)容如下:

import { users } from "./db";

const resolvers = {
  Query: {
    hello: () => "Hello World!"
  }
};

export default resolvers;

現(xiàn)在,我們將創(chuàng)建第一個(gè) Query,在 resolvers.js 文件并替換 hello 函數(shù)。 現(xiàn)在 resolvers.js 內(nèi)容如下 :

import { users } from "./db";

const resolvers = {
  Query: {
    user: (parent, { id }, context, info) => {
      return users.find(user => user.id == id);
    },
    users: (parent, args, context, info) => {
      return users;
    }
  }
};

export default resolvers;

現(xiàn)在,解釋它是如何工作的:

每個(gè)查詢解析器都有四個(gè)參數(shù)。 在 user 函數(shù)中,我們將 id 作為參數(shù)傳遞,然后返回與傳遞的 id 匹配的特定 user,這很簡(jiǎn)單。

users 函數(shù)中,我們只是返回已存在的 users 數(shù)組,這個(gè)數(shù)組存放的是所有的用戶。

現(xiàn)在,我們將測(cè)試查詢是否工作正常,轉(zhuǎn)到 localhost:4000,輸入以下代碼:

query {
  users {
    id
    name
    email
    age
  }
}

它應(yīng)該返回給你我們所有的用戶。

如果想返回特定的用戶:

query {
  user(id: 1) {
    id
    name
    email
    age
  }
}

mutation (更改)

在 GraphQL 中,更改是修改服務(wù)器上的數(shù)據(jù)并獲取更新數(shù)據(jù)的方式, 你可以像 REST 的CUD(創(chuàng)建,更新,刪除)一樣思考。

在 GraphQL 中創(chuàng)建我們的第一個(gè)類型修改,這里所有的修改都將在這個(gè)類型中結(jié)束。 首先,在 schema.graphql文件中編寫一個(gè)名為mutation 的新類型:

type Mutation {
  createUser(id: ID!, name: String!, email: String!, age: Int): User!
  updateUser(id: ID!, name: String, email: String, age: Int): User!
  deleteUser(id: ID!): User!
}

這里主要定義三個(gè)修改數(shù)據(jù)的方法:

createUser:傳入需要?jiǎng)?chuàng)建用戶的 ID,name,email 和 age,它會(huì)返回一個(gè)新用戶給我們。

updateUser:傳入需要修改用戶的 ID,name,email 和 age(非必傳),它會(huì)返回一個(gè)新用戶給我們。

deleteUser: 傳入需要?jiǎng)h除用戶的 ID,它會(huì)返回一個(gè)新用戶給我們。

現(xiàn)在,在 resolvers.js 文件并在 Query 對(duì)象下面,創(chuàng)建一個(gè)新的 mutation 對(duì)象,如下所示:

Mutation: {
    createUser: (parent, { id, name, email, age }, context, info) => {
      const newUser = { id, name, email, age };

      users.push(newUser);

      return newUser;
    },
    updateUser: (parent, { id, name, email, age }, context, info) => {
      let newUser = users.find(user => user.id === id);

      newUser.name = name;
      newUser.email = email;
      newUser.age = age;

      return newUser;
    },
    deleteUser: (parent, { id }, context, info) => {
      const userIndex = users.findIndex(user => user.id === id);

      if (userIndex === -1) throw new Error("User not found.");

      const deletedUsers = users.splice(userIndex, 1);

      return deletedUsers[0];
    }
  }

現(xiàn)在 resolvers.js 文件內(nèi)容如下:

import { users } from "./db";

const resolvers = {
  Query: {
    user: (parent, { id }, context, info) => {
      return users.find(user => user.id == id);
    },
    users: (parent, args, context, info) => {
      return users;
    }
  },
  Mutation: {
    createUser: (parent, { id, name, email, age }, context, info) => {
      const newUser = { id, name, email, age };

      users.push(newUser);

      return newUser;
    },
    updateUser: (parent, { id, name, email, age }, context, info) => {
      let newUser = users.find(user => user.id === id);

      newUser.name = name;
      newUser.email = email;
      newUser.age = age;

      return newUser;
    },
    deleteUser: (parent, { id }, context, info) => {
      const userIndex = users.findIndex(user => user.id === id);

      if (userIndex === -1) throw new Error("User not found.");

      const deletedUsers = users.splice(userIndex, 1);

      return deletedUsers[0];
    }
  }
};

export default resolvers;


現(xiàn)在,我們要測(cè)試我們的 mutations 是否正常。轉(zhuǎn)到localhost:4000,輸入以下代碼:

mutation {
  createUser(id: 3, name: "Robert", email: "[email protected]", age: 21) {
    id
    name
    email
    age
  }
}

subscription (訂閱)

如我之前所說,訂閱是你與服務(wù)器保持實(shí)時(shí)連接的方式。這意味著無論何時(shí)在服務(wù)器中發(fā)生事件,并且每當(dāng)調(diào)用該事件時(shí),服務(wù)器都會(huì)將相應(yīng)的數(shù)據(jù)發(fā)送到客戶端。

通過訂閱,你可以讓你的應(yīng)用在不同的用戶之間保持更新。

基本訂閱是這樣的:(sample.graphql )

subscription {
  users {
    id
    name
    email
    age
  }
}

你會(huì)說它非常類似于查詢,是的, 但它的工作方式不同。

當(dāng)服務(wù)器中發(fā)生更新時(shí),服務(wù)器將運(yùn)行訂閱中指定的 GraphQL 查詢,并向客戶機(jī)發(fā)送一個(gè)新更新的結(jié)果。

在這篇文章中,我們不打算討論訂閱,但是如果你想閱讀更多關(guān)于訂閱的信息,請(qǐng)單擊這里。

總結(jié)

如你所見,GraphQL 是一項(xiàng)非常強(qiáng)大的新技術(shù)。 它為我們提供了構(gòu)建更好和精心設(shè)計(jì)的API的真正能力。 這就是為什么作者建議你現(xiàn)在開始學(xué)習(xí)它,從本文本作者的角度來說,它最終將取代 REST。


原文:

https://medium.freecodecamp.o...

你的點(diǎn)贊是我持續(xù)分享好東西的動(dòng)力,歡迎點(diǎn)贊!

交流

干貨系列文章匯總?cè)缦?,覺得不錯(cuò)點(diǎn)個(gè)Star,歡迎 加群 互相學(xué)習(xí)。

https://github.com/qq44924588...

我是小智,公眾號(hào)「大遷世界」作者,對(duì)前端技術(shù)保持學(xué)習(xí)愛好者。我會(huì)經(jīng)常分享自己所學(xué)所看的干貨,在進(jìn)階的路上,共勉!

關(guān)注公眾號(hào),后臺(tái)回復(fù)福利,即可看到福利,你懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72934.html

相關(guān)文章

  • GraphQL一個(gè)簡(jiǎn)單入門示例

    摘要:本文首發(fā)于個(gè)人博客目錄什么是解決了什么問題一個(gè)簡(jiǎn)單的入門示例什么是官方文檔定義一種用于的查詢語言,有以下特點(diǎn)請(qǐng)求你所要的數(shù)據(jù)不多不少獲取多個(gè)資源只用一個(gè)請(qǐng)求描述所有可能的類型系統(tǒng)解決了什么問題來說一個(gè)實(shí)際的場(chǎng)景前后端聯(lián)調(diào)接口一直以來都是特別 本文首發(fā)于個(gè)人博客 目錄 什么是GraphQL 解決了什么問題 GraphQL一個(gè)簡(jiǎn)單的入門示例 什么是GraphQL 官方文檔定義:一種用...

    Pines_Cheng 評(píng)論0 收藏0
  • GraphQL入門到實(shí)踐

    摘要:本文實(shí)例代碼什么是是一種面向數(shù)據(jù)的查詢風(fēng)格。概述前端的開發(fā)隨著框架全面普及,組件化開發(fā)也隨之成為大勢(shì)所趨,各個(gè)組件分別管理著各自的狀態(tài),組件化給前端仔帶來便利的同時(shí)也帶來了一些煩惱。 showImg(https://segmentfault.com/img/remote/1460000018479542?w=4928&h=3280); 本文首先介紹了 GraphQL,再通過 Mongo...

    Blackjun 評(píng)論0 收藏0
  • Gatsby極速入門—使用GraphQL解析Markdown(2)

    摘要:什么是既是一種用于的查詢語言也是一個(gè)滿足你數(shù)據(jù)查詢的運(yùn)行時(shí)。嵌套將組件扔到下面的里面打開首頁,看到網(wǎng)站的描述就大功告成了。 1.什么是GraphQL GraphQL 既是一種用于 API 的查詢語言也是一個(gè)滿足你數(shù)據(jù)查詢的運(yùn)行時(shí)。 GraphQL 對(duì)你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準(zhǔn)確地獲得它需要的數(shù)據(jù),而且沒有任何冗余,也讓 API 更容易地隨著時(shí)間...

    fou7 評(píng)論0 收藏0
  • GraphQL 搭配 Koa 最佳入門實(shí)踐

    摘要:如下圖嗯,如圖都已經(jīng)查詢到我們保存的全部數(shù)據(jù),并且全部返回前端了。如圖沒錯(cuò),什么都沒有就是查詢服務(wù)的界面。寫好了之后我們?cè)谂渲靡幌侣酚?,進(jìn)入里面,加入下面幾行代碼。 GraphQL一種用為你 API 而生的查詢語言,2018已經(jīng)到來,PWA還沒有大量投入生產(chǎn)應(yīng)用之中就已經(jīng)火起來了,GraphQL的應(yīng)用或許也不會(huì)太遠(yuǎn)了。前端的發(fā)展的最大一個(gè)特點(diǎn)就是變化快,有時(shí)候應(yīng)對(duì)各種需求場(chǎng)景的變化,不...

    MoAir 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<