kintone REST API について (GET編)


**【更新情報】**
2019/03/16 複数件取得の処理を追記
2018/10/27 PHPの処理を追記
2018/10/22 記事公開

-----

# はじめに

[前回の記事](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759) の続きです。

> **▼ 連載記事一覧**

> ||タイトル|
> |---|---|
> |0|[kintone環境の取得方法 (開発者ライセンス)](https://qiita.com/RyBB/items/73c50f1751ad137ba410)| 
> |1|[kintoneの使い方 (データベース編)](https://qiita.com/RyBB/items/daabb9b60d804ee2242f)| 
> |2|[kintone REST API について (共通事項編)](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)| 
> |3|[kintone REST API について (GET編)](https://qiita.com/RyBB/items/08cf511f1dbce6cf76bf) ← 本記事|
> |4|[kintone REST API について (POST編)](https://qiita.com/RyBB/items/94c13ca56887558bb227)|

今回はREST APIを使って、kintoneのデータを **取得** する方法について説明します！

# レコードを1件取得

とりあえず、一番使うであろう レコード1件 を取得する方法について説明します。

## 共通項目

レコード1件を取得するための共通項目 (共通項目については[こちら](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)) は、

* URI
  * **https://(サブドメイン名).cybozu.com/k/v1/record.json**
* メソッド
  * **GET**
* ヘッダー
  * **APIトークン認証**
* リクエストパラメータ
  * **アプリID： 100**
  * **レコードID： 1**

となります。

## 実装

### コマンドライン （curlコマンド）で実行

コマンドラインからレコードを1件取得する場合は、以下のコマンドとなります。

```bash
# Windows(PowerShell)の場合
curl.exe -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1' -H 'X-Cybozu-API-Token: YOUR_TOKEN' 

# Mac(ターミナル)の場合
curl -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1' -H 'X-Cybozu-API-Token: YOUR_TOKEN' 
```

### JavaScript (Node.js) で実行

Node.jsでレコード1件取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestモジュールを利用しています。

```javascript
const request = require('request');

let params = {
  url: 'https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1',
  method: 'GET',
  json: true,
  headers: {
    'X-Cybozu-API-Token': 'YOUR_TOKEN',
  },
};

request(params, function(err, resp, body) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(body);
});
```

### Python で実行

Pythonでレコード1件取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestsモジュールを利用しています。

```python
#!/usr/bin/python
# _*_ coding: utf-8 _*_

import requests

URL = "https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1"
API_TOKEN = "YOUR_TOKEN"

def get_kintone(url, api_token):
    """kintoneのレコードを1件取得する関数"""
    headers = {"X-Cybozu-API-Token": api_token}
    resp = requests.get(url, headers=headers)

    return resp

if __name__ == "__main__":
    RESP = get_kintone(URL, API_TOKEN)

    print(RESP.text)

```

### Go で実行

Goでレコード1件取得する場合は、以下のコードとなります。

```go
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("X-Cybozu-API-Token", "YOUR_TOKEN")

  client := new(http.Client)
  resp, _ := client.Do(req)

  defer resp.Body.Close()

  response, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(response))
}
```

### PHPで実行

PHPでレコード1件取得する場合は、以下のコードとなります。

```php
<?php

$url = 'https://(サブドメイン名).cybozu.com/k/v1/record.json?app=100&id=1';
$headers = [
  'X-Cybozu-API-Token: YOUR_TOKEN'
];

// 初期化
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);
echo $response;

curl_close($curl);
```

## レスポンス

取得したレコード情報がJSON形式でごそっと返ってきます。
これをパースして `record.text.value` とかすれば値が取得できます！

```json
{
  "record": {
    "レコード番号": {
      "type": "RECORD_NUMBER",
      "value": "1"
    },
    "更新者": {
      "type": "MODIFIER",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "作成者": {
      "type": "CREATOR",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "text": {
      "type": "SINGLE_LINE_TEXT",
      "value": "サンプルデータです"
    },
    "$revision": {
      "type": "__REVISION__",
      "value": "1"
    },
    "更新日時": {
      "type": "UPDATED_TIME",
      "value": "2018-10-18T04:08:00Z"
    },
    "作成日時": {
      "type": "CREATED_TIME",
      "value": "2018-10-18T04:08:00Z"
    },
    "$id": {
      "type": "__ID__",
      "value": "1"
    }
  }
}
```

# レコードを全件取得

何も考えずレコードを全件を取得する方法について説明します。

## 共通項目

レコード全件を取得するための共通項目 (共通項目については[こちら](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)) は、

* URI
  * **https://(サブドメイン名).cybozu.com/k/v1/records.json**
  * ※ record"s" と複数形になります。
* メソッド
  * **GET**
* ヘッダー
  * **APIトークン認証**
* リクエストパラメータ
  * **アプリID： 100**

となります。

## 実装

### コマンドライン （curlコマンド）で実行

コマンドラインからレコードを全件取得する場合は、以下のコマンドとなります。

```bash
# Windows(PowerShell)の場合
curl.exe -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100' -H 'X-Cybozu-API-Token: YOUR_TOKEN'

# Mac(ターミナル)の場合
curl -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100' -H 'X-Cybozu-API-Token: YOUR_TOKEN'
```

### JavaScript (Node.js) で実行

Node.jsでレコード全件取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestモジュールを利用しています。

```javascript
const request = require('request');

let params = {
  url: 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100',
  method: 'GET',
  json: true,
  headers: {
    'X-Cybozu-API-Token': 'YOUR_TOKEN',
  },
};

request(params, function(err, resp, body) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(body);
});
```

### Python で実行

Pythonでレコード全件取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestsモジュールを利用しています。

```python
#!/usr/bin/python
# _*_ coding: utf-8 _*_

import requests

URL = "https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100"
API_TOKEN = "YOUR_TOKEN"

def get_kintone(url, api_token):
    """kintoneのレコードを全件取得する関数"""
    headers = {"X-Cybozu-API-Token": api_token}
    resp = requests.get(url, headers=headers)

    return resp

if __name__ == "__main__":
    RESP = get_kintone(URL, API_TOKEN)

    print(RESP.text)

```

### Go で実行

Goでレコード全件取得する場合は、以下のコードとなります。

```go
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("X-Cybozu-API-Token", "YOUR_TOKEN")

  client := new(http.Client)
  resp, _ := client.Do(req)

  defer resp.Body.Close()

  response, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(response))
}
```

### PHPで実行

PHPでレコード全件取得する場合は、以下のコードとなります。

```php
<?php

$url = 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100';
$headers = [
  'X-Cybozu-API-Token: YOUR_TOKEN'
];

// 初期化
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);
echo $response;

curl_close($curl);
```

## レスポンス

500件まで同時に取得できます。
1件取得と異なるのは `records[]` となり配列で返って来ている点です

このあとにif文で分岐をしても良いですが、
取得時にqueryを追記することで取得するデータを絞り込むこともできます (下記参照)

```json
{
  "records": [{
    "レコード番号": {
      "type": "RECORD_NUMBER",
      "value": "1"
    },
    "更新者": {
      "type": "MODIFIER",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "作成者": {
      "type": "CREATOR",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "text": {
      "type": "SINGLE_LINE_TEXT",
      "value": "サンプルデータ1です"
    },
    "$revision": {
      "type": "__REVISION__",
      "value": "1"
    },
    "更新日時": {
      "type": "UPDATED_TIME",
      "value": "2018-10-18T04:08:00Z"
    },
    "作成日時": {
      "type": "CREATED_TIME",
      "value": "2018-10-18T04:08:00Z"
    },
    "$id": {
      "type": "__ID__",
      "value": "1"
    }
  },
  {
    "レコード番号": {
      "type": "RECORD_NUMBER",
      "value": "2"
    },
    "更新者": {
      "type": "MODIFIER",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "作成者": {
      "type": "CREATOR",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "text": {
      "type": "SINGLE_LINE_TEXT",
      "value": "サンプルデータ2です"
    },
    "$revision": {
      "type": "__REVISION__",
      "value": "1"
    },
    "更新日時": {
      "type": "UPDATED_TIME",
      "value": "2018-10-19T04:08:00Z"
    },
    "作成日時": {
      "type": "CREATED_TIME",
      "value": "2018-10-19T04:08:00Z"
    },
    "$id": {
      "type": "__ID__",
      "value": "2"
    }
  },
  {
    "レコード番号": {
      "type": "RECORD_NUMBER",
      "value": "3"
    },
    "更新者": {
      "type": "MODIFIER",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "作成者": {
      "type": "CREATOR",
      "value": {
        "code": "bb",
        "name": "BB"
      }
    },
    "text": {
      "type": "SINGLE_LINE_TEXT",
      "value": "サンプルデータ3です"
    },
    "$revision": {
      "type": "__REVISION__",
      "value": "1"
    },
    "更新日時": {
      "type": "UPDATED_TIME",
      "value": "2018-11-19T04:08:00Z"
    },
    "作成日時": {
      "type": "CREATED_TIME",
      "value": "2018-11-19T04:08:00Z"
    },
    "$id": {
      "type": "__ID__",
      "value": "3"
    }
  }]
}
```

# レコードを条件付きで複数件取得

全件ではなく絞り込みをして複数件取得する方法について説明します。

## 共通項目

レコードを条件付きで複数件取得するための共通項目 (共通項目については[こちら](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)) は、

* URI
  * **https://(サブドメイン名).cybozu.com/k/v1/records.json**
  * ※ record"s" と複数形になります。
* メソッド
  * **GET**
* ヘッダー
  * **APIトークン認証**
* リクエストパラメータ
  * **アプリID： 100**
* クエリ
  * **query: XXXX**

となります。最後のクエリが大事です！

## クエリ

取得するレコードの条件を「文字列」で記述します。
詳しい書き方は [こちら](https://developer.cybozu.io/hc/ja/articles/202331474#step2) をご覧ください。

URLにURLエンコードして追記して利用します。

```
// 【条件】文字列１行(フィールドコード：text) が 「Cybozu」のレコードのみ
query: 'text = "Cybozu"'
URLエンコード: query=text%20%3D%20%22Cybozu%22

// 【条件】文字列１行(フィールドコード：text) に 「Cybozu」か「kintone」が含まれるレコードのみ
query: 'text like "Cybozu" or text like "kintone"'
URLエンコード: query=text%20like%20%22Cybozu%22%20or%20text%20like%20%22kintone%22

// 【条件】作成日時(フィールドコード：create_time)が今日(取得API実行時)のレコードのみ
query: 'create_time = TODAY()'
URLエンコード: query=create_time%20%3D%20TODAY()
```

## 実装

### コマンドライン （curlコマンド）で実行

コマンドラインでレコードを条件付き取得する場合は、以下のコマンドとなります。

```bash
# Windows(PowerShell)の場合
curl.exe -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100&query=text%20%3D%20%22Cybozu%22' \
-H 'X-Cybozu-API-Token: YOUR_TOKEN'

# Mac(ターミナル)の場合
curl -X 'GET' 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100&query=text%20%3D%20%22Cybozu%22' \
-H 'X-Cybozu-API-Token: YOUR_TOKEN'
```

### JavaScript (Node.js) で実行

Node.jsでレコードを条件付き取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestモジュールを利用しています。

```javascript
const request = require('request');

let params = {
  url: 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100&query=text%20%3D%20%22Cybozu%22',
  method: 'GET',
  json: true,
  headers: {
    'X-Cybozu-API-Token': 'YOUR_TOKEN',
  },
};

request(params, function(err, resp, body) {
  if (err) {
    console.log(err);
    return;
  }
  console.log(body);
});
```

### Python で実行

Pythonでレコードを条件付き取得する場合は、以下のコードとなります。
※ RESTAPIのリクエストに requestsモジュールを利用しています。

```python
#!/usr/bin/python
# _*_ coding: utf-8 _*_

import requests

URL = "https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100&query=text%20%3D%20%22Cybozu%22"
API_TOKEN = "YOUR_TOKEN"

def get_kintone(url, api_token):
    """kintoneのレコードを全件取得する関数"""
    headers = {"X-Cybozu-API-Token": api_token}
    resp = requests.get(url, headers=headers)

    return resp

if __name__ == "__main__":
    RESP = get_kintone(URL, API_TOKEN)

    print(RESP.text)

```

### Go で実行

Goでレコードを条件付き取得する場合は、以下のコードとなります。

```go
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://(サブドメイン名).cybozu.com/k/v1/records.json?app=100&query=text%20%3D%20%22Cybozu%22"
  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Set("X-Cybozu-API-Token", "YOUR_TOKEN")

  client := new(http.Client)
  resp, _ := client.Do(req)

  defer resp.Body.Close()

  response, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(string(response))
}
```

### PHPで実行

PHPでレコードを条件付き取得する場合は、以下のコードとなります。

```php
<?php

$url = 'https://(サブドメイン名).cybozu.com/k/v1/records.json?app=&query=text%20%3D%20%22Cybozu%22';
$headers = [
  'X-Cybozu-API-Token: YOUR_TOKEN'
];

// 初期化
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);
echo $response;

curl_close($curl);
```

## レスポンス

全件取得と同じ形です。
該当するレコードがなかったら〇〇、1件なら××、2件以上なら△△ と処理を分岐させる場合はqueryで絞り込むと良いです！

# おわりに

kintone REST API のGET処理を4種類の方法で試してみました。
前回の [共通事項編](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759) と合わせて読むと良いです！

次は kintoneにデータを登録する部分を説明します！

連載記事一覧

||タイトル|
|------------------|--------------------------------------|
|0|[kintone環境の取得方法 (開発者ライセンス)](https://qiita.com/RyBB/items/73c50f1751ad137ba410)|
|1|[kintoneの使い方 (データベース編)](https://qiita.com/RyBB/items/daabb9b60d804ee2242f)|
|2|[kintone REST API について (共通事項編)](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)|
|3|[kintone REST API について (GET編)](https://qiita.com/RyBB/items/08cf511f1dbce6cf76bf) ← 本記事|
|4|[kintone REST API について (POST編)](https://qiita.com/RyBB/items/94c13ca56887558bb227)|

それでは！≧(+･` ཀ･´)≦