公开具有不同名称的GraphQL字段

2023/05/12

1. 概述

GraphQL已被广泛用作Web服务中的通信模式。GraphQL的基本前提是客户端应用程序可以灵活使用

在本教程中,我们将研究灵活性的另一个方面。我们还将探讨如何使用不同的名称公开GraphQL字段。

2. GraphQL模式

让我们举一个博客的例子,其中包含不同作者的帖子。GraphQL模式看起来像这样:

query {
    recentPosts(count: 1, offset: 0){
        id
        title
        text
        category
        author {
            id
            name
            thumbnail
        }
    }
}

type Post {
    id: ID!
    title: String!
    text: String!
    category: String
    authorId: Author!
}

type Author {
    id: ID!
    name: String!
    thumbnail: String
    posts: [Post]!
}

在这里我们可以获取最近的帖子。每个帖子都将附有作者。查询结果如下:

{
    "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 改变模式

让我们更新帖子的模式定义:

type Post {
    id: ID!
    title: String!
    text: String!
    category: String
    first_author: Author!
}

author不是一个微不足道的字段。这是一个复杂的问题。我们还必须更新处理程序方法以适应此更改。

在PostController中用@SchemaMapping标记的author(Post post)方法需要更新为getFirst_author(Post post)。或者,必须在@SchemaMapping中添加field属性以反映新的字段名称

下面是查询:

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上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章