kintoneのGoライブラリを触ってみる

  • 7
    Like
  • 0
    Comment
More than 1 year has passed since last update.

はじめに

kintone Advent Calendar 2015 20 日目の記事です。

最近 Go 言語を触り始めて、kintone 関連でも何かやってみたいなと思っていたところ、kintone のコマンドラインツールの実装にも使われている、kintone/go-kintone というリポジトリを発見したので早速触ってみようと思います。

go-kintone でできること

一通りの CRUD 処理はできるようです。

  • レコードの取得(GET)
  • レコードの登録(POST)
  • レコードの更新(PUT)
  • レコード削除(DELETE)

それから添付ファイル関連も操作できるようです。

  • ファイルダウンロード
  • ファイルアップロード

あと便利なのがこれです。

  • フィールド一覧の取得 (フォーム設計情報の取得)

ここまでできてしまえば、コマンドラインツールやエージェントを作るなど十分にできそうです。
それでは早速触ってみようと思います。

まずは

% go get github.com/kintone/go-kintone

してから、import 文に、"github.com/kintone/go-kintone" を追加しておきます。

クライアントの初期化

REST API を呼び出す起点になるクライアントを初期化します。

app := &kintone.App {
    Domain: <Domain>,
    User: <user>,
    Password: <Password>,
    AppId: <AppId>,
}

App という構造体を構造体リテラルを使って初期化しています。
App はアプリ ID していることから明確ですが、特定のアプリを指しています。

App 構造体には、Timeout フィールドや ApiToken フィールドがあるので、必要に応じて設定します。

App から呼び出せる REST API

メソッドとの対応は以下の様になっていて、表にしてみたものの特に迷うところはないです。

Method / Path メソッド
GET /k/v1/record.json GetRecord()
GET /k/v1/records.json GetRecords()
POST /k/v1/record.json AddRecord()
POST /k/v1/records.json AddRecords()
PUT /k/v1/record.json UpdateRecord()
PUT /k/v1/records.json UpdateRecords()
DELETE /k/v1/records.json DeleteRecords()
GET /k/v1/file.json Download()
POST /k/v1/file.json Upload()
GET /k/v1/form.json Fields()

実際に呼び出してみる

いくつかのメソッドを実際に呼び出してみます。

レコードの一括取得

GetRecords メソッドを使います。

records, err := app.GetRecords(nil, "limit 10")
if (err != nil) {
    log.Fatal(err)
}

for _, record := range records {
    jsonArray, err := record.MarshalJSON()
    if (err != nil) {
        log.Fatal(err)
    }
    json := string(jsonArray)
    fmt.Println(json)
}

GetRecords の引数には、取得する kintone アプリのフィールドを渡します。
今回は全部ほしいので nil を渡します。
第二引数にはクエリとして文字列を渡します。

特定のフィールドの値を取り出したい場合は、レコード型の Fields フィールドにアクセスします。

record.Fields[<フィールドコード>]

Fileds フィールドは String 型を格納したマップで、フィールドコードを元に書くフィールドにアクセすることができます。

また、サブテーブルのフィールドにアクセスしたい場合は、型アサーションを使います。

record.Fields[<サブテーブルのフィールドコード>].(kintone.SubTableField)

SubTableField は Record 型のスライスなので、繰り返し処理でサブテーブルの中のフィールドにアクセスできます。

レコードの一括登録

AddRecords メソッドを使います。
AddRecords の引数には、登録するデータとして Record 型のスライスを渡します。

Record を生成する手順は次のようになります。

  1. 1 レコードつき、キーに string 型、要素にからインターフェースを持つようなマップを生成する。
  2. マップに各フィールドの値を追加する。
  3. kintone.NewRecored 関数にマップを渡して Record を生成する。
records := make([]*kintone.Record, 0)

record := make(map[string]interface{})
record[<フィールドコード>] = kintone.SingleLineTextField(<フィールドの値>)
records = append(records, kintone.NewRecord(record))

ids, err := app.AddRecords(records)
if (err != nil) {
    log.Fatal(err)
}

for _, id := range ids {
    fmt.Println(id)
}

最初に Record を格納して、最終的に AddRecords メソッドに渡すスライスを生成しています。
そのあと、先の手順にしたがって Record を生成します。
Record に追加していく各フィールドは、フィールドごとに対応する型を持っています。
上のコードでは「文字列(1行)」フィールドとして SingleLineTextField を使いましたが実際にはアプリに配置されているフィールドによって型を使い分ける必要があります。

まとめ

go-kintone は非常に充実していてとても使いやすい印象でした。
kintone の API 自体は普通に HTTP クライアントを使えば呼び出すことはできるのですが、レコードデータの生成や、取得したデータを捌く処理を書くときに、go-kintone は非常に便利だと思いました。
Go ならではの分野として、go-kintone を使って軽量なエージェントを作ったり、SORACOM Beam と組み合わせて使えたら面白そうだと思いました。

This post is the No.20 article of kintone Advent Calendar 2015