我尝试使用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一侧!