GraphQL是什麼 GraphQL既是一種用於API的查詢語言也是一種通過使用對應數據的類型系統,執行數據查詢的服務端運行時。GraphQL沒有局限於任何資料庫或存儲引擎,而是通過既有代碼及數據獲得支持。 Schema GraphQL的Schema是GraphQL服務端實現的核心部分。它負責描述能 ...
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。