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

資訊專欄INFORMATION COLUMN

開始使用GraphQL

UsherChen / 403人閱讀

摘要:實踐由于是一種規(guī)范,它不是一種實現(xiàn),如果要自己實現(xiàn)還是比較難的,不用擔(dān)心,強大的開源社區(qū)已經(jīng)幫我們準(zhǔn)備好了,這就是開源項目。然后執(zhí)行這樣項目就啟動了,如下圖注這里存在跨域問題,所以服務(wù)器端需要使用解決跨域問題,具體看代碼。

為什么要用graphql?

讓我們先回顧一下我們現(xiàn)在所使用的API設(shè)計風(fēng)格

純rest:一個endpoint對應(yīng)一個資源

優(yōu)點:靈活、解構(gòu)
缺點:由于一個endpoint對應(yīng)一個資源所以需要很多次請求

類rest:一個endpoint對應(yīng)一個視圖

優(yōu)點:一次請求、所得即所需
缺點:不夠靈活、高度耦合、很高的維護成本、迭代慢

上面是我們兩種常用的接口方式,兩種都有各自的優(yōu)缺點,有沒有可以包攬所有優(yōu)點的方案呢?我們需要一個標(biāo)準(zhǔn)的API層,那這就是GraphQL,請注意GraphQL是一個規(guī)范,是由facebook倡導(dǎo)的一個規(guī)范,不是一個實現(xiàn)。
GraphQL有下面三個定義:

一個用來描述數(shù)據(jù)類型和關(guān)系的API定義語言

一個可以描述具體需要獲取哪些數(shù)據(jù)的查詢語言

一個可以resolve到數(shù)據(jù)單個屬性的可執(zhí)行模型

GraphQL是長什么樣子的呢?

可能這樣看起來還比較難理解,沒事,我們直接coding。

GraphQL實踐

由于GraphQL是一種規(guī)范,它不是一種實現(xiàn),如果要自己實現(xiàn)還是比較難的,不用擔(dān)心,強大的開源社區(qū)已經(jīng)幫我們準(zhǔn)備好了,這就是Apollo開源項目。Apollo提供了豐富的后端實現(xiàn)(node支持:express、koa、hapi、restify等框架)和前端(React、RN、Angular、IOS、Android等)實現(xiàn)。官方文檔:http://dev.apollodata.com/too...。下面的實踐都是基于Apollo以nodejs的Express框架來實現(xiàn)的。
Demo代碼:https://github.com/jasondu/ap...

一、如何搭建GraphQL服務(wù)端 步驟

搭建服務(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 }));    // 實現(xiàn)GraphQL接口功能
graphQLServer.use("/graphiql", graphiqlExpress({ endpointURL: "/graphql" }));    // 實現(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)境下實現(xiàn)grapql的庫,這里使用了里面兩個類

graphqlExpress是實現(xiàn)grapql接口功能的類

graphiqlExpress是實現(xiàn)grapql瀏覽器調(diào)試界面(An in-browser IDE for exploring GraphQL.)的類,就多了一個“i”,這個調(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 {    # 帖子的字段有下面這些,包括 這個帖子是哪個作者寫的
  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方法,這個方法是將Schema結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成GraphQLSchema實例。
typeDefs里面定義了三個格式Author,Post,Query,這里Query就是查詢的時候返回的結(jié)構(gòu),Author,Post是解釋了在Query中的結(jié)構(gòu)類型。
接下來,我們就可以編寫具體的實現(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;

上面這段代碼比較簡單,就不做解釋了。
至此,我們就完成了一個GraphQL服務(wù)端的開發(fā),加下來我們npm i & npm start

吶,這樣就啟動啦!打開http://localhost:3002/graphiql就可以看到剛才前面說的graphiql,就是GraphQL瀏覽器調(diào)試界面。

graphiql可以支持聯(lián)想功能,可以非??斓臅鴮懖樵冋Z句。

二、如何在客戶端查詢GraphQL數(shù)據(jù)(以react為例) 步驟

使用create-react-app創(chuàng)建一個項目,并且按照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";

// -------- 添加內(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) {
    return 

Loading ...

; } 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); // -------- 添加內(nèi)容 -------- // class App extends Component { render() { return (

To get started, edit src/App.js and save to reload.

); } } export default App;

這里的寫法跟redux類似,使用包裹項目,通過graphql方法將數(shù)據(jù)注入到組件中。

