欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

graphql的学习

程序员文章站 2022-05-17 19:06:36
...

graphQl学习

介绍

●GraphQL是Facebook开发的一 -种数据查询语言,并于2015年
公开发布。它是REST API的替代品

●GraphQL既是- -种用于API的查询语言也是一-个满足你数据查
询的运行时。GraphQL 对你的API中的数据提供了一套易于理
解的完整描述,使得客户端能够准确地获得它需要的数据,而且
没有任何冗余,也让API更容易地随着时间推移而演进。

●官网: https://graphql.org/

●中文网: http://graphql.cn/

●特点:

1.请求需要的数据,不多不少
例如: account中有name, lage, sex, department等。 可以只取得需要的字段。
2.获取多个资源,只用-个请求
3.描述所有可能类型的系统。便于维护,根据需求平滑演进,添
加或者隐藏字段。

对比于resful

●restful: Representational State Transfer表属性状态转移。本
质上就是用定义uri,通过api接口来取得资源。通用系统架构,
不受语言限制。
例子:饿了么接口

  1. resful一个接口只能返回一个资源,graphql一次可以返回多个资源。
  2. resful用不同的url来区分资源,graphql用类型区分

graphql的类型

基本类型:String,Boolean,Float,Int ,ID,可以在schema中直接使用。
数组[类型]:[int]代表整型数组。

参数类型传递

和js传递参数一样,小括号内定义形参,但是注意:参数需要定
义类型。

●!(叹号)代表参数不能为空。

type Query {
//返回的数组
rollDice( numDice: Int!, numSides: Int): [Int ]
}

自定义参数类型

●GraphQL允许用户自定义 参数类型,通常用来描述要获取的资
源的属性。


type Account {
name: String .
age: Int
sex: String
department: String
salary(city: String): Int
}

type Query {
account(name: String): Account
}

案例

服务端接口
var express = require('express');
var {
    buildSchema
} = require('graphql')
const graphqlHTTP = require('express-graphql')
var app = express();
// 定义模型 查询 type不能丢
const schema = buildSchema(`
   type Query {
       getclassmate(classNo:Int!):[String]
       account(username: String): Account
   }
   type Account {
    name: String 
    age: Int
    sex: String
    department: String
    salary(city: String): Int
    }
    `)
// 定义查询对应的处理器
const root = {
    getclassmate: ({
        classNo
    }) => {
        const obj = {
            31: ["lisa", "dave", "phil"],
            61: ["张三", "李四", "王麻子"],
            51: ["但是", "ds", "eds"]
        }
        return obj[classNo]
    },
    account: ({
        username
    }) => {
        // 先定义返回值中的内容
        const name = username;
        const sex = "man";
        const age = 12
        const department = "mis";
    // 由于有参数传递进来,所以使用解构赋值 且判断不同的值对应返回的内容
        const salary = ({
            city
        }) => {
            if (city === "北京" || city === "上海" || city === "深圳") {
                return 10000;

            } else {
                return 4000;
            }
        }
        // 最后整体返回
        return{
            name,
            sex,
            age,
            department,
            salary
        }
    }
}
/* GET users listing. */
app.use('/graphql', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true
}));
app.listen(3002, () => {
    console.log("开启3002成功")
});
// 向外公开文件夹供用户访问静态资源index
app.use(express.static('public'))

访问端口信息
graphql的学习

在客户端访问graphql接口
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button onclick="getdata()">获取数据</button>
    <script>
        function getdata() {
            //    定义字符串  account(username: String): 改造
            const query = `
              query Account($username: String){
                account(username:$username){
                    name,
                    sex,
                    salary(city: "北京")
                }
           }
           `
            //    定义变量,该变量自动绑定$username
            var variables = { username: "张安三" }

            fetch('/graphql', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Accept': 'application/json'
                },
                //   转换为字符串
                body: JSON.stringify({
                    query:query,
                    variables: variables
                })
            }).then(res => res.json).then(data => {
                console.log(data)
            })
        }
    </script>
</body>

</html>

network中可以看到graphql的学习
注意:

1.定义的int型如果在定义处理器中加“13”会默认转换为int,但是如果有其他字符,或报错,请求后会有提示,且对应字段为null
2.定义模型的type 不能丢且后面必须是大写字母开头的单词
客户端访问的参数字段一定要对应一致,

请求数据貌似使用apollo的方式,还没研究,下来看看

相关标签: 接口