Because We Love Happy Coding

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

本当にあった kintone REST API の Bad Request

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

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

Requirements

権限が間違っている

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

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

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

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

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

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

セキュアアクセスで、APIトークンを使おうとしている

セキュアアクセスを設定している場合、APIトークンでの認証はエラーになります。

kintone REST APIの共通仕様 – cybozu developer network

リクエストヘッダ関連

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

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

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

など。

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

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

値の設定が間違っている

重複不可に抵触している

重複不可のIDフィールドなどがある場合に、重複する値を指定するとBadRequestになる

updateKeyに指定しているフィールドが重複不可になっていない

updateKeyを使ってPUTして更新する場合、updateKeyに指定するフィールドは「重複不可」設定になっていなければならない。BadRequestになる。

必須の値が不足している

必須の値がないデータを登録しようとしている。

特にラジオボタンは常に必須になるので忘れがち。

値のタイプが違っている

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

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

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

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

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

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

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

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

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

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

存在しないiレコードdをGETしようとしている

kintoneのデータをappIdidで取得しようとしているが、実在しないレコードIDを指定してしまうと、404エラーが戻る。

idが連番なのでなんとなく何を指定してもいいかと適当に指定したら、idは欠番になるんだった。うっかりしていた。

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

リクエストで投げるデータはこんな感じでいいみたい。PHPでテーブルのデータを配列で作って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の認証設定について