ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
PHP から API を呼ぶ 3 つの方法
| 方式 | 長所 | 短所 |
|---|---|---|
cURL(curl_*) | 柔軟、高速、ヘッダや SSL を細かく制御 | コードがやや冗長 |
| file_get_contents + コンテキスト | 1 行で書ける | POST / ヘッダがやや書きにくい、allow_url_fopen 必要 |
| Guzzle(HTTP クライアントライブラリ) | API がモダン、非同期 / リトライ / ミドルウェア対応 | Composer 必須 |
方法 1: cURL で GET
$apiUrl = 'https://api.example.com/users/1';
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $apiUrl,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true, // 結果を文字列で返す
CURLOPT_TIMEOUT => 10, // タイムアウト 10 秒
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_FOLLOWLOCATION => true, // リダイレクト追従
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer ' . $token,
],
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$err = curl_error($curl);
curl_close($curl);
if ($response === false) {
throw new RuntimeException('cURL error: ' . $err);
}
if ($status >= 400) {
throw new RuntimeException("HTTP $status: $response");
}
$data = json_decode($response, true);
print_r($data);
方法 2: cURL で POST(JSON ボディ)
$apiUrl = 'https://api.example.com/users';
$payload = json_encode([
'name' => '山田太郎',
'email' => 'taro@example.com',
], JSON_UNESCAPED_UNICODE);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $apiUrl,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
'Content-Length: ' . strlen($payload),
],
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
方法 3: cURL で PUT / DELETE
// PUT
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
// DELETE
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
方法 4: file_get_contents で簡易呼び出し
// GET
$response = file_get_contents('https://api.example.com/items');
$data = json_decode($response, true);
// POST(ストリームコンテキスト)
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n" .
"Accept: application/json\r\n",
'content' => json_encode(['name' => 'apple']),
'timeout' => 10,
'ignore_errors' => true, // 4xx / 5xx でも本文を取得
],
];
$ctx = stream_context_create($options);
$response = file_get_contents('https://api.example.com/items', false, $ctx);
// レスポンスヘッダは $http_response_header に自動で入る
print_r($http_response_header);
注意: file_get_contents での URL 取得は allow_url_fopen=On が必要です。本番サーバではセキュリティ上オフにする運用もあるため、その場合は cURL を使います。
方法 5: Guzzle(推奨・モダン)
composer require guzzlehttp/guzzleuse GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client([
'base_uri' => 'https://api.example.com/',
'timeout' => 10,
'headers' => [
'Authorization' => 'Bearer ' . $token,
'Accept' => 'application/json',
],
]);
try {
// GET
$res = $client->get('users/1');
$user = json_decode($res->getBody(), true);
// POST (json オプションが自動エンコード)
$res = $client->post('users', [
'json' => ['name' => '山田', 'email' => 'taro@example.com'],
]);
// クエリパラメータ
$res = $client->get('users', [
'query' => ['page' => 2, 'limit' => 20],
]);
} catch (RequestException $e) {
error_log('API error: ' . $e->getMessage());
if ($e->hasResponse()) {
error_log('Body: ' . $e->getResponse()->getBody());
}
}
クエリパラメータの組み立て
$params = ['q' => 'PHP cURL', 'lang' => 'ja', 'page' => 2];
$url = 'https://api.example.com/search?' . http_build_query($params);
// → https://api.example.com/search?q=PHP+cURL&lang=ja&page=2
SSL 証明書の扱い(重要)
古いサンプルでよくある CURLOPT_SSL_VERIFYPEER = false は本番投入禁止です。中間者攻撃(MITM)に対し丸腰になります。社内自己署名 CA を使う場合は明示的に CA バンドルを指定します。
// 正しい指定(公的 CA バンドル)
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, '/etc/ssl/certs/ca-certificates.crt');
// 自己署名 CA を使うケースのみ
curl_setopt($curl, CURLOPT_CAINFO, '/path/to/internal-ca.pem');
タイムアウトとリトライ
| オプション | 意味 | 推奨値 |
|---|---|---|
CURLOPT_CONNECTTIMEOUT | 接続確立までの上限 | 3〜5 秒 |
CURLOPT_TIMEOUT | 処理全体の上限 | 10〜30 秒 |
5xx / ネットワークエラー時のリトライは指数バックオフで 2〜3 回が目安。POST 系の非冪等なリクエストはリトライしない(同じ処理が二重実行される)。
ステータスコード別の処理
switch (true) {
case $status >= 200 && $status < 300:
// 成功
break;
case $status === 401 || $status === 403:
throw new AuthException('認証エラー');
case $status === 404:
throw new NotFoundException('リソース無し');
case $status === 429:
// レート制限 → Retry-After に従って待機
break;
case $status >= 500:
throw new ServerException('サーバ側エラー');
default:
throw new ApiException("Unexpected $status");
}
セキュリティのチェックリスト
- API キー / トークンは環境変数(
.env)に置き、コードに直書きしない SSL_VERIFYPEERはtrueのまま- レスポンスをそのままユーザーに出力する場合はエスケープ必須
- 外部 URL を動的に組み立てる場合は SSRF 対策(プライベート IP への接続禁止など)
- ログにトークンを出さない
関連
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- インストール方法
- 文法
- Composerのインストール
- 内部関数
- フレームワーク
- エラー一覧
- 改行出力
- printとechoの違い
- シングルクォートとダブルクォートの違い
- returnとyieldの違い
- var_dumpをログ出力
- CSV読み込み
- 待機・処理の遅延
- ログファイルにエラーを出力する方法
- エラーログ出力関数
- URLパラメータの配列化
- empty, is_null. issetの判定比較表
- httpステータスコードの付与
- バージョンの確認
- php.ini
- APIを呼び出す方法
- 外部ファイルを呼び出す方法
- カンマ区切りの文字列を配列に変換
- 配列からランダムに値を取り出す方法
- Webスクレイピング
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?