ASP.NET Core中使用GraphQL - 第四章 GraphiQL

ASP.NET Core中使用GraphQL
- ASP.NET Core中使用GraphQL - 第一章 Hello World
 - ASP.NET Core中使用GraphQL - 第二章 中间件
 - ASP.NET Core中使用GraphQL - 第三章 依赖注入
 
GraphiQL是一款内置在浏览器中的GraphQL探索工具,这个是开发GraphQL的一个必备工具。它就相当于WebApi中的Swagger, 使用这个工具就可以看到你的GraphQL中所有配置的结构,并可以在浏览器中测试你的query, mutation
现在除了
GraphiQL,graphql-dotnet还提供了另外一个[GraphQL.Server](GraphQL for .NET - Subscription Transport WebSockets)的类库, 它也可以生成一个界面更优雅的探索工具,但是由于作者声明了还未在重型生产环境中测试过,所以这里先不做介绍,后续我会单独写一篇博文来介绍一下。
要想使用GraphiQL, 我们需要借助NodeJs中的npm和webpack.
首先我们在当前Hello World项目中创建一个package.json文件, 内容如下
{
  "name": "GraphQLAPI",
  "version": "1.0.0",
  "main": "index.js",
  "author": "Fiyaz Hasan",
  "license": "MIT",
  "dependencies": {
    "graphiql": "^0.11.11",
    "graphql": "^0.13.2",
    "isomorphic-fetch": "^2.2.1",
    "react": "^16.3.1",
    "react-dom": "^16.2.0"
  },
  "devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.11",
    "extract-text-webpack-plugin": "^3.0.2",
    "ignore-loader": "^0.1.2",
    "style-loader": "^0.20.3",
    "webpack": "^3.11.0"
  }
}
然后可以使用一下命令,安装package.json中所有预定义的库
npm install
下一步,我们需要在当前项目目录中创建一个新的文件夹ClientApp, 并在其中添加2个文件app.js和app.css, 其文件内容如下。
app.js
import React from 'react';
import ReactDOM from 'react-dom';
import GraphiQL from 'graphiql';
import fetch from 'isomorphic-fetch';
import 'graphiql/graphiql.css';
import './app.css';
function graphQLFetcher(graphQLParams) {
  return fetch(window.location.origin + '/api/graphql', {
    method: 'post',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(graphQLParams)
  }).then(response => response.json());
}
ReactDOM.render(
  <GraphiQL fetcher={graphQLFetcher} />,
  document.getElementById('app')
);
app.css
html, body {
    height: 100%;
    margin: 0;
    overflow: hidden;
    width: 100%
}
#app {
    height: 100vh
}
GraphiQL是一个客户端库,它提供了一个React组件<GraphiQL />, 这个组件用来呈现整个用户界面。这个组件有一个fetcher属性, 这个属性可以附加一个function。 附加的function返回了一个HTTP promise对象,它仅仅是模仿了我们在Postman中测试的POST请求。所以这些设置都写在app.js文件中。
下一步我们需要在wwwroot目录中添加一个index.html, 这里我们会将<GraphiQL />组件的内容呈现在id="app"的div中.
index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>GraphiQL</title>
    <link rel="stylesheet" href="/style.css" />
</head>
<body>
    <div id="app"></div>
    <script src="/bundle.js" type="text/javascript"></script>
</body>
</html>
在index.html文件中,我们引入了一个bundle.js和一个style.css文件。这2个文件是通过脚本编译出来的,所以这里我们需要添加一个webpack.config.js
webpack.config.js
const webpack = require('webpack');
var path = require('path');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = [
    {
        entry: {
            'bundle': './ClientApp/app.js',
        },
        output: {
            path: path.resolve('./wwwroot'),
            filename: '[name].js'
        },
        resolve: {
            extensions: ['.js', '.json']
        },
        module: {
            rules: [
                { test: /\.js/, use: [{
                    loader: 'babel-loader'
                }], exclude: /node_modules/ },
                {
                    test: /\.css$/, use: ExtractTextPlugin.extract({
                        fallback: "style-loader",
                        use: "css-loader"
                    })
                },
                { test: /\.flow/, use: [{
                    loader: 'ignore-loader'
                }] }
            ]
        },
        plugins: [
            new ExtractTextPlugin('style.css', { allChunks: true })
        ]
    }
];
最后我们还需要添加一个.babelrc文件,其内容如下
.babelrc
{
  "presets": ["env", "react"]
}
以上文件添加完成之后,我们可以在在命令行使用webpack命令编译生成这2个文件。
C:\chapter4>webpack
Hash: e8082714ec56e818e1f4
Version: webpack 3.12.0
Child
    Hash: e8082714ec56e818e1f4
    Time: 6645ms
        Asset     Size  Chunks                    Chunk Names
    bundle.js  2.76 MB       0  [emitted]  [big]  bundle
    style.css  39.7 kB       0  [emitted]         bundle
      [33] (webpack)/buildin/global.js 509 bytes {0} [built]
     [128] ./node_modules/graphql-language-service-interface/dist ^.*$ 807 bytes {0} [built]
     [137] ./ClientApp/app.js 996 bytes {0} [built]
     [234] (webpack)/buildin/module.js 517 bytes {0} [built]
     [292] ./ClientApp/app.css 41 bytes {0} [built]
     [297] ./node_modules/css-loader!./ClientApp/app.css 301 bytes [built]
        + 292 hidden modules
    Child extract-text-webpack-plugin node_modules/extract-text-webpack-plugin/dist node_modules/css-loader/index.js!node_modules/graphiql/graphiql.css:
           2 modules
    Child extract-text-webpack-plugin node_modules/extract-text-webpack-plugin/dist node_modules/css-loader/index.js!ClientApp/app.css:
           [0] ./node_modules/css-loader!./ClientApp/app.css 301 bytes {0} [built]
            + 1 hidden module
