Because We Love Happy Coding

フリーライターからエンジニアへ。発信力だけあり余ってる感じ

kintone REST APIで登録しようとしてエラーBadRequestが出る

400など、いくつかのエラーを乗り越えたので、覚え書き。

Requirements

権限が間違っている

APIトークンでルックアップを変更しようとしている

ルックアップは別アプリを参照するため、そちらの権限も必要になる。APIトークンはアプリ単位でしか権限を持たないため、不足。

ルックアップフィールドの登録更新で、APIトークンが使えないのはアプリ単位の発行でアプリ内の操作しか権限指定できないためです。ルックアップにはコピー元の閲覧権限とコピー先の登録or更新権限が必要なため、これらの権限を有するユーザーによるパスワード認証が必要となります。
REST APIでルックアップキーフィールドの登録をしたい

パスワード認証を追加する。パスワード認証はこんな感じ。

"X-Cybozu-Authorization: " . base64_encode(‘your_login_name:your_password’)

PHP Tips : kintone REST APIの認証設定について

リクエストヘッダ関連

methodのGET、POST、PUTを間違えている

それぞれ役割が異なるので注意。

  • GET レコードの取得
  • POST レコードの追加
  • PUT レコードの更新

など。

値の取得にContent-typeを指定してしまっている。

GETで値を取得する時には、Content-type:application/json を指定しているとエラーになる模様。

値の設定が間違っている

値のタイプが違っている

数値に文字列を入れようとしている、など。

厳密な型認識をしているわけではないので、数値に"0"を入れるくらいなら許容してくれる模様。

一度ECCUBE3で、getOrderDate()の戻り値をそのまま受注日付に放り込んだら、PHPのDATETIME型だったことがあった。道理でkintoneが受け付けないわけだ。

この場合はformat('Y-m-d')などを使って、kintoneが認識できる日付に変換してやる。

$order->getOrderDate()->format('Y-m-d');

ドロップダウンの値にない値を設定しようとしている

ドロップダウンの値にない値は受け付けない。

ルックアップ先のアプリにない値を登録しようとしている

REST APIを使ってルックアップフィールドの更新を行う時のコツ! | kintoneを便利に使う方法を紹介するブログ

ルックアップフィールドの参照先を替えてから、ということらしい。 つまり別テーブルを変更→ルックアップフィールドを書き込む、という順番らしい。 値をコピーしている(リレーショナルではない)んだから、そこで整合をとらなくても……という気もするけどまあそういう仕様なら仕様がない。

データの構造が間違っている

リクエストで投げるデータはこんな感じでいいみたい。テーブルのデータを配列で作ってjson_encodeしているサンプルがなかなかなかったので。

$request_record = array(
  "app" => $appId,
  "record" => array(
    "フィールドコード1"=>array("value"=>"hoge"),
    "フィールドコード2"=>array("value"=>"fuga"),
    "テーブルのフィールドコード"=>array(
      "value"=>array(
        "0"=>array(//テーブル1行目
          "value"=>array(
            "列のフィールドコード1"=>array("value"=>"foo"),
            "列のフィールドコード2"=>array("value"=>"bar"),
            "列のフィールドコード3"=>array("value"=>999),
          )
        )
      )
    )
    ),
  );

テーブルが入ると構造が面倒。

参考記事

REST APIを使ってルックアップフィールドの更新を行う時のコツ! | kintoneを便利に使う方法を紹介するブログ

[REST APIでルックアップキーフィールドの登録をしたい]

PHP Tips : kintone REST APIの認証設定について