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。