C:\chapter4>
在服务器端,我们需要修改Startup.cs文件,在Configure方法中添加静态文件中间件和默认页中间件,修改后最终的Configure方法代码如下
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseMiddleware<GraphQLMiddleware>();
}
现在我们启动项目,你将会看到如下图所示的用户界面。

在右侧的Documentation Explorer面板中,你可以看到定义的所有query, 并且可以了解到哪些字段是可用的,以及它们是干什么用的。
GraphiQL提供了许多很棒的功能
- 语法高亮
 - 编写
GraphQL查询时,字段,参数,类型等的自动感知 - 实时错误高亮以及报告
 - 自动补全查询
 - 可以在浏览器中模拟请求, 运行检查查询结果
 
本文源代码:https://github.com/lamondlu/GraphQL_Blogs/tree/master/Part%20IV
ASP.NET Core中使用GraphQL - 第四章 GraphiQL的更多相关文章
- ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量
		
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
 - ASP.NET Core中使用GraphQL - 第六章  使用EF Core作为持久化仓储
		
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
 - ASP.NET Core中使用GraphQL - 第七章  Mutation
		
ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...
 - ASP.NET Core中使用GraphQL - 第三章 依赖注入
		
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOL ...
 - ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
		
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由
		
原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...
 - ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)
		
原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑
		
原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...
 - ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器
		
原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...
 
随机推荐
- 7. 整合shiro,搭建粗粒度权限管理
			
shiro是一个易用的权限管理框架,只需提供一个Realm即可在项目中使用,本文就将结合上一篇中搭建的权限模块.角色模块和用户模块来搭建一个粗粒度的权限管理系统,具体如下:1. 添加shiro依赖和与 ...
 - java函数式编程之Consumer
			
参考https://blog.csdn.net/z345434645/article/details/53794724 https://blog.csdn.net/chuji2012/article/ ...
 - 浅谈Java中的final关键字
			
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
 - nsqlookup_protocol_v1.go
			
, atomic.LoadInt64(&client.peerInfo.lastUpdate)) now := time.Now() p.ctx.nsqlook ...
 - list control控件的一些操作
			
一.添加数据 这里介绍的是最平常的添加方法,当然也有很多其他比较好的方法.这里要非常注意添加顺序.先上代码: //导入excel文档中的内容到list中 CoInitialize(NULL); if ...
 - [UOJ#207. 共价大爷游长沙]——LCT&随机化
			
题目大意: 传送门 给一颗动态树,给出一些路径并动态修改,每次询问一条边是否被所有路径覆盖. 题解: 先%一发myy. 开始感觉不是很可做的样子,发现子树信息无论维护什么都不太对…… 然后打开题目标签 ...
 - Linux的文件类型
			
在Linux中,文件的颜色都是有含义的.其中, Linux中文件名颜色不同,代表文件类型不一样. 浅蓝色:表示链接文件: 灰色:表示其他文件: 绿色:表示可执行文件: 红色:表示压缩文件: 蓝色:表示 ...
 - C++ bitset用法
			
概念: bitset是用来存储位的(其中的元素只有两种形式) 这个类通常用来模拟一个布尔数组,但对空间分配上进行了优化:通常,每个元素只占用一个bit ,而通常char类型是它的八倍 每个位置上的位都 ...
 - Java关于static的作用
			
概述 只要是有学过Java的都一定知道static,也一定能多多少少说出一些作用和注意事项.如果已经对static了如指掌的请点击关闭按钮,看下去也只是浪费您宝贵时间而已.这篇随笔只是个人的习惯总结. ...
 - 微服务架构 - 巧妙获取被墙的Docker镜像
			
在国内由于种种原因,有些Docker镜像直接是获取不到的,特别是k8s中的一些镜像.本人在部署k8s中的helm组件时需要获取tiller镜像,如果直接用如下命令: docker pull gcr.i ...