
はじめに
Laravelからkintone REST APIへアクセスし、kintoneアプリに登録されているレコードを取得する方法を紹介します。
今回は、LaravelのHTTPクライアントを使用してkintoneからレコードを取得し、取得結果をReactの画面に表示します。
Reactからkintone REST APIへ直接アクセスすると、ブラウザのCORS制限によってリクエストが失敗することがあります。
そのため、次の流れでデータを取得します。
React => Laravel => kintone REST API
Laravelを経由することで、CORSの問題を回避できるだけでなく、kintoneのAPIトークンをブラウザ側へ公開せずに済みます。
前提
本記事では、次の環境を前提とします。
- Laravelがインストールされている
- Laravel内で、ReactとInertia.jsを使用している
- kintoneアプリを作成済みである
- kintoneアプリのAPIトークンを取得済みである
- APIトークンに「レコード閲覧」権限が設定されている
kintoneのAPIトークンは、対象アプリの設定画面から発行します。
APIトークンを発行した後は、必ずアプリの設定を更新してください。設定を保存しただけでアプリを更新していない場合、APIトークンが利用できないことがあります。
Laravelからkintoneへアクセスする流れ
Laravelからkintoneのレコードを取得するため、次のファイルを設定します。
app/Http/Controllers/KintoneController.php
config/services.php
.env
routes/web.php
Reactコンポーネント
今回は、kintone REST APIの「1件のレコードを取得するAPI」を使用します。
リクエスト先は次のURLです。
https://サブドメイン.cybozu.com/k/v1/record.json
LaravelのControllerを作成する
最初に、Laravelからkintone REST APIへアクセスするControllerを作成します。
次のコマンドを実行してください。
php artisan make:controller KintoneController
Laravel Sailを使用している場合は、次のコマンドを実行します。
./vendor/bin/sail artisan make:controller KintoneController
作成されたapp/Http/Controllers/KintoneController.phpを、次のように編集します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Http;
class KintoneController extends Controller
{
public function show(int $id): JsonResponse
{
$response = Http::withHeaders([
'X-Cybozu-API-Token' => config('services.kintone.api_token'),
])->get(
config('services.kintone.base_url') . '/k/v1/record.json',
[
'app' => config('services.kintone.app_id'),
'id' => $id,
]
);
if ($response->failed()) {
return response()->json([
'message' => 'kintoneからのデータ取得に失敗しました。',
'error' => $response->json(),
], $response->status());
}
return response()->json($response->json());
}
}
このControllerでは、LaravelのHttpファサードを使用してkintone REST APIへGETリクエストを送信しています。
APIトークンは、HTTPリクエストヘッダーのX-Cybozu-API-Tokenに設定します。
Http::withHeaders([ 'X-Cybozu-API-Token' => config('services.kintone.api_token'), ])
取得対象のkintoneアプリIDとレコードIDは、クエリパラメータとして送信します。
[ 'app' => config('services.kintone.app_id'), 'id' => $id, ]
Laravelの環境ファイルの更新
Laravelの.envファイルを設定する
kintoneの接続情報は、Laravelの.envファイルに設定します。
KINTONE_BASE_URL=https://your_sub_domain.cybozu.com
KINTONE_APP_ID=14
KINTONE_API_TOKEN=YOUR_TOKEN
| 環境変数 | 設定内容 |
| KINTONE_BASE_URL | kintone環境のURL |
| KINTONE_APP_ID | データを取得するアプリID |
| KINTONE_API_TOKEN | kintoneで発行したAPIトークン |
config/services.phpを設定する
次に、config/services.phpへkintoneの設定を追加します。
return [
// 既存設定
'kintone' => [
'base_url' => env('KINTONE_BASE_URL'),
'app_id' => env('KINTONE_APP_ID'),
'api_token' => env('KINTONE_API_TOKEN'),
],
];
Controllerからは、次のように設定値を取得できます。
config('services.kintone.base_url');
config('services.kintone.app_id');
config('services.kintone.api_token');
Controller内で直接env()を使用するのではなく、config/services.phpを経由する形にしておくと、Laravelの設定キャッシュにも対応しやすくなります。
Laravelの設定キャッシュを削除する
php artisan config:clear
Sail環境ならば、次のように実行します。
./vendor/bin/sail artisan config:clear
必要に応じて、アプリケーション全体のキャッシュも削除できます。
php artisan optimize:clear
Sail環境では、次のように実行します。
./vender/bin/sail artisan optimize:clear
routes/web.phpにルーティング設定する
Laravel内でInertia.jsとReactを使用している場合は、routes/web.phpにルーティングを追加できます。
Route::get('/api/kintone/records/{id}', [
KintoneController::class,
'show'
]);
これにより、次のURLへアクセスすると、Laravelからkintoneのレコードを取得できます。
http://localhost/api/kintone/records/1
URL末尾の1は、kintoneのレコードIDです。
/api/kintone/records/{id}
例えば、レコードIDが10の場合は次のURLになります。
/api/kintone/records/10
ReactからLaravelへリクエストする
Reactからは、kintone REST APIへ直接アクセスせず、Laravelに作成したエンドポイントへアクセスします。
import { useState } from 'react';
export default function KintoneRecord() {
const [record, setRecord] = useState(null);
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const fetchRecord = async () => {
setLoading(true);
setError('');
try {
const response = await fetch('/api/kintone/records/1', {
method: 'GET',
headers: {
Accept: 'application/json',
},
});
const data = await response.json();
if (!response.ok) {
throw new Error(
data.message || 'レコードの取得に失敗しました。'
);
}
setRecord(data.record);
} catch (error) {
console.error(error);
setError(error.message);
} finally {
setLoading(false);
}
};
return (
<div>
<button
type="button"
onClick={fetchRecord}
disabled={loading}
>
{loading ? '取得中...' : 'レコードを取得'}
</button>
{error && <p>{error}</p>}
{record && (
<pre>{JSON.stringify(record, null, 2)}</pre>
)}
</div>
);
}
「レコードを取得」ボタンを押すと、ReactからLaravelへリクエストが送信されます。
Laravelはkintone REST APIへアクセスし、取得したデータをJSON形式でReactへ返します。
kintoneから取得したレコードの表示結果
正常にデータを取得できると、次のようなJSONが表示されます。
{
"レコード番号": {
"type": "RECORD_NUMBER",
"value": "1"
},
"更新者": {
"type": "MODIFIER",
"value": {
"code": "your_mail_address",
"name": "name"
}
},
"作成者": {
"type": "CREATOR",
"value": {
"code": "your_mail_address",
"name": "name"
}
},
"文字列__1行_": {
"type": "SINGLE_LINE_TEXT",
"value": "P-202606-0001"
},
"顧客": {
"type": "SINGLE_LINE_TEXT",
"value": ""
},
"ドロップダウン": {
"type": "DROP_DOWN",
"value": "見積中"
},
"組織選択": {
"type": "ORGANIZATION_SELECT",
"value": []
},
"$revision": {
"type": "__REVISION__",
"value": "1"
},
"文字列__1行__0": {
"type": "SINGLE_LINE_TEXT",
"value": "システム開発プロジェクト"
},
"数値_0": {
"type": "NUMBER",
"value": "0"
},
"更新日時": {
"type": "UPDATED_TIME",
"value": "2026-06-12T06:02:00Z"
},
"文字列__複数行__0": {
"type": "MULTI_LINE_TEXT",
"value": "要件定義中"
},
"文字列__複数行_": {
"type": "MULTI_LINE_TEXT",
"value": "在庫管理システムの構築"
},
"数値": {
"type": "NUMBER",
"value": "5000000"
},
"日付_1": {
"type": "DATE",
"value": "2026-10-31"
},
"日付_0": {
"type": "DATE",
"value": "2026-08-15"
},
"作成日時": {
"type": "CREATED_TIME",
"value": "2026-06-12T06:02:00Z"
},
"ユーザー選択_0": {
"type": "USER_SELECT",
"value": []
},
"日付": {
"type": "DATE",
"value": "2026-06-01"
},
"$id": {
"type": "__ID__",
"value": "1"
}
}
kintone REST APIから返される各フィールドには、主にtypeとvalueが含まれています。
{ "type": "SINGLE_LINE_TEXT", "value": "システム開発プロジェクト" }
実際に画面へ値だけを表示する場合は、フィールドのvalueを指定します。
<p>
プロジェクト名: {record['文字列__1行__0']?.value}
</p>
ただし、kintone APIを利用する際は、フィールド名ではなくフィールドコードを使用します。
そのため、kintoneアプリを作成するときは、次のような分かりやすいフィールドコードを設定しておくことをおすすめします。
つまづきやすい点
Reactからkintoneへ直接アクセスするとCORSエラーになる
Reactからkintone REST APIへ直接リクエストすると、次のようなCORSエラーが発生することがあります。
Access to fetch has been blocked by CORS policy
これは、ブラウザが異なるオリジンへのアクセスを制限しているためです。
Axiosへ変更しても、ブラウザのCORS制限そのものは回避できません。
fetchからAxiosへ変更する
だけでは解決しないため、今回のようにLaravelを経由してkintoneへアクセスします。
React → Laravel → kintone
APIトークンをReactへ記載しない
次のように、ReactのソースコードへAPIトークンを直接記載してはいけません。
const token = 'YOUR_KINTONE_API_TOKEN';
Reactのコードはブラウザへ配信されるため、開発者ツールなどからAPIトークンを確認できてしまいます。
APIトークンはLaravelの.envに保存し、サーバー側だけで使用します。
APIトークンの権限を確認する
レコードを取得する場合、APIトークンに「レコード閲覧」の権限が必要です。
権限が不足していると、kintoneからエラーが返されます。
APIトークンの設定後は、次の点を確認してください。
- 「レコード閲覧」にチェックが入っている
- APIトークンを保存している
- kintoneアプリの設定を更新している
- 正しいアプリIDを指定している
.envの変更が反映されない
.envを変更しても値が反映されない場合は、設定キャッシュが残っている可能性があります。
php artisan config:clear
または、次のコマンドを実行します。
php artisan optimize:clear
Sail環境の場合は、コマンドの先頭に./vendor/bin/sailを付けてください。
./vendor/bin/sail artisan optimize:clear
kintoneのフィールド名が分かりにくい
kintoneでフィールドコードを変更せずにアプリを作成すると、次のようなコードになることがあります。
文字列__1行__0
文字列__複数行__0
数値_0
日付_1
この状態でもデータは取得できますが、LaravelやReactから扱う際に、どのフィールドなのか分かりにくくなります。
開発を進める前に、kintone側でフィールドコードを整理しておくと管理しやすくなります。
kintoneの日時はUTCで返される
kintoneの作成日時や更新日時は、次のようなUTC形式で返されることがあります。
2026-06-12T06:02:00Z
日本時間として表示する場合は、ReactやLaravel側でタイムゾーンを変換する必要があります。
Reactでは、例えば次のように表示できます。
const formattedDate = new Date(
record['更新日時'].value
).toLocaleString('ja-JP', {
timeZone: 'Asia/Tokyo',
});
セキュリティ上の注意点
kintone REST APIをLaravelから利用する場合は、次の点に注意してください。
- APIトークンをReactへ渡さない
- APIトークンをGitHubへ登録しない
- .envを公開しない
- APIトークンには必要最小限の権限だけを付ける
- Laravel側のエラーメッセージに機密情報を含めない
- 外部公開するAPIには認証やアクセス制限を設定する
- レコードIDなどの入力値を検証する
今回のサンプルでは、説明を分かりやすくするため、kintoneから返されたエラー内容をそのままJSONで返しています。
'error' => $response->json(),
本番環境では、詳細なエラー内容を利用者へ表示せず、Laravelのログへ記録する方法も検討してください。
if ($response->failed()) {
logger()->error('kintone API error', [
'status' => $response->status(),
'response' => $response->json(),
]);
return response()->json([
'message' =>
'kintoneからのデータ取得に失敗しました。',
], 500);
}
おわりに
今回は、Laravelからkintone REST APIへアクセスし、kintoneアプリのレコードを取得してReactに表示する方法を紹介しました。
Reactからkintoneへ直接アクセスすると、CORSエラーが発生する場合があります。また、React側へAPIトークンを記載すると、トークンがブラウザ上に公開されてしまいます。
そのため、次の構成でアクセスする方法が安全です。
React
↓
Laravel
↓
kintone REST API
Laravelをkintone APIとの中継地点にすることで、次のメリットがあります。
- ブラウザのCORS問題を回避できる
- kintoneのAPIトークンを非公開にできる
- Laravel側で認証や入力値検証を実装できる
- エラーログやアクセス制御を一元管理できる
- 取得したkintoneデータを加工してReactへ返せる
今回は1件のレコードを取得しましたが、同じ仕組みを応用することで、複数レコードの取得、レコードの登録、更新、削除などもLaravelから実行できます。
Laravelとkintoneを連携する場合は、APIトークンの管理とアクセス権限に注意しながら、サーバー側からkintone REST APIを呼び出す構成をおすすめします。
