GitHubで学ぶREST API実践
GitHubのREST APIを題材に、VS Code拡張のThunder Clientとfetchの両アプローチでAPIを扱う基礎をまとめました。認証(PAT)の扱い、代表的なエンドポイント、トラブルシューティングまで一気に押さえます。
この記事で学べること
- Thunder Clientの導入と基本操作
- 読み取りAPI(非認証)と認証APIの違い
- Personal Access Token(PAT)の発行と安全な使い方
- GitHub APIをThunder Clientとfetchで叩く実例
Thunder Clientとは(導入と基本操作)
Thunder Clientは、VS Code上で動作する軽量なRESTクライアントです。APIの試行錯誤やリクエスト保存が簡単にできます。
インストール
- VS Codeを開き、拡張機能ビューを開く
- "Thunder Client" を検索してインストール
- マーケットプレイス: https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client
Thunder Client の基本的な使い方
リクエストの作成と編集
- HTTPメソッドの選択
- 右側のペインで
[GET]をクリックし、POSTやPUTなどのメソッドを選択可能です。
- 右側のペインで
- URLの入力
Enter URLフィールドに対象APIのURLを入力します。- 例:
https://www.thunderclient.com/welcome
- クエリパラメータの指定
Queryタブで、HTTPクエリパラメータを編集します。- 例:
?parameter1=value1¶meter2=value2の形式で記述。
- ヘッダーの編集
HeadersタブでHTTPリクエストヘッダーを指定します。- 必要に応じて
AuthorizationヘッダーやContent-Typeを設定。
- リクエストの送信
- 編集が終わったら、右上の
Sendボタンをクリックしてリクエストを発行します。
- 編集が終わったら、右上の
リクエストの保存
- 左側のペインで
Activityタブを選択し、履歴を確認可能。 - リクエストを保存したい場合は
...ボタンをクリックし、Save to Collectionを選択。
GitHub APIの基本(非認証と認証)
非認証でできること(読み取り)
公開情報(ユーザーや公開リポジトリなど)はトークンなしで取得できます。ただしレート制限が厳しめです(未認証はおおむね1時間に60リクエスト程度)。
const res = await fetch("https://api.github.com/users/octocat");
const data = await res.json();
console.log(data.login, data.public_repos);
認証(PAT)
- GitHub PAT発行ページ にアクセス。
Generate new tokenをクリック。- トークンの名前を指定し、必要な権限(例:
user)にチェックを入れる。 - トークンを生成し、表示された値をメモします。(※ 生成したトークンは安全に保管(環境変数など)。フロントエンドに埋め込まないこと。)
- 参考: GitHubトークンの作成ガイド
Thunder ClientでGitHub APIを叩く
- URL:
https://api.github.com/users/{username}(例:octocat) - 認証が必要なAPI(例:
/user)は、HeadersにAuthorization: token <PAT>(またはAuthorization: Bearer <PAT>)を設定
レスポンス例:
{
"login": "octocat",
"id": 583231,
"public_repos": 8
}
fetchでGitHub APIを叩く(サーバー側推奨)
トークンは環境変数で管理し、サーバー側から呼び出すのが原則です。
// 自分のユーザー情報を取得(認証が必要)
const token = process.env.GITHUB_TOKEN as string;
const res = await fetch("https://api.github.com/user", {
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/vnd.github+json",
},
});
const me = await res.json();
代表的なエンドポイント:
- ユーザー情報: GET
/users/{username}(公開)/ GET/user(認証) - リポジトリ一覧: GET
/users/{username}/repos - Issue作成: POST
/repos/{owner}/{repo}/issues
// Issue作成(サーバー側で実行)
await fetch("https://api.github.com/repos/OWNER/REPO/issues", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
Accept: "application/vnd.github+json",
"Content-Type": "application/json",
},
body: JSON.stringify({ title: "バグ報告", body: "再現手順..." }),
});
トラブルシューティング
- 401/403: 認証情報不足。
Authorizationヘッダー、トークンスコープ、レート制限を確認 - 422 Unprocessable Entity: 入力不足・不正。必須パラメータやJSONの形を見直す
- レート制限: 未認証は特に制限が厳しい。認証+適切なヘッダーを付与
演習
- 非認証で
/users/octocatを取得し、public_reposを表示 - PATを作成し、認証付きで
/userを叩いて自分の情報を取得 - (発展)サーバー側で自分のリポジトリにIssueを1件作成
- (応用)Thunder Clientで別の公開API(例: OpenWeather)を叩いてレスポンスを観察
OpenWeatherの例:
- URL:
http://api.openweathermap.org/data/2.5/weather - Query:
?q=London&appid={API_KEY}
参考リンク
- GitHub REST API v3: https://docs.github.com/ja/rest
- 認証: https://docs.github.com/ja/rest/overview/authenticating-to-the-rest-api
- Thunder Client: https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client