kintone REST API について (POST編)

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

---

# はじめに

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

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

> ||タイトル|
> |---|---|
> |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行フィールド (フィールドコード：text) でやります。

## 共通項目

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

* URI
    * **https://(サブドメイン名).cybozu.com/k/v1/record.json**
* メソッド
    * **POST**
* ヘッダー
    * **APIトークン認証** (APIトークン発行時に「レコード追加」にチェックをしてください)
    * **Content-Type: applicatioin/json**
* リクエストパラメータ
    * **アプリID： 100**
    * ~~**レコードID： 1**~~  (POSTの場合は必要ありません)
    * <font color="red">**レコード情報**</font> ※初登場！(↓で説明します)

となります。

### レコード情報

POST (PUT) の場合、**どんなレコード情報** で登録(更新)するのか指定する必要があります！
今回であれば「textというフィールドにどんな文字列を入れたいか」です。

それを record オブジェクトで指定します。kintone独自の書き方になるのでぜひ覚えてください！！

```javascript
//  一般的な書き方
let obj = {
  'record': {
    'フィールドコード': {
      'value': '(挿入したい値)'
    }
  }
};

// 今回の例だと
let obj = {
  'record': {
    'text': {
      'value': 'sample text'
    }
  }
};
```

こんな形で書きます。
ドロップダウンやチェックボックスなど選択肢系のやつは、
valueの値をフィールドの選択肢にある値にしないとエラーになるのでご注意ください！

## 実装

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

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

```bash
# Windows(PowerShell)の場合
curl.exe -X 'POST' "https://(サブドメイン名).cybozu.com/k/v1/record.json" `
-H 'X-Cybozu-API-Token: YOUR_TOKEN' `
-H 'Content-Type: application/json' `
-d '{"app":100,"record":{"text":{"value":"sample text"}}}'

# Mac(ターミナル)の場合
curl -X 'POST' 'https://(サブドメイン名).cybozu.com/k/v1/record.json' \
-H 'X-Cybozu-API-Token: YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"app":100,"record":{"text":{"value":"sample text"}}}'
```

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

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

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

let obj = {
  'app': 100,
  'record': {
    'text': {
      'value': 'sample text'
    }
  }
};

let params = {
  url: 'https://(サブドメイン名).cybozu.com/k/v1/record.json',
  method: 'POST',
  json: true,
  headers: {
    'X-Cybozu-API-Token': 'YOUR_TOKEN',
    'Content-Type': 'application/json',
  },
  body: obj,
};

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"
PARAMS = {
  "app": 100,
  "record": {
    "text": {
      "value": "sample text"
    }
  }
}
API_TOKEN = "YOUR TOKEN"

def post_kintone(url, api_token, params):
    """kintoneにレコードを1件登録する関数"""
    headers = {"X-Cybozu-API-Token": api_token, "Content-Type" : "application/json"}
    resp = requests.post(url, json=params, headers=headers)

    return resp

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

    print(RESP.text)
```

### Go で実行

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

```go
package main

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

func main() {
  APPID := "100"
  url := "https://(サブドメイン名).cybozu.com/k/v1/record.json"
  jsonStr := `{"app":` + APPID + `, "record": {"text": {"value": "sample text"}}}`
  req, _ := http.NewRequest(
    "POST",
    url,
    bytes.NewBuffer([]byte(jsonStr)),
  )
  req.Header.Set("X-Cybozu-API-Token", "YOUR_TOKEN")
  req.Header.Set("Content-Type", "application/json")

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

  defer resp.Body.Close()

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

### PHPで実行

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

```php5
<?php

$url = 'https://(サブドメイン名).cybozu.com/k/v1/record.json';
$headers = [
  'X-Cybozu-API-Token: YOUR TOKEN',
  'Content-Type: application/json'
];

$body = [
  'app' => 100,
  'record' => [
    'text' => [
      'value' => 'sample text'
    ]
  ]
];

// JSONに変換
$json = json_encode($body);

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

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);

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

curl_close($curl);
```

## レスポンス

レスポンスは非常にシンプルで

```javascript

