Hoppscotch
GitHub概要
hoppscotch/hoppscotch
Open source API development ecosystem - https://hoppscotch.io (open-source alternative to Postman, Insomnia)
トピックス
スター履歴
API開発ツール
Hoppscotch
概要
Hoppscotch(ホップスコッチ)は、ブラウザベースの軽量APIクライアントです。PWA(Progressive Web App)対応により、インストール不要でブラウザから直接利用でき、オフライン機能やデスクトップアプリとしての利用も可能です。シンプルで美しいUIと高速性能、豊富な機能を兼ね備え、現代のAPI開発エコシステムに最適化されています。
詳細
Hoppscotchは、API開発における開発者体験を向上させるために設計された軽量なブラウザベースツールです。PWA技術を活用することで、従来のデスクトップアプリケーションの利便性とWebアプリケーションのアクセシビリティを両立しています。サービスワーカーによる即座のロード、オフラインサポート、低リソース消費が特徴で、どこからでも快適にAPI開発が行えます。REST APIはもちろん、GraphQL、WebSocket、Server-Sent Events、Socket.IO、MQTTなど、現代のAPI開発で必要なプロトコルを包括的にサポートしています。認証機能では、Basic、Bearer Token、OAuth 2.0、OIDC Access Token/PKCEなど幅広い認証方式に対応し、企業環境での利用も想定されています。チーム機能では、ワークスペース共有、リアルタイム同期、ロールベースのアクセス制御を提供し、GitHub、Google、Microsoft、SSOでのサインインにより、設定やコレクションをデバイス間で同期できます。10以上の言語とフレームワークでのコードスニペット生成、cURLインポート、プロキシモード、多言語対応(i18n)など、実用的な機能も充実しています。
メリット・デメリット
メリット
- インストール不要: ブラウザから直接アクセス、即座に利用開始
- PWA対応: オフライン利用、デスクトップアプリ化、高速ロード
- 軽量高速: ミニマルなUIで低リソース消費、高いパフォーマンス
- 豊富なプロトコル: REST、GraphQL、WebSocket、MQTT等に対応
- クロスプラットフォーム: ブラウザがあればどこでも利用可能
- チーム協働: リアルタイム同期とワークスペース共有
- オープンソース: MIT ライセンスで無料利用可能
- 多言語対応: 国際化対応で日本語も利用可能
- 豊富な認証: OAuth 2.0、OIDC、Bearerトークンなど対応
デメリット
- ブラウザ依存: ブラウザの制約を受ける場合がある
- 機能制限: デスクトップアプリと比較して一部機能が制限
- ネットワーク要件: 初回アクセス時にはインターネット接続が必要
- カスタマイズ限界: ブラウザ環境での拡張性に限界
- 企業機能: エンタープライズ向け機能はまだ発展途上
参考ページ
- Hoppscotch公式サイト
- GitHub - hoppscotch/hoppscotch
- Hoppscotch Documentation
- Hoppscotch Cloud
- Hoppscotch Desktop Apps
書き方の例
基本的なHTTPリクエスト
# URLフィールドでの設定
GET https://api.example.com/users/{{userId}}
# Headers設定
Authorization: Bearer {{accessToken}}
Content-Type: application/json
Accept: application/json
# Params設定(URLパラメータ)
page: 1
limit: 10
sort: created_at
# 環境変数の利用
baseUrl: https://api.example.com
accessToken: your-jwt-token-here
userId: 12345
POSTリクエストとBody設定
// Body (JSON)
{
"name": "田中太郎",
"email": "[email protected]",
"age": 30,
"department": "engineering",
"skills": ["JavaScript", "Python", "React"],
"active": true
}
// Headers
Content-Type: application/json
Authorization: Bearer {{accessToken}}
X-API-Version: v2
// Pre-request Script
const timestamp = Date.now();
pw.env.set("requestTimestamp", timestamp);
pw.env.set("requestId", Math.random().toString(36).substr(2, 9));
GraphQLクエリとミューテーション
# GraphQL Query
query GetUserProfile($userId: ID!) {
user(id: $userId) {
id
name
email
profile {
avatar
bio
location
}
posts(first: 5) {
edges {
node {
id
title
content
createdAt
}
}
}
}
}
# Variables
{
"userId": "{{currentUserId}}"
}
# Headers
Authorization: Bearer {{graphqlToken}}
Content-Type: application/json
# GraphQL Mutation
mutation CreatePost($input: CreatePostInput!) {
createPost(input: $input) {
id
title
content
author {
name
}
}
}
WebSocketリアルタイム通信
// WebSocket接続URL
wss://api.example.com/websocket
// 接続時のHeaders
Authorization: Bearer {{wsToken}}
Sec-WebSocket-Protocol: chat
// 送信メッセージ例
{
"type": "message",
"channel": "general",
"content": "Hello WebSocket!",
"timestamp": "{{requestTimestamp}}"
}
// サブスクリプション
{
"type": "subscribe",
"channels": ["notifications", "chat"],
"user_id": "{{userId}}"
}
// イベントリスナー
{
"type": "join_room",
"room_id": "room123",
"user_info": {
"name": "{{userName}}",
"role": "participant"
}
}
環境変数と設定管理
// 環境変数設定例(Development)
{
"baseUrl": "https://api-dev.example.com",
"accessToken": "dev-token-here",
"graphqlEndpoint": "https://api-dev.example.com/graphql",
"wsEndpoint": "wss://api-dev.example.com/websocket",
"apiVersion": "v1",
"debug": true
}
// Production環境
{
"baseUrl": "https://api.example.com",
"accessToken": "prod-token-here",
"graphqlEndpoint": "https://api.example.com/graphql",
"wsEndpoint": "wss://api.example.com/websocket",
"apiVersion": "v2",
"debug": false
}
// Local環境
{
"baseUrl": "http://localhost:3000",
"accessToken": "local-dev-token",
"graphqlEndpoint": "http://localhost:3000/graphql",
"wsEndpoint": "ws://localhost:3000/websocket",
"apiVersion": "v1",
"debug": true
}
プリ・ポストリクエストスクリプト
// Pre-request Script
// 現在時刻を設定
pw.env.set("timestamp", Date.now());
// ランダムIDを生成
pw.env.set("requestId", Math.random().toString(36).substr(2, 9));
// 認証トークンの自動更新
const tokenExpiry = pw.env.get("tokenExpiry");
if (!tokenExpiry || Date.now() > parseInt(tokenExpiry)) {
// トークン更新ロジック
console.log("Token refresh needed");
}
// Post-response Script
// レスポンス検証
pw.test("Status code is 200", () => {
pw.expect(pw.response.status).toBe(200);
});
pw.test("Response has required fields", () => {
const body = pw.response.body;
pw.expect(body).toHaveProperty("id");
pw.expect(body).toHaveProperty("name");
pw.expect(body.email).toMatch(/@/);
});
// 次のリクエストで使用する値を保存
if (pw.response.body.id) {
pw.env.set("lastCreatedId", pw.response.body.id);
}
// レスポンス時間のチェック
pw.test("Response time is acceptable", () => {
pw.expect(pw.response.responseTime).toBeLessThan(1000);
});
チーム共有とコレクション管理
// コレクション構造例
Collection: "User Management API"
├── Authentication
│ ├── Login
│ ├── Refresh Token
│ └── Logout
├── User Operations
│ ├── Get Users
│ ├── Create User
│ ├── Update User
│ └── Delete User
└── Admin Functions
├── Get Analytics
└── System Health
// ワークスペース設定
{
"name": "Development Team",
"members": [
{"email": "[email protected]", "role": "editor"},
{"email": "[email protected]", "role": "viewer"},
{"email": "[email protected]", "role": "admin"}
],
"collections": ["User Management API", "Payment API"],
"environments": ["development", "staging", "production"]
}