ホームページ >ウェブフロントエンド >jsチュートリアル >HTTP: すべての Web 開発者が習得しなければならないプロトコル
Web アプリケーションを構築していますが、API 統合に苦労していますか? HTTP を理解することは現代の Web 開発の基礎ですが、見落とされがちです。このガイドは、あなたをカジュアルな API ユーザーから自信を持った HTTP エキスパートに変えます。
Web 開発にとって HTTP が重要な理由
前提条件
コアコンセプト
HTTP メソッドの詳細
高度なトピック
キャッシュ戦略
エラー処理パターン
レート制限
CORS 構成
RESTful API の構築
認証の実装
ファイルのアップロードの処理
パフォーマンスの最適化
推奨ツール
追加資料
コミュニティリソース
Web でのあらゆるやり取りは、その基盤として HTTP に依存しています。 HTTP を理解することは、単に API 呼び出しを行うことではなく、拡張性のある堅牢で安全でパフォーマンスの高い Web アプリケーションを構築することです。
HTTP (ハイパーテキスト転送プロトコル) は、Web 通信のバックボーンを形成します。このガイドでは、実践的な例を通じてその中心となるメソッドを説明します。
キャッシュ戦略: 適切な HTTP 実装により、効果的なキャッシュが可能になり、サーバーの負荷が軽減され、応答時間が改善されます
接続管理: HTTP/2 およびキープアライブ接続を理解すると、ネットワーク リソースの使用量を最適化できます
ペイロードの最適化: HTTP メソッドとヘッダーを正しく使用することで、不必要なデータ転送を最小限に抑えます
負荷分散: HTTP の知識により、サーバー間でトラフィックをより適切に分散できます
認証メカニズム: HTTP はさまざまな認証スキーム (Basic、Bearer、OAuth) を提供します
CORS セキュリティ: クロスオリジン リソース共有を理解することで不正アクセスを防止します
データ保護: HTTPS 暗号化により、転送中の機密情報を保護します
入力検証: 適切なリクエスト検証により、インジェクション攻撃やデータ侵害を防止します
API 設計: HTTP の専門知識により、直感的な RESTful API の作成が可能
デバッグ スキル: HTTP を理解すると、通信の問題を迅速に特定して解決するのに役立ちます
システム アーキテクチャ: HTTP の知識はアーキテクチャ上の決定に影響します
チームのコラボレーション: HTTP を共通に理解することで開発者のコミュニケーションが向上します
ステートレス プロトコル: 各リクエスト/応答サイクルは独立しています
クライアントサーバーモデル: フロントエンドとバックエンド間の懸念事項の明確な分離
リソースベース: URL はリソースを識別して検索します
メソッドベース: 異なる操作に対する異なるメソッド (動詞)
メソッド (GET、POST など)
URL
ヘッダー
本文 (該当する場合)
リクエストを検証します
操作を実行します
応答を準備します
ステータスコード
ヘッダー
本文 (該当する場合)
Authorization: Bearer token123 Content-Type: application/json Accept: application/json Cache-Control: no-cache
{ "request": { "data": "Example request payload" }, "response": { "data": "Example response payload" } }
API キー
実装:
// Middleware example const authenticate = async (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ error: 'Authentication required' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } };
HTTP メソッドに入る前に、次のことを確認してください。
技術要件:
必要な知識:
一般的な実装:
Authorization: Bearer token123 Content-Type: application/json Accept: application/json Cache-Control: no-cache
{ "request": { "data": "Example request payload" }, "response": { "data": "Example response payload" } }
GET リクエストは、サーバーの状態を変更せずにデータを取得します。それらは次のようになります:
冪等
キャッシュ可能
安全
// Middleware example const authenticate = async (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ error: 'Authentication required' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } };
// Success Codes 200 OK // Successful GET 201 Created // Successful POST 204 No Content // Successful DELETE // Client Error Codes 400 Bad Request // Invalid syntax 401 Unauthorized // Authentication required 404 Not Found // Resource doesn't exist // Server Error Codes 500 Internal Error // Server-side error
POST は新しいリソースを作成します。
冪等であってはなりません
新しいリソースを作成します
成功した場合は 201 を返します
graph LR Client-->|GET /products|Server Server-->|200 + Products|Client
// GET /products/:id // Purpose: Retrieve single product // Security: Validate ID format // Error handling: 404 if not found app.get("/products/:id", async (req, res) => { try { const product = await Product.findById(req.params.id); if (!product) { return res.status(404).json({ error: "Product not found" }); } res.json(product); } catch (error) { handleError(error, res); } });
PUT はリソース全体を置き換えます。それは次のようになります:
冪等
リソース全体を置き換えます
存在しない場合は作成
graph LR Client-->|POST /products|Server Server-->|201 Created|Client
app.post("/products", async (req, res) => { try { // Validation const { name, price } = req.body; if (!name || !price) { return res.status(400).json({ error: "Missing required fields" }); } // Create resource const product = new Product(req.body); await product.save(); // Return created resource res.status(201).json({ message: "Product created", product }); } catch (error) { handleError(error, res); } });
PATCH はリソースを部分的に更新します。それは次のとおりです:
べき等である
特定のフィールドを更新します
部分的な更新を検証します
graph LR Client-->|PUT /products/123|Server Server-->|200 OK|Client
app.put("/products/:id", async (req, res) => { try { const product = await Product.findByIdAndUpdate( req.params.id, req.body, { new: true, overwrite: true } ); if (!product) { return res.status(404).json({ error: "Product not found" }); } res.json(product); } catch (error) { handleError(error, res); } });
DELETE はリソースを削除します。それは次のとおりです:
べき等である
成功した場合は 204 を返します
不足しているリソースを適切に処理します
graph LR Client-->|PATCH /products/123|Server Server-->|200 OK|Client
app.patch("/products/:id", async (req, res) => { try { // Validate allowed updates const updates = Object.keys(req.body); const allowedUpdates = ['name', 'price', 'description']; const isValidOperation = updates.every(update => allowedUpdates.includes(update) ); if (!isValidOperation) { return res.status(400).json({ error: "Invalid updates" }); } const product = await Product.findByIdAndUpdate( req.params.id, req.body, { new: true, runValidators: true } ); if (!product) { return res.status(404).json({ error: "Product not found" }); } res.json(product); } catch (error) { handleError(error, res); } });
graph LR Client-->|DELETE /products/123|Server Server-->|204 No Content|Client
app.delete("/products/:id", async (req, res) => { try { const product = await Product.findByIdAndDelete(req.params.id); if (!product) { return res.status(404).json({ error: "Product not found" }); } res.status(204).send(); } catch (error) { handleError(error, res); } });
// Setting cache headers app.get('/static-content', (req, res) => { res.set({ 'Cache-Control': 'public, max-age=86400', 'ETag': 'W/"123-abc"' }); res.send(content); });
const Redis = require('redis'); const redis = Redis.createClient(); // Cache middleware const cacheMiddleware = async (req, res, next) => { const key = `cache:${req.originalUrl}`; const cached = await redis.get(key); if (cached) { return res.json(JSON.parse(cached)); } res.sendResponse = res.json; res.json = async (body) => { await redis.setEx(key, 3600, JSON.stringify(body)); res.sendResponse(body); }; next(); };
次の要件を満たすユーザー管理用の完全な CRUD API を作成します。
ユーザー登録と認証
プロファイル管理
ロールベースのアクセス制御
入力検証
エラー処理
Authorization: Bearer token123 Content-Type: application/json Accept: application/json Cache-Control: no-cache
以下を使用して JWT ベースの認証を実装します。
トークン生成
リフレッシュトークン
パスワードリセット機能
アカウントのアクティベーション
{ "request": { "data": "Example request payload" }, "response": { "data": "Example response payload" } }
次のファイル アップロード システムを実装します。
複数のファイルのアップロード
ファイルタイプの検証
サイズ制限
進捗状況の追跡
// Middleware example const authenticate = async (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; if (!token) { return res.status(401).json({ error: 'Authentication required' }); } try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (error) { res.status(401).json({ error: 'Invalid token' }); } };
次の方法で既存の API を最適化します。
応答圧縮
フィールドフィルタリング
ページネーション
データキャッシュ
クエリの最適化
// Success Codes 200 OK // Successful GET 201 Created // Successful POST 204 No Content // Successful DELETE // Client Error Codes 400 Bad Request // Invalid syntax 401 Unauthorized // Authentication required 404 Not Found // Resource doesn't exist // Server Error Codes 500 Internal Error // Server-side error
郵便配達員
不眠症
Thunder クライアント (VS コード)
モーガン
デバッグ
ニューレリック
データドッグ
Swagger/OpenAPI
API ブループリント
郵便配達員のドキュメント
HTTP/1.1 仕様 (RFC 7230-7235)
HTTP/2 仕様 (RFC 7540)
REST API 設計のベスト プラクティス
「RESTful Web API」Leonard Richardson 著
『Web API 設計ハンドブック』Brian Mulloy 著
「HTTP: 決定版ガイド」David Gourley 著
MDN Web ドキュメント - HTTP
freeCodeCamp - API とマイクロサービス
Pluralsight - REST の基礎
スタック オーバーフロー - [api] タグ
Reddit - r/webdev、r/nodejs
開発者 - #api、#webdev
Express.js
高速化
NestJS
Microsoft REST API ガイドライン
Google API 設計ガイド
Heraku プラットフォーム API ガイドライン
最新情報を入手してください:
API 設計ブログ
テックカンファレンストーク
Web 開発ポッドキャスト
以上がHTTP: すべての Web 開発者が習得しなければならないプロトコルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。