{"id":"2", "revision":"1"}
```

と返ってきます。
idは登録したレコードID (今回だとレコードID：2として登録している)、
revisionは更新履歴のようなものです。

# レコード複数件を登録

レコードを複数件登録する方法について説明します。
文字列1行フィールド (フィールドコード：text) でやります。

## 共通項目

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

* URI
    * **https://(サブドメイン名).cybozu.com/k/v1/records.json**
* メソッド
    * **POST**
* ヘッダー
    * **APIトークン認証** (APIトークン発行時に「レコード追加」にチェックをしてください)
    * **Content-Type: applicatioin/json**
* リクエストパラメータ
    * **アプリID： 100**
    * **レコード情報**

となります。

### レコード情報

登録したいレコードが複数件ある場合は recordss として配列で指定します。
詳しい書き方は [こちら](https://developer.cybozu.io/hc/ja/articles/202166160#step2) をご覧ください。

```javascript
let obj = {
  'records': [{
    'text': {
      'value': 'sample text1'
    }
  },
  {
    'text': {
      'value': 'sample text2'
    }
  },
  {
    'text': {
      'value': 'sample text3'
    }
  }]
};
```
それぞれバラバラにレコード情報を記述できるので、
2つ目だけさらに別フィールドも、とかも可能です。

```javascript
let obj = {
  'records': [{
    'text': {
      'value': 'sample text1'
    }
  },
  {
    'text': {
      'value': 'sample text2'
    },
    'text2': {
      'value': 'sample text2-1'
    }
  },
  {
    'text': {
      'value': 'sample text3'
    }
  }]
};
```

## 実装

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

コマンドラインからレコードを複数件登録する場合は、以下のコマンドとなります。

```bash
# Windows(PowerShell)の場合
curl.exe -X 'POST' "https://(サブドメイン名).cybozu.com/k/v1/records.json" `
-H 'X-Cybozu-API-Token: YOUR_TOKEN' `
-H 'Content-Type: application/json' `
-d '{"app":100,"records":[{"text":{"value":"sample text"}},{"text":{"value":"sample text2"}}]}'

# Mac(ターミナル)の場合
curl -X 'POST' 'https://(サブドメイン名).cybozu.com/k/v1/records.json' \
-H {'X-Cybozu-API-Token: YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"app":100,"records":[{"text":{"value":"sample text"}},{"text":{"value":"sample text2"}}]}'
```

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

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

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

let obj = {
  'app': 100,
  'records': [{
    'text': {
      'value': 'sample text1'
    }
  },
  {
    'text': {
      'value': 'sample text2'
    }
  }]
};

let params = {
  url: 'https://(サブドメイン名).cybozu.com/k/v1/records.json',
  method: 'POST',
  json: true,
  headers: {
    'X-Cybozu-API-Token': 'YOUR_TOKEN',
    'Content-Type': 'application/json',
  },
  body: obj,
};

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"
PARAMS = {
  "app": 100,
  "records": [{
    "text": {
      "value": "sample text1"
    }
  },
  {
    "text": {
      "value": "sample text2"
    }
  }]
}
API_TOKEN = "YOUR TOKEN"

def post_kintone(url, api_token, params):
    """kintoneにレコードを複数件登録する関数"""
    headers = {"X-Cybozu-API-Token": api_token, "Content-Type" : "application/json"}
    resp = requests.post(url, json=params, headers=headers)

    return resp

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

    print(RESP.text)
```

### Go で実行

Goでレコードを複数件登録する場合は、以下のコードとなります。

```go
package main

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

func main() {
  APPID := "100"
  url := "https://(サブドメイン名).cybozu.com/k/v1/records.json"
  jsonStr := `{"app":` + APPID + `, "records": [{"text": {"value": "sample text"}}, {"text": {"value": "sample text2"}}]}`
  req, _ := http.NewRequest(
    "POST",
    url,
    bytes.NewBuffer([]byte(jsonStr)),
  )
  req.Header.Set("X-Cybozu-API-Token", "YOUR_TOKEN")
  req.Header.Set("Content-Type", "application/json")

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

  defer resp.Body.Close()

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

### PHPで実行

PHPでレコードを複数件登録する場合は、以下のコードとなります。

```php5
<?php

$url = 'https://(サブドメイン名).cybozu.com/k/v1/records.json';
$headers = [
  'X-Cybozu-API-Token: YOUR TOKEN',
  'Content-Type: application/json'
];

$body = [
  'app' => 100,
  'records' => [
    'text' => [
      'value' => 'sample text'
    ],
    'text' => [
      'value' => 'sample text2'
    ]
  ]
];

// JSONに変換
$json = json_encode($body);

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

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json);

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

curl_close($curl);
```

## レスポンス

レスポンスは非常にシンプルで

```javascript
{"ids":["1", "2"], "revisions":["1", "1"]}
```

とそれぞれ配列で返ってきます。

# おわりに

kintone REST API のPOST処理を4種類の方法で試してみました。
前回の [共通事項編](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759) 、[GET編](https://qiita.com/RyBB/items/08cf511f1dbce6cf76bf#javascript-nodejs-%E3%81%A7%E5%AE%9F%E8%A1%8C)と合わせて読むとより良いかもです！

とりあえず、4部構成が全て終わりました！

連載記事一覧

||タイトル|
|------------------|--------------------------------------|
|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) ← 本記事|

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