公開具有不同名稱的 GraphQL 字段
一、概述
GraphQL 已被廣泛用作 Web 服務中的一種通信模式。 GraphQL 的基本前提是客戶端應用程序使用靈活。
在本教程中,我們將研究靈活性的另一個方面。我們還將探討如何使用不同的名稱公開 GraphQL 字段。
2. GraphQL Schema
讓我們舉一個博客的例子,其中包含不同Authors
的Posts
。 GraphQL 模式如下所示:
type Post {
id: ID!
title: String!
text: String!
category: String
author: Author!
}
type Author {
id: ID!
name: String!
thumbnail: String
posts: [Post]!
}
query {
recentPosts(count: 1,offset: 0){
id
title
text
category
author{
id
name
thumbnail
}
}
}
在這裡我們可以獲取最近的帖子。每篇post
都會附有author
。查詢結果如下:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
3. 使用不同名稱公開 GraphQL 字段
客戶端應用程序可能需要使用字段first_author.
現在它正在使用author
。為了滿足這一要求,我們有兩種解決方案:
- 更改 GraphQL 服務器中的模式定義
- 在 GraphQL 中使用別名的概念
讓我們一一看看。
3.1。改變架構
讓我們更新post
的架構定義:
type Post {
id: ID!
title: String!
text: String!
category: String
first_author: Author!
}
author
不是一個微不足道的領域。這是一個複雜的。我們還必須更新相應的解析器以適應此更改。
PostResolver,
中的getAuthor (Post post),
方法將更新為getFirst_author (Post post)
。
這是查詢:
query{
recentPosts(count: 1,offset: 0){
id
title
text
category
first_author{
id
name
thumbnail
}
}
}
上述查詢的結果如下:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
這個解決方案有兩個主要問題:
- 它正在對架構和服務器端實現進行更改
- 它迫使其他客戶端應用程序遵循這個更新的模式定義
這些問題與 GraphQL 提供的靈活性功能相矛盾。
3.2. GraphQL 別名
在 GraphQL 中,別名讓我們可以在不更改架構定義的情況下將字段的結果重命名為我們想要的任何內容。要在查詢中引入別名,別名和冒號 (:) 必須位於 GraphQL 字段之前。
這是查詢的演示:
query{
recentPosts(count: 1,offset: 0){
id
title
text
category
first_author:author{
id
name
thumbnail
}
}
}
上述查詢的結果如下:
{
"data": {
"recentPosts": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"first_author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
讓我們注意到查詢本身正在請求第一個帖子。另一個客戶端應用程序可能會請求使用first_post
而不是recentPosts.
再一次,別名將來救援。
query{
first_post: recentPosts(count: 1,offset: 0){
id
title
text
category
author{
id
name
thumbnail
}
}
}
上述查詢的結果如下:
{
"data": {
"first_post": [
{
"id": "Post00",
"title": "Post 0:0",
"text": "Post 0 + by author 0",
"category": null,
"author": {
"id": "Author0",
"name": "Author 0",
"thumbnail": "http://example.com/authors/0"
}
}
]
}
}
這兩個示例清楚地展示了使用 GraphQL 的靈活性。每個客戶端應用程序都可以根據需要進行自我更新。同時,服務器端模式定義和實現保持不變。
4。結論
在本文中,我們研究了兩種公開具有不同名稱的 graphQL 字段的方法。我們已經通過示例介紹了別名的概念,並解釋了它如何是正確的方法。
與往常一樣,本文的示例代碼可在 GitHub 上獲得。