摘要:實(shí)踐由于是一種規(guī)范,它不是一種實(shí)現(xiàn),如果要自己實(shí)現(xiàn)還是比較難的,不用擔(dān)心,強(qiáng)大的開源社區(qū)已經(jīng)幫我們準(zhǔn)備好了,這就是開源項(xiàng)目。然后執(zhí)行這樣項(xiàng)目就啟動(dòng)了,如下圖注這里存在跨域問題,所以服務(wù)器端需要使用解決跨域問題,具體看代碼。
為什么要用graphql?
純r(jià)est:一個(gè)endpoint對(duì)應(yīng)一個(gè)資源讓我們先回顧一下我們現(xiàn)在所使用的API設(shè)計(jì)風(fēng)格
優(yōu)點(diǎn):靈活、解構(gòu)
缺點(diǎn):由于一個(gè)endpoint對(duì)應(yīng)一個(gè)資源所以需要很多次請(qǐng)求
優(yōu)點(diǎn):一次請(qǐng)求、所得即所需
缺點(diǎn):不夠靈活、高度耦合、很高的維護(hù)成本、迭代慢
上面是我們兩種常用的接口方式,兩種都有各自的優(yōu)缺點(diǎn),有沒有可以包攬所有優(yōu)點(diǎn)的方案呢?我們需要一個(gè)標(biāo)準(zhǔn)的API層,那這就是GraphQL,請(qǐng)注意GraphQL是一個(gè)規(guī)范,是由facebook倡導(dǎo)的一個(gè)規(guī)范,不是一個(gè)實(shí)現(xiàn)。
GraphQL有下面三個(gè)定義:
一個(gè)用來(lái)描述數(shù)據(jù)類型和關(guān)系的API定義語(yǔ)言
一個(gè)可以描述具體需要獲取哪些數(shù)據(jù)的查詢語(yǔ)言
一個(gè)可以resolve到數(shù)據(jù)單個(gè)屬性的可執(zhí)行模型
GraphQL是長(zhǎng)什么樣子的呢?
可能這樣看起來(lái)還比較難理解,沒事,我們直接coding。
GraphQL實(shí)踐一、如何搭建GraphQL服務(wù)端 步驟由于GraphQL是一種規(guī)范,它不是一種實(shí)現(xiàn),如果要自己實(shí)現(xiàn)還是比較難的,不用擔(dān)心,強(qiáng)大的開源社區(qū)已經(jīng)幫我們準(zhǔn)備好了,這就是Apollo開源項(xiàng)目。Apollo提供了豐富的后端實(shí)現(xiàn)(node支持:express、koa、hapi、restify等框架)和前端(React、RN、Angular、IOS、Android等)實(shí)現(xiàn)。官方文檔:http://dev.apollodata.com/too...。下面的實(shí)踐都是基于Apollo以nodejs的Express框架來(lái)實(shí)現(xiàn)的。
Demo代碼:https://github.com/jasondu/ap...
搭建服務(wù)器
import express from "express"; import { graphqlExpress, graphiqlExpress, } from "apollo-server-express"; import bodyParser from "body-parser"; import schema from "./data/schema"; // 定義GraphQL查詢格式 const GRAPHQL_PORT = 3002; const graphQLServer = express(); graphQLServer.use("/graphql", bodyParser.json(), graphqlExpress({ schema })); // 實(shí)現(xiàn)GraphQL接口功能 graphQLServer.use("/graphiql", graphiqlExpress({ endpointURL: "/graphql" })); // 實(shí)現(xiàn)GraphQL瀏覽器調(diào)試界面 graphQLServer.listen(GRAPHQL_PORT, () => console.log( `GraphiQL is now running on http://localhost:${GRAPHQL_PORT}/graphiql` ));
懂Express的童鞋應(yīng)該都可以看到上面的代碼,我做一下解釋:
apollo-server-express 是由Apollo提供在express環(huán)境下實(shí)現(xiàn)grapql的庫(kù),這里使用了里面兩個(gè)類
graphqlExpress是實(shí)現(xiàn)grapql接口功能的類
graphiqlExpress是實(shí)現(xiàn)grapql瀏覽器調(diào)試界面(An in-browser IDE for exploring GraphQL.)的類,就多了一個(gè)“i”,這個(gè)調(diào)試界面可以在后面看到
schema就是上文講的是定義GraphQL查詢格式的
編寫Schema
讓我們看看Schema.js是怎么寫的
import { makeExecutableSchema, } from "graphql-tools"; import resolvers from "./resolvers"; // 定義schema const typeDefs = ` type Author { # 作者的字段有:id,名字,還有 發(fā)表的帖子 id: Int firstName: String lastName: String posts: [Post] } type Post { # 帖子的字段有下面這些,包括 這個(gè)帖子是哪個(gè)作者寫的 id: Int title: String text: String views: Int author: Author } type Query { # 定義查詢內(nèi)容 author(firstName: String, lastName: String): Author # 查詢作者信息 getFortuneCookie: String } `; const schema = makeExecutableSchema({ typeDefs, resolvers }); export default schema;
這里用到Apollo提供的makeExecutableSchema方法,這個(gè)方法是將Schema結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成GraphQLSchema實(shí)例。
typeDefs里面定義了三個(gè)格式Author,Post,Query,這里Query就是查詢的時(shí)候返回的結(jié)構(gòu),Author,Post是解釋了在Query中的結(jié)構(gòu)類型。
接下來(lái),我們就可以編寫具體的實(shí)現(xiàn)了。
編寫Resolvers
const resolvers = { Query: { author(root, args){ // args就是上面schema中author的入?yún)? return { id: 1, firstName: "Hello", lastName: "World" }; }, }, Author: { // 定義author中的posts posts(author){ return [ { id: 1, title: "A post", text: "Some text", views: 2}, { id: 2, title: "Another post", text: "Some other text", views: 200} ]; }, }, Post: { // 定義Post里面的author author(post){ return { id: 1, firstName: "Hello", lastName: "World" }; }, }, }; export default resolvers;
上面這段代碼比較簡(jiǎn)單,就不做解釋了。
至此,我們就完成了一個(gè)GraphQL服務(wù)端的開發(fā),加下來(lái)我們npm i & npm start
吶,這樣就啟動(dòng)啦!打開http://localhost:3002/graphiql就可以看到剛才前面說(shuō)的graphiql,就是GraphQL瀏覽器調(diào)試界面。
graphiql可以支持聯(lián)想功能,可以非常快的書寫查詢語(yǔ)句。
使用create-react-app創(chuàng)建一個(gè)項(xiàng)目,并且按照Apollo客戶端解決方案庫(kù):react-apollo
create-react-app client & yarn add react-apollo
修改App.js
import React, { Component } from "react"; import logo from "./logo.svg"; import "./App.css"; // -------- 添加內(nèi)容 -------- // import { ApolloClient, ApolloProvider, createNetworkInterface, gql, graphql, } from "react-apollo"; // 設(shè)置接口地址 const networkInterface = createNetworkInterface({ uri: "http://localhost:3002/graphql" }); const client = new ApolloClient({ networkInterface, }); const Test = ({ data: { loading, error, author } }) => { if (loading) { returnLoading ...
; } if (error) { return{error.message}
; } return ({author.firstName} {author.lastName}
); }; // 查詢語(yǔ)句 const query = gql` query AuthorQuery { author (firstName: "firstName", lastName: "lastName") { firstName, lastName } } `; const Gtest = graphql(query)(Test); // -------- 添加內(nèi)容 -------- // class App extends Component { render() { return (); } } export default App; To get started, edit
src/App.js
and save to reload.
這里的寫法跟redux類似,使用
然后執(zhí)行yarn start 這樣項(xiàng)目就啟動(dòng)了,如下圖
注:這里存在跨域問題,所以服務(wù)器端需要使用cors解決跨域問題,具體看代碼。
下面是我收集的相關(guān)學(xué)習(xí)資料:https://dev-blog.apollodata.c...
《Tutorial: How to build a GraphQL server》講解了如何搭建node GraphQL服務(wù)器,如何定義schema,還有如何鏈接以前的SQL數(shù)據(jù)庫(kù),rest等,入門必讀
https://dev-blog.apollodata.c...
《Full-stack React + GraphQL Tutorial》講解如何和客戶端結(jié)合起來(lái),還有如果實(shí)現(xiàn)ws實(shí)時(shí)通信等
https://launchpad.graphql.com...
這個(gè)是apollo提供的線上編輯器,可以在線上編寫schema和resolve,然后可以下載下來(lái)部署
https://www.howtographql.com/
這個(gè)網(wǎng)站詳細(xì)講解了如何在各種服務(wù)器客戶端使用graphql
http://taobaofed.org/blog/201...
《Node.js 服務(wù)端實(shí)踐之 GraphQL 初探》阿里在15年寫的文章
http://graphql.org/官網(wǎng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84460.html
摘要:關(guān)注業(yè)務(wù),而不是技術(shù)將數(shù)據(jù)需求放在它們所屬的客戶端。技術(shù)棧中的每一部分都起著作用技術(shù)棧中所有部分之間的協(xié)作可以借助緩存來(lái)完成。現(xiàn)在,我們來(lái)看看另一個(gè)貫穿整個(gè)技術(shù)棧的功能的例子。你可以認(rèn)為是首個(gè)內(nèi)置細(xì)粒度查看的技術(shù)。 本文整理自2017年 GraphQL 峰會(huì)上的演講,詳述緩存、追蹤、模式拼接和 GraphQL 未來(lái)發(fā)展等有關(guān)話題。 Facebook 開源 GraphQL 至今已兩年有余...
摘要:需要哪些數(shù)據(jù),與開發(fā)人員在中聲明該數(shù)據(jù)的方式之間存在緊密的聯(lián)系。該大致表示了層可以響應(yīng)的范圍。為了解決多次往返的問題,讓響應(yīng)服務(wù)器只是作為一個(gè)端點(diǎn)。它需要一種語(yǔ)言來(lái)處理自定義請(qǐng)求,并響應(yīng)該自定義請(qǐng)求的數(shù)據(jù)。一旦安裝,移動(dòng)應(yīng)用可能會(huì)持續(xù)使用同 首發(fā)于眾成翻譯 即使與 REST API 打交道這么多年,當(dāng)我第一次了解到 GraphQL 和它試圖解決的問題時(shí),我還是禁不住把本文的標(biāo)題發(fā)在了...
摘要:允許創(chuàng)建零配置的服務(wù)器。這是一種人類可讀的模式語(yǔ)法,稱為規(guī)范與描述語(yǔ)言。類型是表示外觀的自定義對(duì)象。為此,創(chuàng)建一個(gè)名為的新查詢。這意味著無(wú)論何時(shí)在服務(wù)器中發(fā)生事件,并且每當(dāng)調(diào)用該事件時(shí),服務(wù)器都會(huì)將相應(yīng)的數(shù)據(jù)發(fā)送到客戶端。 showImg(https://segmentfault.com/img/bVbm0c1?w=2560&h=1024); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,...
摘要:然而,盡管使用有諸多好處,但邁出第一步可能并不容易。為了簡(jiǎn)化初始教程,我們今天只構(gòu)建一個(gè)簡(jiǎn)單的列表視圖。是我們將在本教程系列中使用的客戶端的名稱。我們將列表組件命名為。在本教程的其余部分中,你將了解到我們構(gòu)建一個(gè)真正的通信應(yīng)用的基礎(chǔ)。 首發(fā)于眾成翻譯 Part 1——前端:使用 Apollo 聲明式地請(qǐng)求和 mock 數(shù)據(jù) showImg(http://p0.qhimg.com/t0...
摘要:怎么使用致力于提供一種直觀的彈性語(yǔ)法系統(tǒng),用以描述客戶端程序設(shè)計(jì)時(shí)的數(shù)據(jù)需求以及數(shù)據(jù)交互行為。這意味著客戶端需要的數(shù)據(jù),已經(jīng)在中制定好了。中采用的方式截然不同,的通常只暴露一個(gè)接口,而不是返回固定數(shù)據(jù)結(jié)構(gòu)的多個(gè)接口。GraphQL是什么 GraphQL是facebook開源的一套數(shù)據(jù)交互方案,它并非某種具體的語(yǔ)言或者框架,它只是提供了一套解決方案,這套解決方案通過(guò)GraphQL規(guī)范進(jìn)行定義,...
閱讀 889·2021-11-23 09:51
閱讀 1097·2021-11-15 17:57
閱讀 1671·2021-09-22 15:24
閱讀 816·2021-09-07 09:59
閱讀 2229·2019-08-29 15:10
閱讀 1854·2019-08-29 12:47
閱讀 757·2019-08-29 12:30
閱讀 3374·2019-08-26 13:51