资讯专栏INFORMATION COLUMN

开始使用GraphQL

UsherChen / 279人阅读

摘要:实践由于是一种规范,它不是一种实现,如果要自己实现还是比较难的,不用担心,强大的开源社区已经帮我们准备好了,这就是开源项目。然后执行这样项目就启动了,如下图注这里存在跨域问题,所以服务器端需要使用解决跨域问题,具体看代码。

为什么要用graphql?

让我们先回顾一下我们现在所使用的API设计风格

纯rest:一个endpoint对应一个资源

优点:灵活、解构
缺点:由于一个endpoint对应一个资源所以需要很多次请求

类rest:一个endpoint对应一个视图

优点:一次请求、所得即所需
缺点:不够灵活、高度耦合、很高的维护成本、迭代慢

上面是我们两种常用的接口方式,两种都有各自的优缺点,有没有可以包揽所有优点的方案呢?我们需要一个标准的API层,那这就是GraphQL,请注意GraphQL是一个规范,是由facebook倡导的一个规范,不是一个实现。
GraphQL有下面三个定义:

一个用来描述数据类型和关系的API定义语言

一个可以描述具体需要获取哪些数据的查询语言

一个可以resolve到数据单个属性的可执行模型

GraphQL是长什么样子的呢?

可能这样看起来还比较难理解,没事,我们直接coding。

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...

一、如何搭建GraphQL服务端 步骤

搭建服务器

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可以支持联想功能,可以非常快的书写查询语句。

二、如何在客户端查询GraphQL数据(以react为例) 步骤

使用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) {
    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); // -------- 添加内容 -------- // class App extends Component { render() { return (

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

); } } export default App;

这里的写法跟redux类似,使用包裹项目,通过graphql方法将数据注入到组件中。

然后执行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/官网

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84460.html

相关文章

  • GraphQL 技术栈揭秘

    摘要:关注业务,而不是技术将数据需求放在它们所属的客户端。技术栈中的每一部分都起着作用技术栈中所有部分之间的协作可以借助缓存来完成。现在,我们来看看另一个贯穿整个技术栈的功能的例子。你可以认为是首个内置细粒度查看的技术。 本文整理自2017年 GraphQL 峰会上的演讲,详述缓存、追踪、模式拼接和 GraphQL 未来发展等有关话题。 Facebook 开源 GraphQL 至今已两年有余...

    zzbo 评论0 收藏0
  • 安息吧 REST API,GraphQL 长存

    摘要:需要哪些数据,与开发人员在中声明该数据的方式之间存在紧密的联系。该大致表示了层可以响应的范围。为了解决多次往返的问题,让响应服务器只是作为一个端点。它需要一种语言来处理自定义请求,并响应该自定义请求的数据。一旦安装,移动应用可能会持续使用同 首发于众成翻译 即使与 REST API 打交道这么多年,当我第一次了解到 GraphQL 和它试图解决的问题时,我还是禁不住把本文的标题发在了...

    Big_fat_cat 评论0 收藏0
  • GraphQL 的入门指南

    摘要:允许创建零配置的服务器。这是一种人类可读的模式语法,称为规范与描述语言。类型是表示外观的自定义对象。为此,创建一个名为的新查询。这意味着无论何时在服务器中发生事件,并且每当调用该事件时,服务器都会将相应的数据发送到客户端。 showImg(https://segmentfault.com/img/bVbm0c1?w=2560&h=1024); 想阅读更多优质文章请猛戳GitHub博客,...

    马忠志 评论0 收藏0
  • 全栈 React + GraphQL 教程(一)

    摘要:然而,尽管使用有诸多好处,但迈出第一步可能并不容易。为了简化初始教程,我们今天只构建一个简单的列表视图。是我们将在本教程系列中使用的客户端的名称。我们将列表组件命名为。在本教程的其余部分中,你将了解到我们构建一个真正的通信应用的基础。 首发于众成翻译 Part 1——前端:使用 Apollo 声明式地请求和 mock 数据 showImg(http://p0.qhimg.com/t0...

    luxixing 评论0 收藏0
  • GraphQL(一):GraphQL介绍

    摘要:怎么使用致力于提供一种直观的弹性语法系统,用以描述客户端程序设计时的数据需求以及数据交互行为。这意味着客户端需要的数据,已经在中制定好了。中采用的方式截然不同,的通常只暴露一个接口,而不是返回固定数据结构的多个接口。GraphQL是什么 GraphQL是facebook开源的一套数据交互方案,它并非某种具体的语言或者框架,它只是提供了一套解决方案,这套解决方案通过GraphQL规范进行定义,...

    UnixAgain 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<