然后執(zhí)行yarn start 這樣項目就啟動了,如下圖

注:這里存在跨域問題,所以服務(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ù)庫,rest等,入門必讀

https://dev-blog.apollodata.c...

《Full-stack React + GraphQL Tutorial》講解如何和客戶端結(jié)合起來,還有如果實現(xiàn)ws實時通信等

https://launchpad.graphql.com...

這個是apollo提供的線上編輯器,可以在線上編寫schema和resolve,然后可以下載下來部署

https://www.howtographql.com/

這個網(wǎng)站詳細講解了如何在各種服務(wù)器客戶端使用graphql

http://taobaofed.org/blog/201...

《Node.js 服務(wù)端實踐之 GraphQL 初探》阿里在15年寫的文章

http://graphql.org/官網(wǎng)

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

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

相關(guān)文章

  • GraphQL 技術(shù)棧揭秘

    摘要:關(guān)注業(yè)務(wù),而不是技術(shù)將數(shù)據(jù)需求放在它們所屬的客戶端。技術(shù)棧中的每一部分都起著作用技術(shù)棧中所有部分之間的協(xié)作可以借助緩存來完成。現(xiàn)在,我們來看看另一個貫穿整個技術(shù)棧的功能的例子。你可以認(rèn)為是首個內(nèi)置細粒度查看的技術(shù)。 本文整理自2017年 GraphQL 峰會上的演講,詳述緩存、追蹤、模式拼接和 GraphQL 未來發(fā)展等有關(guān)話題。 Facebook 開源 GraphQL 至今已兩年有余...

    zzbo 評論0 收藏0
  • 安息吧 REST API,GraphQL 長存

    摘要:需要哪些數(shù)據(jù),與開發(fā)人員在中聲明該數(shù)據(jù)的方式之間存在緊密的聯(lián)系。該大致表示了層可以響應(yīng)的范圍。為了解決多次往返的問題,讓響應(yīng)服務(wù)器只是作為一個端點。它需要一種語言來處理自定義請求,并響應(yīng)該自定義請求的數(shù)據(jù)。一旦安裝,移動應(yīng)用可能會持續(xù)使用同 首發(fā)于眾成翻譯 即使與 REST API 打交道這么多年,當(dāng)我第一次了解到 GraphQL 和它試圖解決的問題時,我還是禁不住把本文的標(biāo)題發(fā)在了...

    Big_fat_cat 評論0 收藏0
  • GraphQL 的入門指南

    摘要:允許創(chuàng)建零配置的服務(wù)器。這是一種人類可讀的模式語法,稱為規(guī)范與描述語言。類型是表示外觀的自定義對象。為此,創(chuàng)建一個名為的新查詢。這意味著無論何時在服務(wù)器中發(fā)生事件,并且每當(dāng)調(diào)用該事件時,服務(wù)器都會將相應(yīng)的數(shù)據(jù)發(fā)送到客戶端。 showImg(https://segmentfault.com/img/bVbm0c1?w=2560&h=1024); 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,...

    馬忠志 評論0 收藏0
  • 全棧 React + GraphQL 教程(一)

    摘要:然而,盡管使用有諸多好處,但邁出第一步可能并不容易。為了簡化初始教程,我們今天只構(gòu)建一個簡單的列表視圖。是我們將在本教程系列中使用的客戶端的名稱。我們將列表組件命名為。在本教程的其余部分中,你將了解到我們構(gòu)建一個真正的通信應(yīng)用的基礎(chǔ)。 首發(fā)于眾成翻譯 Part 1——前端:使用 Apollo 聲明式地請求和 mock 數(shù)據(jù) showImg(http://p0.qhimg.com/t0...

    luxixing 評論0 收藏0
  • GraphQL(一):GraphQL介紹

    摘要:怎么使用致力于提供一種直觀的彈性語法系統(tǒng),用以描述客戶端程序設(shè)計時的數(shù)據(jù)需求以及數(shù)據(jù)交互行為。這意味著客戶端需要的數(shù)據(jù),已經(jīng)在中制定好了。中采用的方式截然不同,的通常只暴露一個接口,而不是返回固定數(shù)據(jù)結(jié)構(gòu)的多個接口。GraphQL是什么 GraphQL是facebook開源的一套數(shù)據(jù)交互方案,它并非某種具體的語言或者框架,它只是提供了一套解決方案,這套解決方案通過GraphQL規(guī)范進行定義,...

    UnixAgain 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<