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