我尝试使用Kibela的API进行玩耍

首先

在类似于Qiita的服务中,有一个名为Kibela的信息共享服务。
※这并非外部网站引导。

我们公司中,

    • Qiitaは社外向けの技術ブログ

 

    Kibelaは社内向けの情報共有

我认为这两个网站都提供了Web API。

在Kibela中,我们采用了GraphQL进行资源交互,而本次我想使用Kibela的API来尝试玩一下GraphQL。

GraphQL是一种查询语言和运行时执行查询的开放源码规范。

    • GraphQL

 

    kibela-api

GraphAPI由以下的元素组成,这是Web API的一种规范。除此之外,还有一些认知度较高的规范,例如REST。

    • APIの仕様を表現するスキーマ言語

GraphQL SDL (SDL)

データの取得・更新などを行うクエリ言語

GraphQL query language (DSL)

通过发送描述了GraphQL查询语言的文档来进行资源交互,从而进行数据的获取和更新。

在使用GET和POST方法发送请求时,发送方式是不同的。
对于GET方法,我们需要将查询(query)、操作名称(operationName)等参数分别指定在HTTP的查询字符串(Query String)中进行发送。
而对于POST方法,则需要将包含查询(query)、操作名称(operationName)等参数的JSON字符串指定在请求体(Request Body)中进行发送。

执行环境

    • macOS: 10.15.7

 

    Postman: 7.33.1

共同参数

※由于kibela-api需要进行身份验证,基本上是通过POST方法发送请求。

Content-Type: application/json
Accept: application/json
Authorization: Bearer $KIBELA_ACCESS_TOKEN

先试着打一下。

query getCurrentUser {
    currentUser {
        account
        realName
        locale
    }
}
{
    "data": {
        "currentUser": {
            "account": "aucfan-murakami",
            "realName": "登録時の実名が入ります。",
            "locale": "ja"
        }
    }
}

尝试获取资源

我們試著從日報的架構中獲取最新的100篇文章。

query getDailyReport($dailyReportID: ID!) {
    group(id: $dailyReportID) {
        notes(first: 100, orderBy: {field: PUBLISHED_AT, direction: DESC}) {
            edges {
                node {
                    contentHtml
                }
            }
        }
    }
}
{
    "dailyReportID": "IDが入ります。"
}
{
    "data": {
        "group": {
            "notes": {
                "edges": [
                    {
                        "node": {
                            "contentHtml": "ここに記事の内容が入っています。"
                        }
                    },
                    {
                        "node": {
                            "contentHtml": "ここに記事の内容が入っています。"
                        }
                    }
                ]
            }
        }
    }
}

尝试创建资源

我會在日報的Schema中創建一篇文章。

mutation createDailyReport($dailyReportID: ID!) {
    createNote(input: {title: "Test", content: "Test", coediting: false, groupIds: [$dailyReportID]}) {
        clientMutationId
    }
}
{
    "dailyReportID": "IDが入ります。"
}
{
    "data": {
        "createNote": {
            "clientMutationId": null
        }
    }
}

尝试更新资源

我会尝试更新之前创建的文章。

mutation updateDailyReport($dailyReportID: ID!, $noteID: ID!) {
    updateNote(input: {
        id: $noteID,
        baseNote: {
            title: "Test",
            content: "Test",
            coediting: false,
            groupIds: [$dailyReportID]
        },
        newNote: {
            title: "Test12345",
            content: "Test12345",
            coediting: true,
            groupIds: [$dailyReportID]
        },
        draft: false
    }) {
        clientMutationId
    }
}
{
    "dailyReportID": "日報グループのIDが入ります。",
    "noteID": "記事のIDが入ります。"
}
{
    "data": {
        "updateNote": {
            "clientMutationId": null
        }
    }
}

如果要执行这个操作的话,需要事先以某种形式获取当前资源的信息。 (例如文章的标题和内容)

我试着删除资源。

我会尝试删除之前创建的文章。

mutation updateDailyReport($noteID: ID!) {
    deleteNote(input: {id: $noteID}) {
        clientMutationId
    }
}
{
    "noteID": "記事のIDが入ります。"
}
{
    "data": {
        "deleteNote": null
    },
    "errors": [
        {
            "message": "The user has no permission to perform the specified action",
            "locations": [
                {
                    "line": 2,
                    "column": 5
                }
            ],
            "path": [
                "deleteNote"
            ],
            "extensions": {
                "code": "NO_PERMISSION",
                "id": "記事のIDが入ります"
            }
        }
    ]
}

只有管理用户能够执行删除操作。

尝试之类的

为了公司内部使用,我创建了一个定期执行的日报提交和格式检查程序,作为一个PHP Composer包。

这篇文章对我很有启发。

    • 「GraphQL」徹底入門 ─ RESTとの比較、API・フロント双方の実装から学ぶ

 

    • GraphQLを導入してみて得た知見と雑感。GraphQLはタイタニックの救命ボードになりえるかも

 

    Kibela Web API を使ってみました 〜 GraphQL 予備知識ゼロ昭和おじさんのゴールデンウィーク奮闘記 〜

最后

我只是想玩一下GraphQL…笑
接下来想尝试构建API一侧!

bannerAds