graphql是什么
graphql既是一种用于api的查询语言也是一种通过使用对应数据的类型系统,执行数据查询的服务端运行时。graphql没有局限于任何数据库或存储引擎,而是通过既有代码及数据获得支持。
schema
graphql的schema是graphql服务端实现的核心部分。它负责描述能够被客户端程序使用的功能。而在schema中,类型系统又是其基石。包含了创建类型之间的联系,定义数据获取操作(查询)及数据处理操作(增删改),以及自我描述等特性。
程序语言支持
graphql服务端类库已经被多种程序语言支持。
- c# / .net
- clojure
- elixir
- erlang
- go
- groovy
- java
- javascript
- php
- python
- scala
- ruby
package
要想在.net core中使用graphql,执行以下命令添加所需类库包。
dotnet add package graphql
asp.net core
在asp.net中使用graphql有两种方式。
其一,是在传统的controller里调用graphql的方法:
[route("api/[controller]")] [apicontroller] public class graphqlcontroller : controllerbase { [httppost] public async task<iactionresult> post([frombody]graphqlquery query) { var schema = schema.for(@" type query { user: person } type person { id: string name: string } "); var root = new { user = new { id = "1", name = "ken" } }; var result = await new documentexecuter().executeasync(_ => { _.schema = schema; _.query = query.query; _.root = root; }).configureawait(false); return ok(result); } } public class graphqlquery { public string operationname { get; set; } public string namedquery { get; set; } public string query { get; set; } public inputs variables { get; set; } }
运行程序后,可用postman作为客户端测试,并在请求内容中输入以下数据:
{ "query": "query { user { id name }}" }
可得结果:
{ "data": { "user": { "id": "1", "name": "ken" } } }
其二是通过middleware的方式。
首先追加类库包graphql.server.transports.aspnetcore
。
接着定义schema类与objectgraphtype(假设尚未创建):
public class person { public string id { get; set; } public string name { get; set; } } public class persontype: objectgraphtype<person> { public persontype() { field(x => x.id); field(x => x.name); } } public class userquery : objectgraphtype { public userquery() { field<persontype>(name: "user", resolve: ctx=> new person { id = "1", name = "ken" }); } } public class userschema: schema { public userschema() { query = new userquery(); } }
然后在startup文件里,添加graphql相关内容。
public void configureservices(iservicecollection services) { services.addscoped<userschema>(); services.addgraphql(_ => { _.enablemetrics = true; _.exposeexceptions = true; }); } public void configure(iapplicationbuilder app, ihostingenvironment env) { app.usegraphql<userschema>("/graphql"); }
运行后,客户端调用方法与第一种方式相同。
除了使用postman作为客户端调用graphql之外,还可以尝试graphqlplayground获得更便捷的体验。
安装相关类库包:dotnet add package graphql.server.ui.playground
在configure方法里增加一行代码。
public void configure(iapplicationbuilder app, ihostingenvironment env) { app.usegraphql<userschema>("/graphql"); app.usegraphqlplayground(new graphqlplaygroundoptions()); }
然后运行程序,访问http://url地址/ui/playground
,即可直接在网页中调用graphql。
黄山市民网:https://www.huangshanshimin.com/