tapps-agents 3.5.40__py3-none-any.whl → 3.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tapps_agents/__init__.py +2 -2
- tapps_agents/agents/__init__.py +22 -22
- tapps_agents/agents/analyst/__init__.py +5 -5
- tapps_agents/agents/architect/__init__.py +5 -5
- tapps_agents/agents/architect/agent.py +1033 -1033
- tapps_agents/agents/architect/pattern_detector.py +75 -75
- tapps_agents/agents/cleanup/__init__.py +7 -7
- tapps_agents/agents/cleanup/agent.py +445 -445
- tapps_agents/agents/debugger/__init__.py +7 -7
- tapps_agents/agents/debugger/agent.py +310 -310
- tapps_agents/agents/debugger/error_analyzer.py +437 -437
- tapps_agents/agents/designer/__init__.py +5 -5
- tapps_agents/agents/designer/agent.py +786 -786
- tapps_agents/agents/designer/visual_designer.py +638 -638
- tapps_agents/agents/documenter/__init__.py +7 -7
- tapps_agents/agents/documenter/agent.py +531 -531
- tapps_agents/agents/documenter/doc_generator.py +472 -472
- tapps_agents/agents/documenter/doc_validator.py +393 -393
- tapps_agents/agents/documenter/framework_doc_updater.py +493 -493
- tapps_agents/agents/enhancer/__init__.py +7 -7
- tapps_agents/agents/evaluator/__init__.py +7 -7
- tapps_agents/agents/evaluator/agent.py +443 -443
- tapps_agents/agents/evaluator/priority_evaluator.py +641 -641
- tapps_agents/agents/evaluator/quality_analyzer.py +147 -147
- tapps_agents/agents/evaluator/report_generator.py +344 -344
- tapps_agents/agents/evaluator/usage_analyzer.py +192 -192
- tapps_agents/agents/evaluator/workflow_analyzer.py +189 -189
- tapps_agents/agents/implementer/__init__.py +7 -7
- tapps_agents/agents/implementer/agent.py +798 -798
- tapps_agents/agents/implementer/auto_fix.py +1119 -1119
- tapps_agents/agents/implementer/code_generator.py +73 -73
- tapps_agents/agents/improver/__init__.py +1 -1
- tapps_agents/agents/improver/agent.py +753 -753
- tapps_agents/agents/ops/__init__.py +1 -1
- tapps_agents/agents/ops/agent.py +619 -619
- tapps_agents/agents/ops/dependency_analyzer.py +600 -600
- tapps_agents/agents/orchestrator/__init__.py +5 -5
- tapps_agents/agents/orchestrator/agent.py +522 -522
- tapps_agents/agents/planner/__init__.py +7 -7
- tapps_agents/agents/planner/agent.py +1127 -1127
- tapps_agents/agents/reviewer/__init__.py +24 -24
- tapps_agents/agents/reviewer/agent.py +3513 -3513
- tapps_agents/agents/reviewer/aggregator.py +213 -213
- tapps_agents/agents/reviewer/batch_review.py +448 -448
- tapps_agents/agents/reviewer/cache.py +443 -443
- tapps_agents/agents/reviewer/context7_enhancer.py +630 -630
- tapps_agents/agents/reviewer/context_detector.py +203 -203
- tapps_agents/agents/reviewer/docker_compose_validator.py +158 -158
- tapps_agents/agents/reviewer/dockerfile_validator.py +176 -176
- tapps_agents/agents/reviewer/error_handling.py +126 -126
- tapps_agents/agents/reviewer/feedback_generator.py +490 -490
- tapps_agents/agents/reviewer/influxdb_validator.py +316 -316
- tapps_agents/agents/reviewer/issue_tracking.py +169 -169
- tapps_agents/agents/reviewer/library_detector.py +295 -295
- tapps_agents/agents/reviewer/library_patterns.py +268 -268
- tapps_agents/agents/reviewer/maintainability_scorer.py +593 -593
- tapps_agents/agents/reviewer/metric_strategies.py +276 -276
- tapps_agents/agents/reviewer/mqtt_validator.py +160 -160
- tapps_agents/agents/reviewer/output_enhancer.py +105 -105
- tapps_agents/agents/reviewer/pattern_detector.py +241 -241
- tapps_agents/agents/reviewer/performance_scorer.py +357 -357
- tapps_agents/agents/reviewer/phased_review.py +516 -516
- tapps_agents/agents/reviewer/progressive_review.py +435 -435
- tapps_agents/agents/reviewer/react_scorer.py +331 -331
- tapps_agents/agents/reviewer/score_constants.py +228 -228
- tapps_agents/agents/reviewer/score_validator.py +507 -507
- tapps_agents/agents/reviewer/scorer_registry.py +373 -373
- tapps_agents/agents/reviewer/scoring.py +1566 -1566
- tapps_agents/agents/reviewer/service_discovery.py +534 -534
- tapps_agents/agents/reviewer/tools/__init__.py +41 -41
- tapps_agents/agents/reviewer/tools/parallel_executor.py +581 -581
- tapps_agents/agents/reviewer/tools/ruff_grouping.py +250 -250
- tapps_agents/agents/reviewer/tools/scoped_mypy.py +284 -284
- tapps_agents/agents/reviewer/typescript_scorer.py +1142 -1142
- tapps_agents/agents/reviewer/validation.py +208 -208
- tapps_agents/agents/reviewer/websocket_validator.py +132 -132
- tapps_agents/agents/tester/__init__.py +7 -7
- tapps_agents/agents/tester/accessibility_auditor.py +309 -309
- tapps_agents/agents/tester/agent.py +1080 -1080
- tapps_agents/agents/tester/batch_generator.py +54 -54
- tapps_agents/agents/tester/context_learner.py +51 -51
- tapps_agents/agents/tester/coverage_analyzer.py +386 -386
- tapps_agents/agents/tester/coverage_test_generator.py +290 -290
- tapps_agents/agents/tester/debug_enhancer.py +238 -238
- tapps_agents/agents/tester/device_emulator.py +241 -241
- tapps_agents/agents/tester/integration_generator.py +62 -62
- tapps_agents/agents/tester/network_recorder.py +300 -300
- tapps_agents/agents/tester/performance_monitor.py +320 -320
- tapps_agents/agents/tester/test_fixer.py +316 -316
- tapps_agents/agents/tester/test_generator.py +632 -632
- tapps_agents/agents/tester/trace_manager.py +234 -234
- tapps_agents/agents/tester/visual_regression.py +291 -291
- tapps_agents/analysis/pattern_detector.py +36 -36
- tapps_agents/beads/hydration.py +213 -213
- tapps_agents/beads/parse.py +32 -32
- tapps_agents/beads/specs.py +206 -206
- tapps_agents/cli/__init__.py +9 -9
- tapps_agents/cli/__main__.py +8 -8
- tapps_agents/cli/base.py +478 -478
- tapps_agents/cli/command_classifier.py +72 -72
- tapps_agents/cli/commands/__init__.py +2 -2
- tapps_agents/cli/commands/analyst.py +173 -173
- tapps_agents/cli/commands/architect.py +109 -109
- tapps_agents/cli/commands/cleanup_agent.py +92 -92
- tapps_agents/cli/commands/common.py +126 -126
- tapps_agents/cli/commands/debugger.py +90 -90
- tapps_agents/cli/commands/designer.py +112 -112
- tapps_agents/cli/commands/documenter.py +136 -136
- tapps_agents/cli/commands/enhancer.py +110 -110
- tapps_agents/cli/commands/evaluator.py +255 -255
- tapps_agents/cli/commands/health.py +665 -665
- tapps_agents/cli/commands/implementer.py +301 -301
- tapps_agents/cli/commands/improver.py +91 -91
- tapps_agents/cli/commands/knowledge.py +111 -111
- tapps_agents/cli/commands/learning.py +172 -172
- tapps_agents/cli/commands/observability.py +283 -283
- tapps_agents/cli/commands/ops.py +135 -135
- tapps_agents/cli/commands/orchestrator.py +116 -116
- tapps_agents/cli/commands/planner.py +237 -237
- tapps_agents/cli/commands/reviewer.py +1872 -1872
- tapps_agents/cli/commands/status.py +285 -285
- tapps_agents/cli/commands/task.py +227 -219
- tapps_agents/cli/commands/tester.py +191 -191
- tapps_agents/cli/commands/top_level.py +3586 -3586
- tapps_agents/cli/feedback.py +936 -936
- tapps_agents/cli/formatters.py +608 -608
- tapps_agents/cli/help/__init__.py +7 -7
- tapps_agents/cli/help/static_help.py +425 -425
- tapps_agents/cli/network_detection.py +110 -110
- tapps_agents/cli/output_compactor.py +274 -274
- tapps_agents/cli/parsers/__init__.py +2 -2
- tapps_agents/cli/parsers/analyst.py +186 -186
- tapps_agents/cli/parsers/architect.py +167 -167
- tapps_agents/cli/parsers/cleanup_agent.py +228 -228
- tapps_agents/cli/parsers/debugger.py +116 -116
- tapps_agents/cli/parsers/designer.py +182 -182
- tapps_agents/cli/parsers/documenter.py +134 -134
- tapps_agents/cli/parsers/enhancer.py +113 -113
- tapps_agents/cli/parsers/evaluator.py +213 -213
- tapps_agents/cli/parsers/implementer.py +168 -168
- tapps_agents/cli/parsers/improver.py +132 -132
- tapps_agents/cli/parsers/ops.py +159 -159
- tapps_agents/cli/parsers/orchestrator.py +98 -98
- tapps_agents/cli/parsers/planner.py +145 -145
- tapps_agents/cli/parsers/reviewer.py +462 -462
- tapps_agents/cli/parsers/tester.py +124 -124
- tapps_agents/cli/progress_heartbeat.py +254 -254
- tapps_agents/cli/streaming_progress.py +336 -336
- tapps_agents/cli/utils/__init__.py +6 -6
- tapps_agents/cli/utils/agent_lifecycle.py +48 -48
- tapps_agents/cli/utils/error_formatter.py +82 -82
- tapps_agents/cli/utils/error_recovery.py +188 -188
- tapps_agents/cli/utils/output_handler.py +59 -59
- tapps_agents/cli/utils/prompt_enhancer.py +319 -319
- tapps_agents/cli/validators/__init__.py +9 -9
- tapps_agents/cli/validators/command_validator.py +81 -81
- tapps_agents/context7/__init__.py +112 -112
- tapps_agents/context7/agent_integration.py +869 -869
- tapps_agents/context7/analytics.py +382 -382
- tapps_agents/context7/analytics_dashboard.py +299 -299
- tapps_agents/context7/async_cache.py +681 -681
- tapps_agents/context7/backup_client.py +958 -958
- tapps_agents/context7/cache_locking.py +194 -194
- tapps_agents/context7/cache_metadata.py +214 -214
- tapps_agents/context7/cache_prewarm.py +488 -488
- tapps_agents/context7/cache_structure.py +168 -168
- tapps_agents/context7/cache_warming.py +604 -604
- tapps_agents/context7/circuit_breaker.py +376 -376
- tapps_agents/context7/cleanup.py +461 -461
- tapps_agents/context7/commands.py +858 -858
- tapps_agents/context7/credential_validation.py +276 -276
- tapps_agents/context7/cross_reference_resolver.py +168 -168
- tapps_agents/context7/cross_references.py +424 -424
- tapps_agents/context7/doc_manager.py +225 -225
- tapps_agents/context7/fuzzy_matcher.py +369 -369
- tapps_agents/context7/kb_cache.py +404 -404
- tapps_agents/context7/language_detector.py +219 -219
- tapps_agents/context7/library_detector.py +725 -725
- tapps_agents/context7/lookup.py +738 -738
- tapps_agents/context7/metadata.py +258 -258
- tapps_agents/context7/refresh_queue.py +300 -300
- tapps_agents/context7/security.py +373 -373
- tapps_agents/context7/staleness_policies.py +278 -278
- tapps_agents/context7/tiles_integration.py +47 -47
- tapps_agents/continuous_bug_fix/__init__.py +20 -20
- tapps_agents/continuous_bug_fix/bug_finder.py +306 -306
- tapps_agents/continuous_bug_fix/bug_fix_coordinator.py +177 -177
- tapps_agents/continuous_bug_fix/commit_manager.py +178 -178
- tapps_agents/continuous_bug_fix/continuous_bug_fixer.py +322 -322
- tapps_agents/continuous_bug_fix/proactive_bug_finder.py +285 -285
- tapps_agents/core/__init__.py +298 -298
- tapps_agents/core/adaptive_cache_config.py +432 -432
- tapps_agents/core/agent_base.py +647 -647
- tapps_agents/core/agent_cache.py +466 -466
- tapps_agents/core/agent_learning.py +1865 -1865
- tapps_agents/core/analytics_dashboard.py +563 -563
- tapps_agents/core/analytics_enhancements.py +597 -597
- tapps_agents/core/anonymization.py +274 -274
- tapps_agents/core/artifact_context_builder.py +293 -0
- tapps_agents/core/ast_parser.py +228 -228
- tapps_agents/core/async_file_ops.py +402 -402
- tapps_agents/core/best_practice_consultant.py +299 -299
- tapps_agents/core/brownfield_analyzer.py +299 -299
- tapps_agents/core/brownfield_review.py +541 -541
- tapps_agents/core/browser_controller.py +513 -513
- tapps_agents/core/capability_registry.py +418 -418
- tapps_agents/core/change_impact_analyzer.py +190 -190
- tapps_agents/core/checkpoint_manager.py +377 -377
- tapps_agents/core/code_generator.py +329 -329
- tapps_agents/core/code_validator.py +276 -276
- tapps_agents/core/command_registry.py +327 -327
- tapps_agents/core/config.py +33 -0
- tapps_agents/core/context_gathering/__init__.py +2 -2
- tapps_agents/core/context_gathering/repository_explorer.py +28 -28
- tapps_agents/core/context_intelligence/__init__.py +2 -2
- tapps_agents/core/context_intelligence/relevance_scorer.py +24 -24
- tapps_agents/core/context_intelligence/token_budget_manager.py +27 -27
- tapps_agents/core/context_manager.py +240 -240
- tapps_agents/core/cursor_feedback_monitor.py +146 -146
- tapps_agents/core/cursor_verification.py +290 -290
- tapps_agents/core/customization_loader.py +280 -280
- tapps_agents/core/customization_schema.py +260 -260
- tapps_agents/core/customization_template.py +238 -238
- tapps_agents/core/debug_logger.py +124 -124
- tapps_agents/core/design_validator.py +298 -298
- tapps_agents/core/diagram_generator.py +226 -226
- tapps_agents/core/docker_utils.py +232 -232
- tapps_agents/core/document_generator.py +617 -617
- tapps_agents/core/domain_detector.py +30 -30
- tapps_agents/core/error_envelope.py +454 -454
- tapps_agents/core/error_handler.py +270 -270
- tapps_agents/core/estimation_tracker.py +189 -189
- tapps_agents/core/eval_prompt_engine.py +116 -116
- tapps_agents/core/evaluation_base.py +119 -119
- tapps_agents/core/evaluation_models.py +320 -320
- tapps_agents/core/evaluation_orchestrator.py +225 -225
- tapps_agents/core/evaluators/__init__.py +7 -7
- tapps_agents/core/evaluators/architectural_evaluator.py +205 -205
- tapps_agents/core/evaluators/behavioral_evaluator.py +160 -160
- tapps_agents/core/evaluators/performance_profile_evaluator.py +160 -160
- tapps_agents/core/evaluators/security_posture_evaluator.py +148 -148
- tapps_agents/core/evaluators/spec_compliance_evaluator.py +181 -181
- tapps_agents/core/exceptions.py +107 -107
- tapps_agents/core/expert_config_generator.py +293 -293
- tapps_agents/core/export_schema.py +202 -202
- tapps_agents/core/external_feedback_models.py +102 -102
- tapps_agents/core/external_feedback_storage.py +213 -213
- tapps_agents/core/fallback_strategy.py +314 -314
- tapps_agents/core/feedback_analyzer.py +162 -162
- tapps_agents/core/feedback_collector.py +178 -178
- tapps_agents/core/git_operations.py +445 -445
- tapps_agents/core/hardware_profiler.py +151 -151
- tapps_agents/core/instructions.py +324 -324
- tapps_agents/core/io_guardrails.py +69 -69
- tapps_agents/core/issue_manifest.py +249 -249
- tapps_agents/core/issue_schema.py +139 -139
- tapps_agents/core/json_utils.py +128 -128
- tapps_agents/core/knowledge_graph.py +446 -446
- tapps_agents/core/language_detector.py +296 -296
- tapps_agents/core/learning_confidence.py +242 -242
- tapps_agents/core/learning_dashboard.py +246 -246
- tapps_agents/core/learning_decision.py +384 -384
- tapps_agents/core/learning_explainability.py +578 -578
- tapps_agents/core/learning_export.py +287 -287
- tapps_agents/core/learning_integration.py +228 -228
- tapps_agents/core/llm_behavior.py +232 -232
- tapps_agents/core/long_duration_support.py +786 -786
- tapps_agents/core/mcp_setup.py +106 -106
- tapps_agents/core/memory_integration.py +396 -396
- tapps_agents/core/meta_learning.py +666 -666
- tapps_agents/core/module_path_sanitizer.py +199 -199
- tapps_agents/core/multi_agent_orchestrator.py +382 -382
- tapps_agents/core/network_errors.py +125 -125
- tapps_agents/core/nfr_validator.py +336 -336
- tapps_agents/core/offline_mode.py +158 -158
- tapps_agents/core/output_contracts.py +300 -300
- tapps_agents/core/output_formatter.py +300 -300
- tapps_agents/core/path_normalizer.py +174 -174
- tapps_agents/core/path_validator.py +322 -322
- tapps_agents/core/pattern_library.py +250 -250
- tapps_agents/core/performance_benchmark.py +301 -301
- tapps_agents/core/performance_monitor.py +184 -184
- tapps_agents/core/playwright_mcp_controller.py +771 -771
- tapps_agents/core/policy_loader.py +135 -135
- tapps_agents/core/progress.py +166 -166
- tapps_agents/core/project_profile.py +354 -354
- tapps_agents/core/project_type_detector.py +454 -454
- tapps_agents/core/prompt_base.py +223 -223
- tapps_agents/core/prompt_learning/__init__.py +2 -2
- tapps_agents/core/prompt_learning/learning_loop.py +24 -24
- tapps_agents/core/prompt_learning/project_prompt_store.py +25 -25
- tapps_agents/core/prompt_learning/skills_prompt_analyzer.py +35 -35
- tapps_agents/core/prompt_optimization/__init__.py +6 -6
- tapps_agents/core/prompt_optimization/ab_tester.py +114 -114
- tapps_agents/core/prompt_optimization/correlation_analyzer.py +160 -160
- tapps_agents/core/prompt_optimization/progressive_refiner.py +129 -129
- tapps_agents/core/prompt_optimization/prompt_library.py +37 -37
- tapps_agents/core/requirements_evaluator.py +431 -431
- tapps_agents/core/resource_aware_executor.py +449 -449
- tapps_agents/core/resource_monitor.py +343 -343
- tapps_agents/core/resume_handler.py +298 -298
- tapps_agents/core/retry_handler.py +197 -197
- tapps_agents/core/review_checklists.py +479 -479
- tapps_agents/core/role_loader.py +201 -201
- tapps_agents/core/role_template_loader.py +201 -201
- tapps_agents/core/runtime_mode.py +60 -60
- tapps_agents/core/security_scanner.py +342 -342
- tapps_agents/core/skill_agent_registry.py +194 -194
- tapps_agents/core/skill_integration.py +208 -208
- tapps_agents/core/skill_loader.py +492 -492
- tapps_agents/core/skill_template.py +341 -341
- tapps_agents/core/skill_validator.py +478 -478
- tapps_agents/core/stack_analyzer.py +35 -35
- tapps_agents/core/startup.py +174 -174
- tapps_agents/core/storage_manager.py +397 -397
- tapps_agents/core/storage_models.py +166 -166
- tapps_agents/core/story_evaluator.py +410 -410
- tapps_agents/core/subprocess_utils.py +170 -170
- tapps_agents/core/task_duration.py +296 -296
- tapps_agents/core/task_memory.py +582 -582
- tapps_agents/core/task_state.py +226 -226
- tapps_agents/core/tech_stack_priorities.py +208 -208
- tapps_agents/core/temp_directory.py +194 -194
- tapps_agents/core/template_merger.py +600 -600
- tapps_agents/core/template_selector.py +280 -280
- tapps_agents/core/test_generator.py +286 -286
- tapps_agents/core/tiered_context.py +253 -253
- tapps_agents/core/token_monitor.py +345 -345
- tapps_agents/core/traceability.py +254 -254
- tapps_agents/core/trajectory_tracker.py +50 -50
- tapps_agents/core/unicode_safe.py +143 -143
- tapps_agents/core/unified_cache_config.py +170 -170
- tapps_agents/core/unified_state.py +324 -324
- tapps_agents/core/validate_cursor_setup.py +237 -237
- tapps_agents/core/validation_registry.py +136 -136
- tapps_agents/core/validators/__init__.py +4 -4
- tapps_agents/core/validators/python_validator.py +87 -87
- tapps_agents/core/verification_agent.py +90 -90
- tapps_agents/core/visual_feedback.py +644 -644
- tapps_agents/core/workflow_validator.py +197 -197
- tapps_agents/core/worktree.py +367 -367
- tapps_agents/docker/__init__.py +10 -10
- tapps_agents/docker/analyzer.py +186 -186
- tapps_agents/docker/debugger.py +229 -229
- tapps_agents/docker/error_patterns.py +216 -216
- tapps_agents/epic/__init__.py +22 -22
- tapps_agents/epic/beads_sync.py +115 -115
- tapps_agents/epic/markdown_sync.py +105 -105
- tapps_agents/epic/models.py +96 -96
- tapps_agents/experts/__init__.py +163 -163
- tapps_agents/experts/agent_integration.py +243 -243
- tapps_agents/experts/auto_generator.py +331 -331
- tapps_agents/experts/base_expert.py +536 -536
- tapps_agents/experts/builtin_registry.py +261 -261
- tapps_agents/experts/business_metrics.py +565 -565
- tapps_agents/experts/cache.py +266 -266
- tapps_agents/experts/confidence_breakdown.py +306 -306
- tapps_agents/experts/confidence_calculator.py +336 -336
- tapps_agents/experts/confidence_metrics.py +236 -236
- tapps_agents/experts/domain_config.py +311 -311
- tapps_agents/experts/domain_detector.py +550 -550
- tapps_agents/experts/domain_utils.py +84 -84
- tapps_agents/experts/expert_config.py +113 -113
- tapps_agents/experts/expert_engine.py +465 -465
- tapps_agents/experts/expert_registry.py +744 -744
- tapps_agents/experts/expert_synthesizer.py +70 -70
- tapps_agents/experts/governance.py +197 -197
- tapps_agents/experts/history_logger.py +312 -312
- tapps_agents/experts/knowledge/README.md +180 -180
- tapps_agents/experts/knowledge/accessibility/accessible-forms.md +331 -331
- tapps_agents/experts/knowledge/accessibility/aria-patterns.md +344 -344
- tapps_agents/experts/knowledge/accessibility/color-contrast.md +285 -285
- tapps_agents/experts/knowledge/accessibility/keyboard-navigation.md +332 -332
- tapps_agents/experts/knowledge/accessibility/screen-readers.md +282 -282
- tapps_agents/experts/knowledge/accessibility/semantic-html.md +355 -355
- tapps_agents/experts/knowledge/accessibility/testing-accessibility.md +369 -369
- tapps_agents/experts/knowledge/accessibility/wcag-2.1.md +296 -296
- tapps_agents/experts/knowledge/accessibility/wcag-2.2.md +211 -211
- tapps_agents/experts/knowledge/agent-learning/best-practices.md +715 -715
- tapps_agents/experts/knowledge/agent-learning/pattern-extraction.md +282 -282
- tapps_agents/experts/knowledge/agent-learning/prompt-optimization.md +320 -320
- tapps_agents/experts/knowledge/ai-frameworks/model-optimization.md +90 -90
- tapps_agents/experts/knowledge/ai-frameworks/openvino-patterns.md +260 -260
- tapps_agents/experts/knowledge/api-design-integration/api-gateway-patterns.md +309 -309
- tapps_agents/experts/knowledge/api-design-integration/api-security-patterns.md +521 -521
- tapps_agents/experts/knowledge/api-design-integration/api-versioning.md +421 -421
- tapps_agents/experts/knowledge/api-design-integration/async-protocol-patterns.md +61 -61
- tapps_agents/experts/knowledge/api-design-integration/contract-testing.md +221 -221
- tapps_agents/experts/knowledge/api-design-integration/external-api-integration.md +489 -489
- tapps_agents/experts/knowledge/api-design-integration/fastapi-patterns.md +360 -360
- tapps_agents/experts/knowledge/api-design-integration/fastapi-testing.md +262 -262
- tapps_agents/experts/knowledge/api-design-integration/graphql-patterns.md +582 -582
- tapps_agents/experts/knowledge/api-design-integration/grpc-best-practices.md +499 -499
- tapps_agents/experts/knowledge/api-design-integration/mqtt-patterns.md +455 -455
- tapps_agents/experts/knowledge/api-design-integration/rate-limiting.md +507 -507
- tapps_agents/experts/knowledge/api-design-integration/restful-api-design.md +618 -618
- tapps_agents/experts/knowledge/api-design-integration/websocket-patterns.md +480 -480
- tapps_agents/experts/knowledge/cloud-infrastructure/cloud-native-patterns.md +175 -175
- tapps_agents/experts/knowledge/cloud-infrastructure/container-health-checks.md +261 -261
- tapps_agents/experts/knowledge/cloud-infrastructure/containerization.md +222 -222
- tapps_agents/experts/knowledge/cloud-infrastructure/cost-optimization.md +122 -122
- tapps_agents/experts/knowledge/cloud-infrastructure/disaster-recovery.md +153 -153
- tapps_agents/experts/knowledge/cloud-infrastructure/dockerfile-patterns.md +285 -285
- tapps_agents/experts/knowledge/cloud-infrastructure/infrastructure-as-code.md +187 -187
- tapps_agents/experts/knowledge/cloud-infrastructure/kubernetes-patterns.md +253 -253
- tapps_agents/experts/knowledge/cloud-infrastructure/multi-cloud-strategies.md +155 -155
- tapps_agents/experts/knowledge/cloud-infrastructure/serverless-architecture.md +200 -200
- tapps_agents/experts/knowledge/code-quality-analysis/README.md +16 -16
- tapps_agents/experts/knowledge/code-quality-analysis/code-metrics.md +137 -137
- tapps_agents/experts/knowledge/code-quality-analysis/complexity-analysis.md +181 -181
- tapps_agents/experts/knowledge/code-quality-analysis/technical-debt-patterns.md +191 -191
- tapps_agents/experts/knowledge/data-privacy-compliance/anonymization.md +313 -313
- tapps_agents/experts/knowledge/data-privacy-compliance/ccpa.md +255 -255
- tapps_agents/experts/knowledge/data-privacy-compliance/consent-management.md +282 -282
- tapps_agents/experts/knowledge/data-privacy-compliance/data-minimization.md +275 -275
- tapps_agents/experts/knowledge/data-privacy-compliance/data-retention.md +297 -297
- tapps_agents/experts/knowledge/data-privacy-compliance/data-subject-rights.md +383 -383
- tapps_agents/experts/knowledge/data-privacy-compliance/encryption-privacy.md +285 -285
- tapps_agents/experts/knowledge/data-privacy-compliance/gdpr.md +344 -344
- tapps_agents/experts/knowledge/data-privacy-compliance/hipaa.md +385 -385
- tapps_agents/experts/knowledge/data-privacy-compliance/privacy-by-design.md +280 -280
- tapps_agents/experts/knowledge/database-data-management/acid-vs-cap.md +164 -164
- tapps_agents/experts/knowledge/database-data-management/backup-and-recovery.md +182 -182
- tapps_agents/experts/knowledge/database-data-management/data-modeling.md +172 -172
- tapps_agents/experts/knowledge/database-data-management/database-design.md +187 -187
- tapps_agents/experts/knowledge/database-data-management/flux-query-optimization.md +342 -342
- tapps_agents/experts/knowledge/database-data-management/influxdb-connection-patterns.md +432 -432
- tapps_agents/experts/knowledge/database-data-management/influxdb-patterns.md +442 -442
- tapps_agents/experts/knowledge/database-data-management/migration-strategies.md +216 -216
- tapps_agents/experts/knowledge/database-data-management/nosql-patterns.md +259 -259
- tapps_agents/experts/knowledge/database-data-management/scalability-patterns.md +184 -184
- tapps_agents/experts/knowledge/database-data-management/sql-optimization.md +175 -175
- tapps_agents/experts/knowledge/database-data-management/time-series-modeling.md +444 -444
- tapps_agents/experts/knowledge/development-workflow/README.md +16 -16
- tapps_agents/experts/knowledge/development-workflow/automation-best-practices.md +216 -216
- tapps_agents/experts/knowledge/development-workflow/build-strategies.md +198 -198
- tapps_agents/experts/knowledge/development-workflow/deployment-patterns.md +205 -205
- tapps_agents/experts/knowledge/development-workflow/git-workflows.md +205 -205
- tapps_agents/experts/knowledge/documentation-knowledge-management/README.md +16 -16
- tapps_agents/experts/knowledge/documentation-knowledge-management/api-documentation-patterns.md +231 -231
- tapps_agents/experts/knowledge/documentation-knowledge-management/documentation-standards.md +191 -191
- tapps_agents/experts/knowledge/documentation-knowledge-management/knowledge-management.md +171 -171
- tapps_agents/experts/knowledge/documentation-knowledge-management/technical-writing-guide.md +192 -192
- tapps_agents/experts/knowledge/observability-monitoring/alerting-patterns.md +461 -461
- tapps_agents/experts/knowledge/observability-monitoring/apm-tools.md +459 -459
- tapps_agents/experts/knowledge/observability-monitoring/distributed-tracing.md +367 -367
- tapps_agents/experts/knowledge/observability-monitoring/logging-strategies.md +478 -478
- tapps_agents/experts/knowledge/observability-monitoring/metrics-and-monitoring.md +510 -510
- tapps_agents/experts/knowledge/observability-monitoring/observability-best-practices.md +492 -492
- tapps_agents/experts/knowledge/observability-monitoring/open-telemetry.md +573 -573
- tapps_agents/experts/knowledge/observability-monitoring/slo-sli-sla.md +419 -419
- tapps_agents/experts/knowledge/performance/anti-patterns.md +284 -284
- tapps_agents/experts/knowledge/performance/api-performance.md +256 -256
- tapps_agents/experts/knowledge/performance/caching.md +327 -327
- tapps_agents/experts/knowledge/performance/database-performance.md +252 -252
- tapps_agents/experts/knowledge/performance/optimization-patterns.md +327 -327
- tapps_agents/experts/knowledge/performance/profiling.md +297 -297
- tapps_agents/experts/knowledge/performance/resource-management.md +293 -293
- tapps_agents/experts/knowledge/performance/scalability.md +306 -306
- tapps_agents/experts/knowledge/security/owasp-top10.md +209 -209
- tapps_agents/experts/knowledge/security/secure-coding-practices.md +207 -207
- tapps_agents/experts/knowledge/security/threat-modeling.md +220 -220
- tapps_agents/experts/knowledge/security/vulnerability-patterns.md +342 -342
- tapps_agents/experts/knowledge/software-architecture/docker-compose-patterns.md +314 -314
- tapps_agents/experts/knowledge/software-architecture/microservices-patterns.md +379 -379
- tapps_agents/experts/knowledge/software-architecture/service-communication.md +316 -316
- tapps_agents/experts/knowledge/testing/best-practices.md +310 -310
- tapps_agents/experts/knowledge/testing/coverage-analysis.md +293 -293
- tapps_agents/experts/knowledge/testing/mocking.md +256 -256
- tapps_agents/experts/knowledge/testing/test-automation.md +276 -276
- tapps_agents/experts/knowledge/testing/test-data.md +271 -271
- tapps_agents/experts/knowledge/testing/test-design-patterns.md +280 -280
- tapps_agents/experts/knowledge/testing/test-maintenance.md +236 -236
- tapps_agents/experts/knowledge/testing/test-strategies.md +311 -311
- tapps_agents/experts/knowledge/user-experience/information-architecture.md +325 -325
- tapps_agents/experts/knowledge/user-experience/interaction-design.md +363 -363
- tapps_agents/experts/knowledge/user-experience/prototyping.md +293 -293
- tapps_agents/experts/knowledge/user-experience/usability-heuristics.md +337 -337
- tapps_agents/experts/knowledge/user-experience/usability-testing.md +311 -311
- tapps_agents/experts/knowledge/user-experience/user-journeys.md +296 -296
- tapps_agents/experts/knowledge/user-experience/user-research.md +373 -373
- tapps_agents/experts/knowledge/user-experience/ux-principles.md +340 -340
- tapps_agents/experts/knowledge_freshness.py +321 -321
- tapps_agents/experts/knowledge_ingestion.py +438 -438
- tapps_agents/experts/knowledge_need_detector.py +93 -93
- tapps_agents/experts/knowledge_validator.py +382 -382
- tapps_agents/experts/observability.py +440 -440
- tapps_agents/experts/passive_notifier.py +238 -238
- tapps_agents/experts/proactive_orchestrator.py +32 -32
- tapps_agents/experts/rag_chunker.py +205 -205
- tapps_agents/experts/rag_embedder.py +152 -152
- tapps_agents/experts/rag_evaluation.py +299 -299
- tapps_agents/experts/rag_index.py +303 -303
- tapps_agents/experts/rag_metrics.py +293 -293
- tapps_agents/experts/rag_safety.py +263 -263
- tapps_agents/experts/report_generator.py +296 -296
- tapps_agents/experts/setup_wizard.py +441 -441
- tapps_agents/experts/simple_rag.py +431 -431
- tapps_agents/experts/vector_rag.py +354 -354
- tapps_agents/experts/weight_distributor.py +304 -304
- tapps_agents/health/__init__.py +24 -24
- tapps_agents/health/base.py +75 -75
- tapps_agents/health/checks/__init__.py +22 -22
- tapps_agents/health/checks/automation.py +127 -127
- tapps_agents/health/checks/context7_cache.py +210 -210
- tapps_agents/health/checks/environment.py +116 -116
- tapps_agents/health/checks/execution.py +170 -170
- tapps_agents/health/checks/knowledge_base.py +187 -187
- tapps_agents/health/checks/outcomes.py +324 -324
- tapps_agents/health/collector.py +280 -280
- tapps_agents/health/dashboard.py +137 -137
- tapps_agents/health/metrics.py +151 -151
- tapps_agents/health/orchestrator.py +271 -271
- tapps_agents/health/registry.py +166 -166
- tapps_agents/hooks/__init__.py +33 -33
- tapps_agents/hooks/config.py +140 -140
- tapps_agents/hooks/events.py +135 -135
- tapps_agents/hooks/executor.py +128 -128
- tapps_agents/hooks/manager.py +143 -143
- tapps_agents/integration/__init__.py +8 -8
- tapps_agents/integration/service_integrator.py +121 -121
- tapps_agents/integrations/__init__.py +10 -10
- tapps_agents/integrations/clawdbot.py +525 -525
- tapps_agents/integrations/memory_bridge.py +356 -356
- tapps_agents/mcp/__init__.py +18 -18
- tapps_agents/mcp/gateway.py +112 -112
- tapps_agents/mcp/servers/__init__.py +13 -13
- tapps_agents/mcp/servers/analysis.py +204 -204
- tapps_agents/mcp/servers/context7.py +198 -198
- tapps_agents/mcp/servers/filesystem.py +218 -218
- tapps_agents/mcp/servers/git.py +201 -201
- tapps_agents/mcp/tool_registry.py +115 -115
- tapps_agents/quality/__init__.py +54 -54
- tapps_agents/quality/coverage_analyzer.py +379 -379
- tapps_agents/quality/enforcement.py +82 -82
- tapps_agents/quality/gates/__init__.py +37 -37
- tapps_agents/quality/gates/approval_gate.py +255 -255
- tapps_agents/quality/gates/base.py +84 -84
- tapps_agents/quality/gates/exceptions.py +43 -43
- tapps_agents/quality/gates/policy_gate.py +195 -195
- tapps_agents/quality/gates/registry.py +239 -239
- tapps_agents/quality/gates/security_gate.py +156 -156
- tapps_agents/quality/quality_gates.py +369 -369
- tapps_agents/quality/secret_scanner.py +335 -335
- tapps_agents/session/__init__.py +19 -19
- tapps_agents/session/manager.py +256 -256
- tapps_agents/simple_mode/__init__.py +66 -66
- tapps_agents/simple_mode/agent_contracts.py +357 -357
- tapps_agents/simple_mode/beads_hooks.py +151 -151
- tapps_agents/simple_mode/code_snippet_handler.py +382 -382
- tapps_agents/simple_mode/documentation_manager.py +395 -395
- tapps_agents/simple_mode/documentation_reader.py +187 -187
- tapps_agents/simple_mode/file_inference.py +292 -292
- tapps_agents/simple_mode/framework_change_detector.py +268 -268
- tapps_agents/simple_mode/intent_parser.py +510 -510
- tapps_agents/simple_mode/learning_progression.py +358 -358
- tapps_agents/simple_mode/nl_handler.py +700 -700
- tapps_agents/simple_mode/onboarding.py +253 -253
- tapps_agents/simple_mode/orchestrators/__init__.py +38 -38
- tapps_agents/simple_mode/orchestrators/base.py +185 -185
- tapps_agents/simple_mode/orchestrators/breakdown_orchestrator.py +49 -49
- tapps_agents/simple_mode/orchestrators/brownfield_orchestrator.py +135 -135
- tapps_agents/simple_mode/orchestrators/build_orchestrator.py +2700 -2667
- tapps_agents/simple_mode/orchestrators/deliverable_checklist.py +349 -349
- tapps_agents/simple_mode/orchestrators/enhance_orchestrator.py +53 -53
- tapps_agents/simple_mode/orchestrators/epic_orchestrator.py +122 -122
- tapps_agents/simple_mode/orchestrators/explore_orchestrator.py +184 -184
- tapps_agents/simple_mode/orchestrators/fix_orchestrator.py +723 -723
- tapps_agents/simple_mode/orchestrators/plan_analysis_orchestrator.py +206 -206
- tapps_agents/simple_mode/orchestrators/pr_orchestrator.py +237 -237
- tapps_agents/simple_mode/orchestrators/refactor_orchestrator.py +222 -222
- tapps_agents/simple_mode/orchestrators/requirements_tracer.py +262 -262
- tapps_agents/simple_mode/orchestrators/resume_orchestrator.py +210 -210
- tapps_agents/simple_mode/orchestrators/review_orchestrator.py +161 -161
- tapps_agents/simple_mode/orchestrators/test_orchestrator.py +82 -82
- tapps_agents/simple_mode/output_aggregator.py +340 -340
- tapps_agents/simple_mode/result_formatters.py +598 -598
- tapps_agents/simple_mode/step_dependencies.py +382 -382
- tapps_agents/simple_mode/step_results.py +276 -276
- tapps_agents/simple_mode/streaming.py +388 -388
- tapps_agents/simple_mode/variations.py +129 -129
- tapps_agents/simple_mode/visual_feedback.py +238 -238
- tapps_agents/simple_mode/zero_config.py +274 -274
- tapps_agents/suggestions/__init__.py +8 -8
- tapps_agents/suggestions/inline_suggester.py +52 -52
- tapps_agents/templates/__init__.py +8 -8
- tapps_agents/templates/microservice_generator.py +274 -274
- tapps_agents/utils/env_validator.py +291 -291
- tapps_agents/workflow/__init__.py +171 -171
- tapps_agents/workflow/acceptance_verifier.py +132 -132
- tapps_agents/workflow/agent_handlers/__init__.py +41 -41
- tapps_agents/workflow/agent_handlers/analyst_handler.py +75 -75
- tapps_agents/workflow/agent_handlers/architect_handler.py +107 -107
- tapps_agents/workflow/agent_handlers/base.py +84 -84
- tapps_agents/workflow/agent_handlers/debugger_handler.py +100 -100
- tapps_agents/workflow/agent_handlers/designer_handler.py +110 -110
- tapps_agents/workflow/agent_handlers/documenter_handler.py +94 -94
- tapps_agents/workflow/agent_handlers/implementer_handler.py +235 -235
- tapps_agents/workflow/agent_handlers/ops_handler.py +62 -62
- tapps_agents/workflow/agent_handlers/orchestrator_handler.py +43 -43
- tapps_agents/workflow/agent_handlers/planner_handler.py +98 -98
- tapps_agents/workflow/agent_handlers/registry.py +119 -119
- tapps_agents/workflow/agent_handlers/reviewer_handler.py +119 -119
- tapps_agents/workflow/agent_handlers/tester_handler.py +69 -69
- tapps_agents/workflow/analytics_accessor.py +337 -337
- tapps_agents/workflow/analytics_alerts.py +416 -416
- tapps_agents/workflow/analytics_dashboard_cursor.py +281 -281
- tapps_agents/workflow/analytics_dual_write.py +103 -103
- tapps_agents/workflow/analytics_integration.py +119 -119
- tapps_agents/workflow/analytics_query_parser.py +278 -278
- tapps_agents/workflow/analytics_visualizer.py +259 -259
- tapps_agents/workflow/artifact_helper.py +204 -204
- tapps_agents/workflow/audit_logger.py +263 -263
- tapps_agents/workflow/auto_execution_config.py +340 -340
- tapps_agents/workflow/auto_progression.py +586 -586
- tapps_agents/workflow/branch_cleanup.py +349 -349
- tapps_agents/workflow/checkpoint.py +256 -256
- tapps_agents/workflow/checkpoint_manager.py +178 -178
- tapps_agents/workflow/code_artifact.py +179 -179
- tapps_agents/workflow/common_enums.py +96 -96
- tapps_agents/workflow/confirmation_handler.py +130 -130
- tapps_agents/workflow/context_analyzer.py +222 -222
- tapps_agents/workflow/context_artifact.py +230 -230
- tapps_agents/workflow/cursor_chat.py +94 -94
- tapps_agents/workflow/cursor_executor.py +2337 -2196
- tapps_agents/workflow/cursor_skill_helper.py +516 -516
- tapps_agents/workflow/dependency_resolver.py +244 -244
- tapps_agents/workflow/design_artifact.py +156 -156
- tapps_agents/workflow/detector.py +751 -751
- tapps_agents/workflow/direct_execution_fallback.py +301 -301
- tapps_agents/workflow/docs_artifact.py +168 -168
- tapps_agents/workflow/enforcer.py +389 -389
- tapps_agents/workflow/enhancement_artifact.py +142 -142
- tapps_agents/workflow/error_recovery.py +806 -806
- tapps_agents/workflow/event_bus.py +183 -183
- tapps_agents/workflow/event_log.py +612 -612
- tapps_agents/workflow/events.py +63 -63
- tapps_agents/workflow/exceptions.py +43 -43
- tapps_agents/workflow/execution_graph.py +498 -498
- tapps_agents/workflow/execution_plan.py +126 -126
- tapps_agents/workflow/file_utils.py +186 -186
- tapps_agents/workflow/gate_evaluator.py +182 -182
- tapps_agents/workflow/gate_integration.py +200 -200
- tapps_agents/workflow/graph_visualizer.py +130 -130
- tapps_agents/workflow/health_checker.py +206 -206
- tapps_agents/workflow/logging_helper.py +243 -243
- tapps_agents/workflow/manifest.py +582 -582
- tapps_agents/workflow/marker_writer.py +250 -250
- tapps_agents/workflow/message_formatter.py +188 -188
- tapps_agents/workflow/messaging.py +325 -325
- tapps_agents/workflow/metadata_models.py +91 -91
- tapps_agents/workflow/metrics_integration.py +226 -226
- tapps_agents/workflow/migration_utils.py +116 -116
- tapps_agents/workflow/models.py +148 -111
- tapps_agents/workflow/nlp_config.py +198 -198
- tapps_agents/workflow/nlp_error_handler.py +207 -207
- tapps_agents/workflow/nlp_executor.py +163 -163
- tapps_agents/workflow/nlp_parser.py +528 -528
- tapps_agents/workflow/observability_dashboard.py +451 -451
- tapps_agents/workflow/observer.py +170 -170
- tapps_agents/workflow/ops_artifact.py +257 -257
- tapps_agents/workflow/output_passing.py +214 -214
- tapps_agents/workflow/parallel_executor.py +463 -463
- tapps_agents/workflow/planning_artifact.py +179 -179
- tapps_agents/workflow/preset_loader.py +285 -285
- tapps_agents/workflow/preset_recommender.py +270 -270
- tapps_agents/workflow/progress_logger.py +145 -145
- tapps_agents/workflow/progress_manager.py +303 -303
- tapps_agents/workflow/progress_monitor.py +186 -186
- tapps_agents/workflow/progress_updates.py +423 -423
- tapps_agents/workflow/quality_artifact.py +158 -158
- tapps_agents/workflow/quality_loopback.py +101 -101
- tapps_agents/workflow/recommender.py +387 -387
- tapps_agents/workflow/remediation_loop.py +166 -166
- tapps_agents/workflow/result_aggregator.py +300 -300
- tapps_agents/workflow/review_artifact.py +185 -185
- tapps_agents/workflow/schema_validator.py +522 -522
- tapps_agents/workflow/session_handoff.py +178 -178
- tapps_agents/workflow/skill_invoker.py +648 -648
- tapps_agents/workflow/state_manager.py +756 -756
- tapps_agents/workflow/state_persistence_config.py +331 -331
- tapps_agents/workflow/status_monitor.py +449 -449
- tapps_agents/workflow/step_checkpoint.py +314 -314
- tapps_agents/workflow/step_details.py +201 -201
- tapps_agents/workflow/story_models.py +147 -147
- tapps_agents/workflow/streaming.py +416 -416
- tapps_agents/workflow/suggestion_engine.py +552 -552
- tapps_agents/workflow/testing_artifact.py +186 -186
- tapps_agents/workflow/timeline.py +158 -158
- tapps_agents/workflow/token_integration.py +209 -209
- tapps_agents/workflow/validation.py +217 -217
- tapps_agents/workflow/visual_feedback.py +391 -391
- tapps_agents/workflow/workflow_chain.py +95 -95
- tapps_agents/workflow/workflow_summary.py +219 -219
- tapps_agents/workflow/worktree_manager.py +724 -724
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/METADATA +672 -672
- tapps_agents-3.6.0.dist-info/RECORD +758 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/licenses/LICENSE +22 -22
- tapps_agents/health/checks/outcomes.backup_20260204_064058.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064256.py +0 -324
- tapps_agents/health/checks/outcomes.backup_20260204_064600.py +0 -324
- tapps_agents-3.5.40.dist-info/RECORD +0 -760
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/WHEEL +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/entry_points.txt +0 -0
- {tapps_agents-3.5.40.dist-info → tapps_agents-3.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,618 +1,618 @@
|
|
|
1
|
-
# RESTful API Design
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
REST (Representational State Transfer) is an architectural style for designing networked applications. RESTful APIs use HTTP methods to perform operations on resources, providing a stateless, scalable approach to web services.
|
|
6
|
-
|
|
7
|
-
## REST Principles
|
|
8
|
-
|
|
9
|
-
### 1. Resource-Based URLs
|
|
10
|
-
|
|
11
|
-
**Resources are nouns, not verbs:**
|
|
12
|
-
```http
|
|
13
|
-
# Good: Resource-based
|
|
14
|
-
GET /api/users
|
|
15
|
-
GET /api/users/123
|
|
16
|
-
POST /api/users
|
|
17
|
-
PUT /api/users/123
|
|
18
|
-
DELETE /api/users/123
|
|
19
|
-
|
|
20
|
-
# Bad: Action-based
|
|
21
|
-
GET /api/getUsers
|
|
22
|
-
POST /api/createUser
|
|
23
|
-
POST /api/updateUser/123
|
|
24
|
-
POST /api/deleteUser/123
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
**Resource Naming:**
|
|
28
|
-
- Use plural nouns for collections
|
|
29
|
-
- Use lowercase with hyphens
|
|
30
|
-
- Be consistent across API
|
|
31
|
-
- Avoid deep nesting (> 2 levels)
|
|
32
|
-
|
|
33
|
-
### 2. HTTP Methods
|
|
34
|
-
|
|
35
|
-
**Semantic Usage:**
|
|
36
|
-
- **GET:** Retrieve resource(s) - idempotent, safe
|
|
37
|
-
- **POST:** Create resource - not idempotent
|
|
38
|
-
- **PUT:** Replace resource - idempotent
|
|
39
|
-
- **PATCH:** Partial update - idempotent
|
|
40
|
-
- **DELETE:** Remove resource - idempotent
|
|
41
|
-
|
|
42
|
-
**Example:**
|
|
43
|
-
```http
|
|
44
|
-
GET /api/users # List users
|
|
45
|
-
GET /api/users/123 # Get user 123
|
|
46
|
-
POST /api/users # Create user
|
|
47
|
-
PUT /api/users/123 # Replace user 123
|
|
48
|
-
PATCH /api/users/123 # Update user 123
|
|
49
|
-
DELETE /api/users/123 # Delete user 123
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### 3. Stateless Communication
|
|
53
|
-
|
|
54
|
-
**Each request must contain all information:**
|
|
55
|
-
- No server-side session storage
|
|
56
|
-
- Authentication in every request
|
|
57
|
-
- Client maintains state
|
|
58
|
-
- Server processes independently
|
|
59
|
-
|
|
60
|
-
### 4. Uniform Interface
|
|
61
|
-
|
|
62
|
-
**Standard HTTP:**
|
|
63
|
-
- Status codes for responses
|
|
64
|
-
- Standard headers
|
|
65
|
-
- Consistent data formats
|
|
66
|
-
- Clear resource identification
|
|
67
|
-
|
|
68
|
-
## URL Design Best Practices
|
|
69
|
-
|
|
70
|
-
### Resource Hierarchy
|
|
71
|
-
|
|
72
|
-
**Good Hierarchy:**
|
|
73
|
-
```http
|
|
74
|
-
/api/users
|
|
75
|
-
/api/users/123
|
|
76
|
-
/api/users/123/posts
|
|
77
|
-
/api/users/123/posts/456
|
|
78
|
-
/api/users/123/posts/456/comments
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**Avoid Deep Nesting:**
|
|
82
|
-
```http
|
|
83
|
-
# Bad: Too deep
|
|
84
|
-
/api/users/123/posts/456/comments/789/reactions/10
|
|
85
|
-
|
|
86
|
-
# Better: Flatten when possible
|
|
87
|
-
/api/comments/789/reactions/10
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Query Parameters
|
|
91
|
-
|
|
92
|
-
**Use for filtering, sorting, pagination:**
|
|
93
|
-
```http
|
|
94
|
-
GET /api/users?role=admin&status=active
|
|
95
|
-
GET /api/users?sort=name&order=asc
|
|
96
|
-
GET /api/users?page=1&limit=20
|
|
97
|
-
GET /api/users?search=john&filter=active
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Common Patterns
|
|
101
|
-
|
|
102
|
-
**Pagination:**
|
|
103
|
-
```http
|
|
104
|
-
GET /api/users?page=1&limit=20
|
|
105
|
-
GET /api/users?offset=0&limit=20
|
|
106
|
-
GET /api/users?cursor=abc123
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Filtering:**
|
|
110
|
-
```http
|
|
111
|
-
GET /api/users?status=active
|
|
112
|
-
GET /api/users?role=admin&department=engineering
|
|
113
|
-
GET /api/users?created_after=2026-01-01
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**Sorting:**
|
|
117
|
-
```http
|
|
118
|
-
GET /api/users?sort=name
|
|
119
|
-
GET /api/users?sort=-created_at # Descending
|
|
120
|
-
GET /api/users?sort=name,created_at
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## HTTP Status Codes
|
|
124
|
-
|
|
125
|
-
### Success Codes (2xx)
|
|
126
|
-
|
|
127
|
-
**200 OK:**
|
|
128
|
-
- Successful GET, PUT, PATCH
|
|
129
|
-
- Request succeeded
|
|
130
|
-
|
|
131
|
-
**201 Created:**
|
|
132
|
-
- Successful POST creating resource
|
|
133
|
-
- Include Location header
|
|
134
|
-
|
|
135
|
-
**204 No Content:**
|
|
136
|
-
- Successful DELETE
|
|
137
|
-
- No response body needed
|
|
138
|
-
|
|
139
|
-
### Client Error Codes (4xx)
|
|
140
|
-
|
|
141
|
-
**400 Bad Request:**
|
|
142
|
-
- Malformed request
|
|
143
|
-
- Invalid parameters
|
|
144
|
-
- Validation errors
|
|
145
|
-
|
|
146
|
-
**401 Unauthorized:**
|
|
147
|
-
- Missing or invalid authentication
|
|
148
|
-
- Not authenticated
|
|
149
|
-
|
|
150
|
-
**403 Forbidden:**
|
|
151
|
-
- Authenticated but not authorized
|
|
152
|
-
- Permission denied
|
|
153
|
-
|
|
154
|
-
**404 Not Found:**
|
|
155
|
-
- Resource doesn't exist
|
|
156
|
-
- Invalid URL
|
|
157
|
-
|
|
158
|
-
**409 Conflict:**
|
|
159
|
-
- Resource conflict
|
|
160
|
-
- Duplicate creation
|
|
161
|
-
|
|
162
|
-
**422 Unprocessable Entity:**
|
|
163
|
-
- Valid syntax but semantic errors
|
|
164
|
-
- Business rule violations
|
|
165
|
-
|
|
166
|
-
### Server Error Codes (5xx)
|
|
167
|
-
|
|
168
|
-
**500 Internal Server Error:**
|
|
169
|
-
- Unexpected server error
|
|
170
|
-
- Generic server failure
|
|
171
|
-
|
|
172
|
-
**502 Bad Gateway:**
|
|
173
|
-
- Upstream server error
|
|
174
|
-
- Gateway/proxy issue
|
|
175
|
-
|
|
176
|
-
**503 Service Unavailable:**
|
|
177
|
-
- Service temporarily down
|
|
178
|
-
- Overloaded
|
|
179
|
-
|
|
180
|
-
**504 Gateway Timeout:**
|
|
181
|
-
- Upstream timeout
|
|
182
|
-
- Gateway timeout
|
|
183
|
-
|
|
184
|
-
## Request and Response Format
|
|
185
|
-
|
|
186
|
-
### Content Types
|
|
187
|
-
|
|
188
|
-
**Standard Types:**
|
|
189
|
-
```http
|
|
190
|
-
Content-Type: application/json
|
|
191
|
-
Accept: application/json
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**Versioning:**
|
|
195
|
-
```http
|
|
196
|
-
Accept: application/vnd.api+json;version=1
|
|
197
|
-
Content-Type: application/vnd.api+json;version=1
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Request Body
|
|
201
|
-
|
|
202
|
-
**POST Example:**
|
|
203
|
-
```json
|
|
204
|
-
POST /api/users
|
|
205
|
-
Content-Type: application/json
|
|
206
|
-
|
|
207
|
-
{
|
|
208
|
-
"name": "John Doe",
|
|
209
|
-
"email": "john@example.com",
|
|
210
|
-
"role": "user"
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
**PATCH Example:**
|
|
215
|
-
```json
|
|
216
|
-
PATCH /api/users/123
|
|
217
|
-
Content-Type: application/json
|
|
218
|
-
|
|
219
|
-
{
|
|
220
|
-
"name": "Jane Doe"
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Response Body
|
|
225
|
-
|
|
226
|
-
**Success Response:**
|
|
227
|
-
```json
|
|
228
|
-
{
|
|
229
|
-
"id": 123,
|
|
230
|
-
"name": "John Doe",
|
|
231
|
-
"email": "john@example.com",
|
|
232
|
-
"role": "user",
|
|
233
|
-
"created_at": "2026-01-15T10:30:00Z"
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
**List Response:**
|
|
238
|
-
```json
|
|
239
|
-
{
|
|
240
|
-
"data": [
|
|
241
|
-
{"id": 1, "name": "User 1"},
|
|
242
|
-
{"id": 2, "name": "User 2"}
|
|
243
|
-
],
|
|
244
|
-
"meta": {
|
|
245
|
-
"total": 100,
|
|
246
|
-
"page": 1,
|
|
247
|
-
"limit": 20
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
**Error Response:**
|
|
253
|
-
```json
|
|
254
|
-
{
|
|
255
|
-
"error": {
|
|
256
|
-
"code": "VALIDATION_ERROR",
|
|
257
|
-
"message": "Invalid input",
|
|
258
|
-
"details": [
|
|
259
|
-
{
|
|
260
|
-
"field": "email",
|
|
261
|
-
"message": "Invalid email format"
|
|
262
|
-
}
|
|
263
|
-
]
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
## API Versioning
|
|
269
|
-
|
|
270
|
-
### URL Versioning
|
|
271
|
-
|
|
272
|
-
**Path-based:**
|
|
273
|
-
```http
|
|
274
|
-
GET /api/v1/users
|
|
275
|
-
GET /api/v2/users
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
**Benefits:**
|
|
279
|
-
- Clear and explicit
|
|
280
|
-
- Easy to understand
|
|
281
|
-
- Supports multiple versions
|
|
282
|
-
|
|
283
|
-
### Header Versioning
|
|
284
|
-
|
|
285
|
-
**Accept Header:**
|
|
286
|
-
```http
|
|
287
|
-
GET /api/users
|
|
288
|
-
Accept: application/vnd.api+json;version=2
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
**Custom Header:**
|
|
292
|
-
```http
|
|
293
|
-
GET /api/users
|
|
294
|
-
API-Version: 2
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
### Query Parameter Versioning
|
|
298
|
-
|
|
299
|
-
```http
|
|
300
|
-
GET /api/users?version=2
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
**Not Recommended:**
|
|
304
|
-
- Less RESTful
|
|
305
|
-
- Easy to forget
|
|
306
|
-
- Harder to maintain
|
|
307
|
-
|
|
308
|
-
## Documentation
|
|
309
|
-
|
|
310
|
-
### OpenAPI/Swagger
|
|
311
|
-
|
|
312
|
-
**Define API contract:**
|
|
313
|
-
```yaml
|
|
314
|
-
openapi: 3.0.0
|
|
315
|
-
info:
|
|
316
|
-
title: User API
|
|
317
|
-
version: 1.0.0
|
|
318
|
-
paths:
|
|
319
|
-
/users:
|
|
320
|
-
get:
|
|
321
|
-
summary: List users
|
|
322
|
-
parameters:
|
|
323
|
-
- name: page
|
|
324
|
-
in: query
|
|
325
|
-
schema:
|
|
326
|
-
type: integer
|
|
327
|
-
responses:
|
|
328
|
-
'200':
|
|
329
|
-
description: Success
|
|
330
|
-
content:
|
|
331
|
-
application/json:
|
|
332
|
-
schema:
|
|
333
|
-
type: array
|
|
334
|
-
items:
|
|
335
|
-
$ref: '#/components/schemas/User'
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
**Generate Documentation:**
|
|
339
|
-
- Interactive docs (Swagger UI)
|
|
340
|
-
- Code generation
|
|
341
|
-
- Testing tools
|
|
342
|
-
- Mock servers
|
|
343
|
-
|
|
344
|
-
## Security Best Practices
|
|
345
|
-
|
|
346
|
-
### Authentication
|
|
347
|
-
|
|
348
|
-
**Bearer Token:**
|
|
349
|
-
```http
|
|
350
|
-
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
**API Key:**
|
|
354
|
-
```http
|
|
355
|
-
X-API-Key: abc123def456
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
### HTTPS Only
|
|
359
|
-
|
|
360
|
-
- Always use HTTPS
|
|
361
|
-
- Never send credentials over HTTP
|
|
362
|
-
- Redirect HTTP to HTTPS
|
|
363
|
-
|
|
364
|
-
### Rate Limiting
|
|
365
|
-
|
|
366
|
-
**Headers:**
|
|
367
|
-
```http
|
|
368
|
-
X-RateLimit-Limit: 1000
|
|
369
|
-
X-RateLimit-Remaining: 999
|
|
370
|
-
X-RateLimit-Reset: 1642233600
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
### Input Validation
|
|
374
|
-
|
|
375
|
-
- Validate all inputs
|
|
376
|
-
- Sanitize user data
|
|
377
|
-
- Prevent injection attacks
|
|
378
|
-
- Use parameterized queries
|
|
379
|
-
|
|
380
|
-
## Pagination Patterns
|
|
381
|
-
|
|
382
|
-
### Offset-Based
|
|
383
|
-
|
|
384
|
-
```json
|
|
385
|
-
GET /api/users?page=1&limit=20
|
|
386
|
-
|
|
387
|
-
Response:
|
|
388
|
-
{
|
|
389
|
-
"data": [...],
|
|
390
|
-
"pagination": {
|
|
391
|
-
"page": 1,
|
|
392
|
-
"limit": 20,
|
|
393
|
-
"total": 100,
|
|
394
|
-
"total_pages": 5
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
### Cursor-Based
|
|
400
|
-
|
|
401
|
-
```json
|
|
402
|
-
GET /api/users?cursor=abc123&limit=20
|
|
403
|
-
|
|
404
|
-
Response:
|
|
405
|
-
{
|
|
406
|
-
"data": [...],
|
|
407
|
-
"pagination": {
|
|
408
|
-
"next_cursor": "def456",
|
|
409
|
-
"has_more": true
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
**Benefits:**
|
|
415
|
-
- Consistent results
|
|
416
|
-
- Better for large datasets
|
|
417
|
-
- Avoids offset issues
|
|
418
|
-
|
|
419
|
-
## Error Handling
|
|
420
|
-
|
|
421
|
-
### Consistent Error Format
|
|
422
|
-
|
|
423
|
-
```json
|
|
424
|
-
{
|
|
425
|
-
"error": {
|
|
426
|
-
"code": "RESOURCE_NOT_FOUND",
|
|
427
|
-
"message": "User not found",
|
|
428
|
-
"details": {
|
|
429
|
-
"resource": "user",
|
|
430
|
-
"id": "123"
|
|
431
|
-
},
|
|
432
|
-
"request_id": "req-abc123",
|
|
433
|
-
"timestamp": "2026-01-15T10:30:00Z"
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
### Error Codes
|
|
439
|
-
|
|
440
|
-
**Use consistent error codes:**
|
|
441
|
-
- `VALIDATION_ERROR`
|
|
442
|
-
- `RESOURCE_NOT_FOUND`
|
|
443
|
-
- `UNAUTHORIZED`
|
|
444
|
-
- `FORBIDDEN`
|
|
445
|
-
- `RATE_LIMIT_EXCEEDED`
|
|
446
|
-
- `INTERNAL_ERROR`
|
|
447
|
-
|
|
448
|
-
## FastAPI Examples
|
|
449
|
-
|
|
450
|
-
### Basic RESTful API with FastAPI
|
|
451
|
-
|
|
452
|
-
```python
|
|
453
|
-
from fastapi import FastAPI, HTTPException, Depends
|
|
454
|
-
from pydantic import BaseModel
|
|
455
|
-
from typing import List
|
|
456
|
-
|
|
457
|
-
app = FastAPI(title="User API", version="1.0.0")
|
|
458
|
-
|
|
459
|
-
class User(BaseModel):
|
|
460
|
-
id: int
|
|
461
|
-
name: str
|
|
462
|
-
email: str
|
|
463
|
-
|
|
464
|
-
class UserCreate(BaseModel):
|
|
465
|
-
name: str
|
|
466
|
-
email: str
|
|
467
|
-
|
|
468
|
-
# GET /users - List users
|
|
469
|
-
@app.get("/users", response_model=List[User])
|
|
470
|
-
async def list_users():
|
|
471
|
-
return [
|
|
472
|
-
User(id=1, name="John", email="john@example.com"),
|
|
473
|
-
User(id=2, name="Jane", email="jane@example.com")
|
|
474
|
-
]
|
|
475
|
-
|
|
476
|
-
# GET /users/{user_id} - Get user
|
|
477
|
-
@app.get("/users/{user_id}", response_model=User)
|
|
478
|
-
async def get_user(user_id: int):
|
|
479
|
-
if user_id == 1:
|
|
480
|
-
return User(id=1, name="John", email="john@example.com")
|
|
481
|
-
raise HTTPException(status_code=404, detail="User not found")
|
|
482
|
-
|
|
483
|
-
# POST /users - Create user
|
|
484
|
-
@app.post("/users", response_model=User, status_code=201)
|
|
485
|
-
async def create_user(user: UserCreate):
|
|
486
|
-
# Create user logic
|
|
487
|
-
return User(id=3, name=user.name, email=user.email)
|
|
488
|
-
|
|
489
|
-
# PUT /users/{user_id} - Replace user
|
|
490
|
-
@app.put("/users/{user_id}", response_model=User)
|
|
491
|
-
async def replace_user(user_id: int, user: UserCreate):
|
|
492
|
-
# Replace user logic
|
|
493
|
-
return User(id=user_id, name=user.name, email=user.email)
|
|
494
|
-
|
|
495
|
-
# PATCH /users/{user_id} - Update user
|
|
496
|
-
@app.patch("/users/{user_id}", response_model=User)
|
|
497
|
-
async def update_user(user_id: int, user: UserCreate):
|
|
498
|
-
# Partial update logic
|
|
499
|
-
return User(id=user_id, name=user.name, email=user.email)
|
|
500
|
-
|
|
501
|
-
# DELETE /users/{user_id} - Delete user
|
|
502
|
-
@app.delete("/users/{user_id}", status_code=204)
|
|
503
|
-
async def delete_user(user_id: int):
|
|
504
|
-
# Delete user logic
|
|
505
|
-
return None
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
### FastAPI with Query Parameters and Pagination
|
|
509
|
-
|
|
510
|
-
```python
|
|
511
|
-
from fastapi import Query
|
|
512
|
-
from typing import Optional
|
|
513
|
-
|
|
514
|
-
@app.get("/users")
|
|
515
|
-
async def list_users(
|
|
516
|
-
skip: int = Query(0, ge=0),
|
|
517
|
-
limit: int = Query(10, ge=1, le=100),
|
|
518
|
-
search: Optional[str] = None
|
|
519
|
-
):
|
|
520
|
-
"""List users with pagination and search."""
|
|
521
|
-
# Query logic with pagination
|
|
522
|
-
users = await db.get_users(skip=skip, limit=limit, search=search)
|
|
523
|
-
return {
|
|
524
|
-
"items": users,
|
|
525
|
-
"total": await db.count_users(search=search),
|
|
526
|
-
"skip": skip,
|
|
527
|
-
"limit": limit
|
|
528
|
-
}
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
### FastAPI Error Handling
|
|
532
|
-
|
|
533
|
-
```python
|
|
534
|
-
from fastapi import HTTPException, status
|
|
535
|
-
|
|
536
|
-
@app.get("/users/{user_id}")
|
|
537
|
-
async def get_user(user_id: int):
|
|
538
|
-
user = await db.get_user(user_id)
|
|
539
|
-
if not user:
|
|
540
|
-
raise HTTPException(
|
|
541
|
-
status_code=status.HTTP_404_NOT_FOUND,
|
|
542
|
-
detail=f"User {user_id} not found"
|
|
543
|
-
)
|
|
544
|
-
return user
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
### FastAPI with Dependency Injection
|
|
548
|
-
|
|
549
|
-
```python
|
|
550
|
-
from fastapi import Depends
|
|
551
|
-
from sqlalchemy.orm import Session
|
|
552
|
-
|
|
553
|
-
def get_db():
|
|
554
|
-
db = SessionLocal()
|
|
555
|
-
try:
|
|
556
|
-
yield db
|
|
557
|
-
finally:
|
|
558
|
-
db.close()
|
|
559
|
-
|
|
560
|
-
@app.get("/users/{user_id}")
|
|
561
|
-
async def get_user(
|
|
562
|
-
user_id: int,
|
|
563
|
-
db: Session = Depends(get_db)
|
|
564
|
-
):
|
|
565
|
-
user = db.query(User).filter(User.id == user_id).first()
|
|
566
|
-
if not user:
|
|
567
|
-
raise HTTPException(status_code=404, detail="User not found")
|
|
568
|
-
return user
|
|
569
|
-
```
|
|
570
|
-
|
|
571
|
-
## Best Practices Summary
|
|
572
|
-
|
|
573
|
-
1. **Use RESTful principles:** Resources as nouns, HTTP methods correctly
|
|
574
|
-
2. **Follow HTTP semantics:** Correct status codes, idempotent operations
|
|
575
|
-
3. **Design clear URLs:** Resource-based, consistent, not too deep
|
|
576
|
-
4. **Version your API:** URL versioning recommended
|
|
577
|
-
5. **Document thoroughly:** OpenAPI/Swagger
|
|
578
|
-
6. **Handle errors consistently:** Standard error format
|
|
579
|
-
7. **Implement pagination:** For list endpoints
|
|
580
|
-
8. **Secure properly:** HTTPS, authentication, rate limiting
|
|
581
|
-
9. **Use appropriate status codes:** Follow HTTP standards
|
|
582
|
-
10. **Keep it stateless:** Each request independent
|
|
583
|
-
|
|
584
|
-
## Common Anti-Patterns
|
|
585
|
-
|
|
586
|
-
### Avoid These
|
|
587
|
-
|
|
588
|
-
**Action-Based URLs:**
|
|
589
|
-
```http
|
|
590
|
-
POST /api/getUser
|
|
591
|
-
POST /api/createUser
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
**Ignoring HTTP Methods:**
|
|
595
|
-
```http
|
|
596
|
-
POST /api/users/123/delete
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
**Inconsistent Naming:**
|
|
600
|
-
```http
|
|
601
|
-
GET /api/user
|
|
602
|
-
GET /api/users
|
|
603
|
-
GET /api/userList
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
**Returning 200 for Errors:**
|
|
607
|
-
```json
|
|
608
|
-
{
|
|
609
|
-
"success": false,
|
|
610
|
-
"error": "Not found"
|
|
611
|
-
}
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
**Too Much Nesting:**
|
|
615
|
-
```http
|
|
616
|
-
/api/v1/users/123/posts/456/comments/789/reactions/10
|
|
617
|
-
```
|
|
618
|
-
|
|
1
|
+
# RESTful API Design
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
REST (Representational State Transfer) is an architectural style for designing networked applications. RESTful APIs use HTTP methods to perform operations on resources, providing a stateless, scalable approach to web services.
|
|
6
|
+
|
|
7
|
+
## REST Principles
|
|
8
|
+
|
|
9
|
+
### 1. Resource-Based URLs
|
|
10
|
+
|
|
11
|
+
**Resources are nouns, not verbs:**
|
|
12
|
+
```http
|
|
13
|
+
# Good: Resource-based
|
|
14
|
+
GET /api/users
|
|
15
|
+
GET /api/users/123
|
|
16
|
+
POST /api/users
|
|
17
|
+
PUT /api/users/123
|
|
18
|
+
DELETE /api/users/123
|
|
19
|
+
|
|
20
|
+
# Bad: Action-based
|
|
21
|
+
GET /api/getUsers
|
|
22
|
+
POST /api/createUser
|
|
23
|
+
POST /api/updateUser/123
|
|
24
|
+
POST /api/deleteUser/123
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Resource Naming:**
|
|
28
|
+
- Use plural nouns for collections
|
|
29
|
+
- Use lowercase with hyphens
|
|
30
|
+
- Be consistent across API
|
|
31
|
+
- Avoid deep nesting (> 2 levels)
|
|
32
|
+
|
|
33
|
+
### 2. HTTP Methods
|
|
34
|
+
|
|
35
|
+
**Semantic Usage:**
|
|
36
|
+
- **GET:** Retrieve resource(s) - idempotent, safe
|
|
37
|
+
- **POST:** Create resource - not idempotent
|
|
38
|
+
- **PUT:** Replace resource - idempotent
|
|
39
|
+
- **PATCH:** Partial update - idempotent
|
|
40
|
+
- **DELETE:** Remove resource - idempotent
|
|
41
|
+
|
|
42
|
+
**Example:**
|
|
43
|
+
```http
|
|
44
|
+
GET /api/users # List users
|
|
45
|
+
GET /api/users/123 # Get user 123
|
|
46
|
+
POST /api/users # Create user
|
|
47
|
+
PUT /api/users/123 # Replace user 123
|
|
48
|
+
PATCH /api/users/123 # Update user 123
|
|
49
|
+
DELETE /api/users/123 # Delete user 123
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. Stateless Communication
|
|
53
|
+
|
|
54
|
+
**Each request must contain all information:**
|
|
55
|
+
- No server-side session storage
|
|
56
|
+
- Authentication in every request
|
|
57
|
+
- Client maintains state
|
|
58
|
+
- Server processes independently
|
|
59
|
+
|
|
60
|
+
### 4. Uniform Interface
|
|
61
|
+
|
|
62
|
+
**Standard HTTP:**
|
|
63
|
+
- Status codes for responses
|
|
64
|
+
- Standard headers
|
|
65
|
+
- Consistent data formats
|
|
66
|
+
- Clear resource identification
|
|
67
|
+
|
|
68
|
+
## URL Design Best Practices
|
|
69
|
+
|
|
70
|
+
### Resource Hierarchy
|
|
71
|
+
|
|
72
|
+
**Good Hierarchy:**
|
|
73
|
+
```http
|
|
74
|
+
/api/users
|
|
75
|
+
/api/users/123
|
|
76
|
+
/api/users/123/posts
|
|
77
|
+
/api/users/123/posts/456
|
|
78
|
+
/api/users/123/posts/456/comments
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Avoid Deep Nesting:**
|
|
82
|
+
```http
|
|
83
|
+
# Bad: Too deep
|
|
84
|
+
/api/users/123/posts/456/comments/789/reactions/10
|
|
85
|
+
|
|
86
|
+
# Better: Flatten when possible
|
|
87
|
+
/api/comments/789/reactions/10
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Query Parameters
|
|
91
|
+
|
|
92
|
+
**Use for filtering, sorting, pagination:**
|
|
93
|
+
```http
|
|
94
|
+
GET /api/users?role=admin&status=active
|
|
95
|
+
GET /api/users?sort=name&order=asc
|
|
96
|
+
GET /api/users?page=1&limit=20
|
|
97
|
+
GET /api/users?search=john&filter=active
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Common Patterns
|
|
101
|
+
|
|
102
|
+
**Pagination:**
|
|
103
|
+
```http
|
|
104
|
+
GET /api/users?page=1&limit=20
|
|
105
|
+
GET /api/users?offset=0&limit=20
|
|
106
|
+
GET /api/users?cursor=abc123
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Filtering:**
|
|
110
|
+
```http
|
|
111
|
+
GET /api/users?status=active
|
|
112
|
+
GET /api/users?role=admin&department=engineering
|
|
113
|
+
GET /api/users?created_after=2026-01-01
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Sorting:**
|
|
117
|
+
```http
|
|
118
|
+
GET /api/users?sort=name
|
|
119
|
+
GET /api/users?sort=-created_at # Descending
|
|
120
|
+
GET /api/users?sort=name,created_at
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## HTTP Status Codes
|
|
124
|
+
|
|
125
|
+
### Success Codes (2xx)
|
|
126
|
+
|
|
127
|
+
**200 OK:**
|
|
128
|
+
- Successful GET, PUT, PATCH
|
|
129
|
+
- Request succeeded
|
|
130
|
+
|
|
131
|
+
**201 Created:**
|
|
132
|
+
- Successful POST creating resource
|
|
133
|
+
- Include Location header
|
|
134
|
+
|
|
135
|
+
**204 No Content:**
|
|
136
|
+
- Successful DELETE
|
|
137
|
+
- No response body needed
|
|
138
|
+
|
|
139
|
+
### Client Error Codes (4xx)
|
|
140
|
+
|
|
141
|
+
**400 Bad Request:**
|
|
142
|
+
- Malformed request
|
|
143
|
+
- Invalid parameters
|
|
144
|
+
- Validation errors
|
|
145
|
+
|
|
146
|
+
**401 Unauthorized:**
|
|
147
|
+
- Missing or invalid authentication
|
|
148
|
+
- Not authenticated
|
|
149
|
+
|
|
150
|
+
**403 Forbidden:**
|
|
151
|
+
- Authenticated but not authorized
|
|
152
|
+
- Permission denied
|
|
153
|
+
|
|
154
|
+
**404 Not Found:**
|
|
155
|
+
- Resource doesn't exist
|
|
156
|
+
- Invalid URL
|
|
157
|
+
|
|
158
|
+
**409 Conflict:**
|
|
159
|
+
- Resource conflict
|
|
160
|
+
- Duplicate creation
|
|
161
|
+
|
|
162
|
+
**422 Unprocessable Entity:**
|
|
163
|
+
- Valid syntax but semantic errors
|
|
164
|
+
- Business rule violations
|
|
165
|
+
|
|
166
|
+
### Server Error Codes (5xx)
|
|
167
|
+
|
|
168
|
+
**500 Internal Server Error:**
|
|
169
|
+
- Unexpected server error
|
|
170
|
+
- Generic server failure
|
|
171
|
+
|
|
172
|
+
**502 Bad Gateway:**
|
|
173
|
+
- Upstream server error
|
|
174
|
+
- Gateway/proxy issue
|
|
175
|
+
|
|
176
|
+
**503 Service Unavailable:**
|
|
177
|
+
- Service temporarily down
|
|
178
|
+
- Overloaded
|
|
179
|
+
|
|
180
|
+
**504 Gateway Timeout:**
|
|
181
|
+
- Upstream timeout
|
|
182
|
+
- Gateway timeout
|
|
183
|
+
|
|
184
|
+
## Request and Response Format
|
|
185
|
+
|
|
186
|
+
### Content Types
|
|
187
|
+
|
|
188
|
+
**Standard Types:**
|
|
189
|
+
```http
|
|
190
|
+
Content-Type: application/json
|
|
191
|
+
Accept: application/json
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**Versioning:**
|
|
195
|
+
```http
|
|
196
|
+
Accept: application/vnd.api+json;version=1
|
|
197
|
+
Content-Type: application/vnd.api+json;version=1
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Request Body
|
|
201
|
+
|
|
202
|
+
**POST Example:**
|
|
203
|
+
```json
|
|
204
|
+
POST /api/users
|
|
205
|
+
Content-Type: application/json
|
|
206
|
+
|
|
207
|
+
{
|
|
208
|
+
"name": "John Doe",
|
|
209
|
+
"email": "john@example.com",
|
|
210
|
+
"role": "user"
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**PATCH Example:**
|
|
215
|
+
```json
|
|
216
|
+
PATCH /api/users/123
|
|
217
|
+
Content-Type: application/json
|
|
218
|
+
|
|
219
|
+
{
|
|
220
|
+
"name": "Jane Doe"
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Response Body
|
|
225
|
+
|
|
226
|
+
**Success Response:**
|
|
227
|
+
```json
|
|
228
|
+
{
|
|
229
|
+
"id": 123,
|
|
230
|
+
"name": "John Doe",
|
|
231
|
+
"email": "john@example.com",
|
|
232
|
+
"role": "user",
|
|
233
|
+
"created_at": "2026-01-15T10:30:00Z"
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**List Response:**
|
|
238
|
+
```json
|
|
239
|
+
{
|
|
240
|
+
"data": [
|
|
241
|
+
{"id": 1, "name": "User 1"},
|
|
242
|
+
{"id": 2, "name": "User 2"}
|
|
243
|
+
],
|
|
244
|
+
"meta": {
|
|
245
|
+
"total": 100,
|
|
246
|
+
"page": 1,
|
|
247
|
+
"limit": 20
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**Error Response:**
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"error": {
|
|
256
|
+
"code": "VALIDATION_ERROR",
|
|
257
|
+
"message": "Invalid input",
|
|
258
|
+
"details": [
|
|
259
|
+
{
|
|
260
|
+
"field": "email",
|
|
261
|
+
"message": "Invalid email format"
|
|
262
|
+
}
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## API Versioning
|
|
269
|
+
|
|
270
|
+
### URL Versioning
|
|
271
|
+
|
|
272
|
+
**Path-based:**
|
|
273
|
+
```http
|
|
274
|
+
GET /api/v1/users
|
|
275
|
+
GET /api/v2/users
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Benefits:**
|
|
279
|
+
- Clear and explicit
|
|
280
|
+
- Easy to understand
|
|
281
|
+
- Supports multiple versions
|
|
282
|
+
|
|
283
|
+
### Header Versioning
|
|
284
|
+
|
|
285
|
+
**Accept Header:**
|
|
286
|
+
```http
|
|
287
|
+
GET /api/users
|
|
288
|
+
Accept: application/vnd.api+json;version=2
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Custom Header:**
|
|
292
|
+
```http
|
|
293
|
+
GET /api/users
|
|
294
|
+
API-Version: 2
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Query Parameter Versioning
|
|
298
|
+
|
|
299
|
+
```http
|
|
300
|
+
GET /api/users?version=2
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
**Not Recommended:**
|
|
304
|
+
- Less RESTful
|
|
305
|
+
- Easy to forget
|
|
306
|
+
- Harder to maintain
|
|
307
|
+
|
|
308
|
+
## Documentation
|
|
309
|
+
|
|
310
|
+
### OpenAPI/Swagger
|
|
311
|
+
|
|
312
|
+
**Define API contract:**
|
|
313
|
+
```yaml
|
|
314
|
+
openapi: 3.0.0
|
|
315
|
+
info:
|
|
316
|
+
title: User API
|
|
317
|
+
version: 1.0.0
|
|
318
|
+
paths:
|
|
319
|
+
/users:
|
|
320
|
+
get:
|
|
321
|
+
summary: List users
|
|
322
|
+
parameters:
|
|
323
|
+
- name: page
|
|
324
|
+
in: query
|
|
325
|
+
schema:
|
|
326
|
+
type: integer
|
|
327
|
+
responses:
|
|
328
|
+
'200':
|
|
329
|
+
description: Success
|
|
330
|
+
content:
|
|
331
|
+
application/json:
|
|
332
|
+
schema:
|
|
333
|
+
type: array
|
|
334
|
+
items:
|
|
335
|
+
$ref: '#/components/schemas/User'
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Generate Documentation:**
|
|
339
|
+
- Interactive docs (Swagger UI)
|
|
340
|
+
- Code generation
|
|
341
|
+
- Testing tools
|
|
342
|
+
- Mock servers
|
|
343
|
+
|
|
344
|
+
## Security Best Practices
|
|
345
|
+
|
|
346
|
+
### Authentication
|
|
347
|
+
|
|
348
|
+
**Bearer Token:**
|
|
349
|
+
```http
|
|
350
|
+
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**API Key:**
|
|
354
|
+
```http
|
|
355
|
+
X-API-Key: abc123def456
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### HTTPS Only
|
|
359
|
+
|
|
360
|
+
- Always use HTTPS
|
|
361
|
+
- Never send credentials over HTTP
|
|
362
|
+
- Redirect HTTP to HTTPS
|
|
363
|
+
|
|
364
|
+
### Rate Limiting
|
|
365
|
+
|
|
366
|
+
**Headers:**
|
|
367
|
+
```http
|
|
368
|
+
X-RateLimit-Limit: 1000
|
|
369
|
+
X-RateLimit-Remaining: 999
|
|
370
|
+
X-RateLimit-Reset: 1642233600
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Input Validation
|
|
374
|
+
|
|
375
|
+
- Validate all inputs
|
|
376
|
+
- Sanitize user data
|
|
377
|
+
- Prevent injection attacks
|
|
378
|
+
- Use parameterized queries
|
|
379
|
+
|
|
380
|
+
## Pagination Patterns
|
|
381
|
+
|
|
382
|
+
### Offset-Based
|
|
383
|
+
|
|
384
|
+
```json
|
|
385
|
+
GET /api/users?page=1&limit=20
|
|
386
|
+
|
|
387
|
+
Response:
|
|
388
|
+
{
|
|
389
|
+
"data": [...],
|
|
390
|
+
"pagination": {
|
|
391
|
+
"page": 1,
|
|
392
|
+
"limit": 20,
|
|
393
|
+
"total": 100,
|
|
394
|
+
"total_pages": 5
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Cursor-Based
|
|
400
|
+
|
|
401
|
+
```json
|
|
402
|
+
GET /api/users?cursor=abc123&limit=20
|
|
403
|
+
|
|
404
|
+
Response:
|
|
405
|
+
{
|
|
406
|
+
"data": [...],
|
|
407
|
+
"pagination": {
|
|
408
|
+
"next_cursor": "def456",
|
|
409
|
+
"has_more": true
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Benefits:**
|
|
415
|
+
- Consistent results
|
|
416
|
+
- Better for large datasets
|
|
417
|
+
- Avoids offset issues
|
|
418
|
+
|
|
419
|
+
## Error Handling
|
|
420
|
+
|
|
421
|
+
### Consistent Error Format
|
|
422
|
+
|
|
423
|
+
```json
|
|
424
|
+
{
|
|
425
|
+
"error": {
|
|
426
|
+
"code": "RESOURCE_NOT_FOUND",
|
|
427
|
+
"message": "User not found",
|
|
428
|
+
"details": {
|
|
429
|
+
"resource": "user",
|
|
430
|
+
"id": "123"
|
|
431
|
+
},
|
|
432
|
+
"request_id": "req-abc123",
|
|
433
|
+
"timestamp": "2026-01-15T10:30:00Z"
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Error Codes
|
|
439
|
+
|
|
440
|
+
**Use consistent error codes:**
|
|
441
|
+
- `VALIDATION_ERROR`
|
|
442
|
+
- `RESOURCE_NOT_FOUND`
|
|
443
|
+
- `UNAUTHORIZED`
|
|
444
|
+
- `FORBIDDEN`
|
|
445
|
+
- `RATE_LIMIT_EXCEEDED`
|
|
446
|
+
- `INTERNAL_ERROR`
|
|
447
|
+
|
|
448
|
+
## FastAPI Examples
|
|
449
|
+
|
|
450
|
+
### Basic RESTful API with FastAPI
|
|
451
|
+
|
|
452
|
+
```python
|
|
453
|
+
from fastapi import FastAPI, HTTPException, Depends
|
|
454
|
+
from pydantic import BaseModel
|
|
455
|
+
from typing import List
|
|
456
|
+
|
|
457
|
+
app = FastAPI(title="User API", version="1.0.0")
|
|
458
|
+
|
|
459
|
+
class User(BaseModel):
|
|
460
|
+
id: int
|
|
461
|
+
name: str
|
|
462
|
+
email: str
|
|
463
|
+
|
|
464
|
+
class UserCreate(BaseModel):
|
|
465
|
+
name: str
|
|
466
|
+
email: str
|
|
467
|
+
|
|
468
|
+
# GET /users - List users
|
|
469
|
+
@app.get("/users", response_model=List[User])
|
|
470
|
+
async def list_users():
|
|
471
|
+
return [
|
|
472
|
+
User(id=1, name="John", email="john@example.com"),
|
|
473
|
+
User(id=2, name="Jane", email="jane@example.com")
|
|
474
|
+
]
|
|
475
|
+
|
|
476
|
+
# GET /users/{user_id} - Get user
|
|
477
|
+
@app.get("/users/{user_id}", response_model=User)
|
|
478
|
+
async def get_user(user_id: int):
|
|
479
|
+
if user_id == 1:
|
|
480
|
+
return User(id=1, name="John", email="john@example.com")
|
|
481
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
482
|
+
|
|
483
|
+
# POST /users - Create user
|
|
484
|
+
@app.post("/users", response_model=User, status_code=201)
|
|
485
|
+
async def create_user(user: UserCreate):
|
|
486
|
+
# Create user logic
|
|
487
|
+
return User(id=3, name=user.name, email=user.email)
|
|
488
|
+
|
|
489
|
+
# PUT /users/{user_id} - Replace user
|
|
490
|
+
@app.put("/users/{user_id}", response_model=User)
|
|
491
|
+
async def replace_user(user_id: int, user: UserCreate):
|
|
492
|
+
# Replace user logic
|
|
493
|
+
return User(id=user_id, name=user.name, email=user.email)
|
|
494
|
+
|
|
495
|
+
# PATCH /users/{user_id} - Update user
|
|
496
|
+
@app.patch("/users/{user_id}", response_model=User)
|
|
497
|
+
async def update_user(user_id: int, user: UserCreate):
|
|
498
|
+
# Partial update logic
|
|
499
|
+
return User(id=user_id, name=user.name, email=user.email)
|
|
500
|
+
|
|
501
|
+
# DELETE /users/{user_id} - Delete user
|
|
502
|
+
@app.delete("/users/{user_id}", status_code=204)
|
|
503
|
+
async def delete_user(user_id: int):
|
|
504
|
+
# Delete user logic
|
|
505
|
+
return None
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### FastAPI with Query Parameters and Pagination
|
|
509
|
+
|
|
510
|
+
```python
|
|
511
|
+
from fastapi import Query
|
|
512
|
+
from typing import Optional
|
|
513
|
+
|
|
514
|
+
@app.get("/users")
|
|
515
|
+
async def list_users(
|
|
516
|
+
skip: int = Query(0, ge=0),
|
|
517
|
+
limit: int = Query(10, ge=1, le=100),
|
|
518
|
+
search: Optional[str] = None
|
|
519
|
+
):
|
|
520
|
+
"""List users with pagination and search."""
|
|
521
|
+
# Query logic with pagination
|
|
522
|
+
users = await db.get_users(skip=skip, limit=limit, search=search)
|
|
523
|
+
return {
|
|
524
|
+
"items": users,
|
|
525
|
+
"total": await db.count_users(search=search),
|
|
526
|
+
"skip": skip,
|
|
527
|
+
"limit": limit
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### FastAPI Error Handling
|
|
532
|
+
|
|
533
|
+
```python
|
|
534
|
+
from fastapi import HTTPException, status
|
|
535
|
+
|
|
536
|
+
@app.get("/users/{user_id}")
|
|
537
|
+
async def get_user(user_id: int):
|
|
538
|
+
user = await db.get_user(user_id)
|
|
539
|
+
if not user:
|
|
540
|
+
raise HTTPException(
|
|
541
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
|
542
|
+
detail=f"User {user_id} not found"
|
|
543
|
+
)
|
|
544
|
+
return user
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### FastAPI with Dependency Injection
|
|
548
|
+
|
|
549
|
+
```python
|
|
550
|
+
from fastapi import Depends
|
|
551
|
+
from sqlalchemy.orm import Session
|
|
552
|
+
|
|
553
|
+
def get_db():
|
|
554
|
+
db = SessionLocal()
|
|
555
|
+
try:
|
|
556
|
+
yield db
|
|
557
|
+
finally:
|
|
558
|
+
db.close()
|
|
559
|
+
|
|
560
|
+
@app.get("/users/{user_id}")
|
|
561
|
+
async def get_user(
|
|
562
|
+
user_id: int,
|
|
563
|
+
db: Session = Depends(get_db)
|
|
564
|
+
):
|
|
565
|
+
user = db.query(User).filter(User.id == user_id).first()
|
|
566
|
+
if not user:
|
|
567
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
568
|
+
return user
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
## Best Practices Summary
|
|
572
|
+
|
|
573
|
+
1. **Use RESTful principles:** Resources as nouns, HTTP methods correctly
|
|
574
|
+
2. **Follow HTTP semantics:** Correct status codes, idempotent operations
|
|
575
|
+
3. **Design clear URLs:** Resource-based, consistent, not too deep
|
|
576
|
+
4. **Version your API:** URL versioning recommended
|
|
577
|
+
5. **Document thoroughly:** OpenAPI/Swagger
|
|
578
|
+
6. **Handle errors consistently:** Standard error format
|
|
579
|
+
7. **Implement pagination:** For list endpoints
|
|
580
|
+
8. **Secure properly:** HTTPS, authentication, rate limiting
|
|
581
|
+
9. **Use appropriate status codes:** Follow HTTP standards
|
|
582
|
+
10. **Keep it stateless:** Each request independent
|
|
583
|
+
|
|
584
|
+
## Common Anti-Patterns
|
|
585
|
+
|
|
586
|
+
### Avoid These
|
|
587
|
+
|
|
588
|
+
**Action-Based URLs:**
|
|
589
|
+
```http
|
|
590
|
+
POST /api/getUser
|
|
591
|
+
POST /api/createUser
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
**Ignoring HTTP Methods:**
|
|
595
|
+
```http
|
|
596
|
+
POST /api/users/123/delete
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**Inconsistent Naming:**
|
|
600
|
+
```http
|
|
601
|
+
GET /api/user
|
|
602
|
+
GET /api/users
|
|
603
|
+
GET /api/userList
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
**Returning 200 for Errors:**
|
|
607
|
+
```json
|
|
608
|
+
{
|
|
609
|
+
"success": false,
|
|
610
|
+
"error": "Not found"
|
|
611
|
+
}
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
**Too Much Nesting:**
|
|
615
|
+
```http
|
|
616
|
+
/api/v1/users/123/posts/456/comments/789/reactions/10
|
|
617
|
+
```
|
|
618
|
+
|