



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-79ad2ace604703b3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-99f877e9ddfc0e51.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-48fdd0811afbab3c.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f4bf1142976e4bbf.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-f661b49995ba0bd8.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-0b38d22346321c92.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-f1c62c9e70259b9f.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-79ad2ace604703b3.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-24484a076f02295f.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-f50cacf0a86b9929.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-e61d4f4ca17852c2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-39c10993d5603fac.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-73236c840c0c7d90.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-0de76f07cc035b10.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-fd1500c8744e40d6.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-ed9ca172356fd545.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-1d2c7f7b52a6068b.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-54ba76e934a49d7c.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-456bd5deb85c7ecd.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-11ee8a031c040c1a.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-2d56bdb0166c0238.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_header_reorder","copilot_chat_max_upsell","copilot_chat_models_browser_cache","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_embedded_header_button","copilot_immersive_file_preview_keep_mounted","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_early_stop","copilot_mission_control_environment_list_icons","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_client_side_clone","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_session_filters","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset","copilot_workbench_sunset_redirect","copilot_workbench_ubb","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","glc_code_quality_repo_settings_workflow_config","hide_github_models_ui","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_optimistic_updates","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_lazy_load_comment_box_suggestions","issues_optimistic_linked_branch_create","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_client_env_github_domain","memex_default_issue_create_repository","memex_lazy_hydrate_agent_tasks","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_checks_refetch_dedupe","merge_status_header_feedback","oauth_authorize_clickjacking_protection","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_commit_checks_dialog","pull_request_copilot_attribution_header","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_feedback_dialog","pull_request_virtualization_image_estimate","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_persistence","repo_pulls_dashboard_sidebar_links","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_banner_learn_copilot_sdk","site_global_nav_spark_models_removed","spark_prompt_secret_scanning","spark_server_connection_status","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","ui_service_compute_proxy_control","ui_service_referrer_metrics","ui_service_staleness_detection","update_issue_suggestions","user_code_paste_ux","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workbench_store_readonly","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-e3d808ee18eb9784.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-5bc0f436d2c9dafb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-74e9766bd696d26a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-ecf766ea8a2c7fd6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-8e3d9c5d57d50312.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-cd1b421ad0ad7ed5.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-f939419e0137def3.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.b6099d51b9e67b57.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-86a8f5de995615f8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e88088f989b27670.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-7cdf4e0db98b997c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-6b3c07383371bf58.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-36f036c13c2e3a4c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/kw-866fd9513ae95106.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r1-b075aab3204f32f9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7c5d1669717041f8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-5126390ff433704d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j05-dce4d588268f0f7e.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-1c9590dd2961cd41.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-64719bf3e11350ad.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-f3f5d71440009c48.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-76b18916d0c8ec4d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-5109c77d7ac61078.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-fbb00aaa3ab9abdf.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/04n-51c49ba758739f13.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-024971cb63acad59.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-364e19c63d726e9a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6ny-c969fbae697a356f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/yhq-3a209035a30b1a09.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z1v-da5b33b877bfa358.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-09f85d22a6c8931b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9y-81cfe57dc9040f3e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-41a4cf04cbd99503.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0p-81491ed0d9d666e2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-968961d067db6e6c.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.5858534b1c27f133.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-e2e81b0ae80ade29.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-12ebdc24dcff1ecc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-9a860680a5f230b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-363f0ebf4f62f310.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-bf6f21d7e7a43c35.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fe-7576d9b281e2106a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wsr-5fd3071e5a9061ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0n-ecadb2ffe6b01ba2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xv-51cb34754bda73a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-6317ce1c31aed1db.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-d90ce3a169b741ed.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-de176c4ee471f2b3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/eag-d9eea130fa716df9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y2-87df441f1bc5a264.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/kcz-607e36c8a3751cf0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/x4-65dba777efd828f3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-1a09248f686325f6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi0-e2f78de823e39ca9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/on-95be29ba1ef725d9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-1dbc371cef78c3c1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-c4edb8ab48c5846d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2z-c92998400310b94b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-038758dcbfe08dab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0k-b7df0a74912a42bf.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-915c6643cc0d7d44.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-93ae8b358505d372.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-69d9b60a1b1fcd59.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-8ea7978d3fcd114e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-a401e69a37d95bcc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-1c18210f6b9e2263.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-0a2e46387735f1f4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-cb1e4ddbce4f007b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-9f5235d335ab624b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ko6-9e80f7ac359e3c43.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/uw-8c275f7ac25b7cf6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bsb-4f4ac8c20da73fac.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/w5-13e3a7548bb20af9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fm-c00a7677663ba326.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z-45022d3da7b8817e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/h0-010921512138e12f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5p-ae5db0820116fb43.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8vq-b2af216e992e11ef.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/g5-b399ce875f8bd326.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-f5d51b571cd317cb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/arw-51e8918a1b75a80f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-9ee8a539c5565d44.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.de7a55ca73db5693.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/z.812a998e1961b84d.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.13e027137438fd9f.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.50fa1e1cb544354f.module.css" />

  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hu-1fc0b2a167afc025.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fbr-9cd34ba01ef26edb.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-6f353c828b1a6b9d.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.0685c8a553bac0af.module.css" />


  <title>APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:71e0d546-c899-6f0e-848d-1325fca49512">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="A186:354F01:108F6CDA:F5FCD2D:6AAC7444" data-pjax-transient="true"/><meta name="html-safe-nonce" content="4dd974494fa62a0a762050ecf7bed45c7730161bd52e6e1baae4668516764507" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBMTg2OjM1NEYwMToxMDhGNkNEQTpGNUZDRDJEOjZBQUM3NDQ0IiwidmlzaXRvcl9pZCI6IjE4MzI3NjE2MDYxMTg2MDE3OTYiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="0d39abf6a765a205431955364567c4901338f238bf3dd7a6e545dd0d8eb5443e" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:74359442" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="🏆 Real-Time no-code, powerful and secure ORM 🚀  providing APIs and Docs without coding by Backend, and Frontend(Client) can customize response JSONs 🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码，前端(客户端) 定制返回 JSON 的数据和结构 - APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/4996424eeedd7d28b3a6a279628dacf31f1d55ef3f485ef2ab4284ad85d55be0/APIJSON/APIJSON" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON" /><meta name="twitter:description" content="🏆 Real-Time no-code, powerful and secure ORM 🚀  providing APIs and Docs without coding by Backend, and Frontend(Client) can customize response JSONs 🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码，前端(客户端) 定制返回..." />
  <meta property="og:image" content="https://opengraph.githubassets.com/4996424eeedd7d28b3a6a279628dacf31f1d55ef3f485ef2ab4284ad85d55be0/APIJSON/APIJSON" /><meta property="og:image:alt" content="🏆 Real-Time no-code, powerful and secure ORM 🚀  providing APIs and Docs without coding by Backend, and Frontend(Client) can customize response JSONs 🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码，前端(客户端) 定制返回..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON" /><meta property="og:url" content="https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md" /><meta property="og:description" content="🏆 Real-Time no-code, powerful and secure ORM 🚀  providing APIs and Docs without coding by Backend, and Frontend(Client) can customize response JSONs 🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码，前端(客户端) 定制返回..." />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="6efc4c05745774da02fb827b884dcf238e0894a708545b519154f23d2ce927dd" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="0c5c6e5334a905d8f9521e09eadcffba484d422e0d262e07ff922e6bc18b2ac6" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="ec4c7b86d7b57240253150b827ea48b04e08d8760dc6553d2a04f62000f3fe0c" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="215426445e052dc31d84381ee6c478377c56994947e54de39ab079b87831b861" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/APIJSON/APIJSON git https://github.com/APIJSON/APIJSON.git">

  <meta name="octolytics-dimension-user_id" content="41146037" /><meta name="octolytics-dimension-user_login" content="APIJSON" /><meta name="octolytics-dimension-repository_id" content="74359442" /><meta name="octolytics-dimension-repository_nwo" content="APIJSON/APIJSON" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="74359442" /><meta name="octolytics-dimension-repository_network_root_nwo" content="APIJSON/APIJSON" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="5308c65c8aacf9b53339f960e02aa736a037da7c" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/l7j-2ddd8b435dadae28.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-5b8b005cc405ab57.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.64175aad57da207f.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          
          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-8671acba87bc0dcb.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/i26-f2ae65b837c90ae7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz5-23f28c0f388769c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/lht-26506ea833dda5be.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p1-76a75a6081059b19.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-82c347d20a13fb90.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-c4ca62c5e0e0318e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4s-c22d880230690e1f.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-edf5e205232f86df.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.9d59d1018a52a53c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.6a01c236ff527e7e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/4s.e3d02f110161be52.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2FAPIJSON%2FAPIJSON%2Fblob%2F7.7.0%2FDocument.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=APIJSON%2FAPIJSON","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md\",\"user_id\":null}}","auth_hydro_click_hmac":"5ca2da42a73624827bd056800b019afaef539b028ca692c699c53b1f72340f1f","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2FAPIJSON%2FAPIJSON%2Fblob%2F7.7.0%2FDocument.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="5ca2da42a73624827bd056800b019afaef539b028ca692c699c53b1f72340f1f"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2FAPIJSON%2FAPIJSON%2Fblob%2F7.7.0%2FDocument.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="5ca2da42a73624827bd056800b019afaef539b028ca692c699c53b1f72340f1f"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=APIJSON%2FAPIJSON" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="5ca2da42a73624827bd056800b019afaef539b028ca692c699c53b1f72340f1f"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-851c8a62-d8ac-4106-99e3-91c63d40ba8b" aria-labelledby="tooltip-fb8d6160-69e4-4406-8e7b-8c972d0c3d09" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-fb8d6160-69e4-4406-8e7b-8c972d0c3d09" for="icon-button-851c8a62-d8ac-4106-99e3-91c63d40ba8b" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>





  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      
    


    








  

    <div id="repository-container-header"  class="tmp-pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace>

        <div class="d-flex flex-nowrap flex-justify-end tmp-mb-3  tmp-px-3 tmp-px-lg-5" style="gap: 1rem;">

          <div class="flex-auto min-width-0 width-fit">
              
  <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2 tmp-mr-2">
    <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path>
</svg>
    
    <span class="author flex-self-stretch" itemprop="author">
      <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/APIJSON/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/APIJSON">
        APIJSON
</a>    </span>
    <span class="mx-1 flex-self-stretch color-fg-muted">/</span>
    <strong itemprop="name" class="mr-2 flex-self-stretch">
      <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/APIJSON/APIJSON">APIJSON</a>
    </strong>

    <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span>
  </div>


          </div>

          <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;">
              <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;">
    
      

  <li>
            <a href="/login?return_to=%2FAPIJSON%2FAPIJSON" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;notification subscription menu watch&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="bf31d2f6646201232387a5ba2c220784cc1e6cfe4f0edbfb2b3f55ac1df4e14e" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2 tmp-mr-2">
    <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path>
</svg>Notifications
</a>    <tool-tip id="tooltip-bfc17025-7209-4f76-aa19-eaa2ea507a13" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip>

  </li>

  <li>
          <a icon="repo-forked" id="fork-button" href="/login?return_to=%2FAPIJSON%2FAPIJSON" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;repo details fork button&quot;,&quot;repository_id&quot;:74359442,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="71d45b716c988e7bf618d32cb0d913efe4c71807dfd4d820cd1b56c81bab26a9" data-view-component="true" class="btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2 tmp-mr-2">
    <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path>
</svg>Fork
    <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="2,273" data-view-component="true" class="Counter">2.3k</span>
</a>
  </li>

  <li>
        <div data-view-component="true" class="BtnGroup d-flex">
        <a href="/login?return_to=%2FAPIJSON%2FAPIJSON" rel="nofollow" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;star button&quot;,&quot;repository_id&quot;:74359442,&quot;auth_type&quot;:&quot;LOG_IN&quot;,&quot;originating_url&quot;:&quot;https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="0f6f4526a6fb5079f2a21a09193580259e5d42e8fe0fa767f39a54cb1579b672" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn">    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2 tmp-mr-2">
    <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path>
</svg><span data-view-component="true" class="d-inline">
          Star
</span>          <span id="repo-stars-counter-star" aria-label="18406 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="18,406" data-view-component="true" class="Counter js-social-count">18.4k</span>
</a></div>
  </li>

</ul>

          </div>
        </div>

          <div id="responsive-meta-container" data-turbo-replace>
</div>


            <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 tmp-px-3 px-md-4 tmp-px-md-4 px-lg-5 tmp-px-lg-5">

  <ul data-view-component="true" class="UnderlineNav-body list-style-none">
      <li data-view-component="true" class="d-inline-flex">
  <a id="code-tab" href="/APIJSON/APIJSON/tree/7.7.0" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /APIJSON/APIJSON/tree/7.7.0" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-command-id="repositories:go-to-code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Code&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        <span data-content="Code">Code</span>
          <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="issues-tab" href="/APIJSON/APIJSON/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /APIJSON/APIJSON/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-command-id="repositories:go-to-issues" data-react-nav="issues-react" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Issues&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        <span data-content="Issues">Issues</span>
          <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="236" data-view-component="true" class="Counter">236</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="pull-requests-tab" href="/APIJSON/APIJSON/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /APIJSON/APIJSON/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-command-id="repositories:go-to-pull-requests" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Pull requests&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        <span data-content="Pull requests">Pull requests</span>
          <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="actions-tab" href="/APIJSON/APIJSON/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /APIJSON/APIJSON/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-command-id="repositories:go-to-actions" data-react-nav="actions-workflows" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Actions&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        <span data-content="Actions">Actions</span>
          <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="wiki-tab" href="/APIJSON/APIJSON/wiki" data-tab-item="i4wiki-tab" data-selected-links="repo_wiki /APIJSON/APIJSON/wiki" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g w" data-command-id="repositories:go-to-wiki" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Wiki&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book UnderlineNav-octicon d-none d-sm-inline">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
        <span data-content="Wiki">Wiki</span>
          <span id="wiki-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="security-and-quality-tab" href="/APIJSON/APIJSON/security" data-tab-item="i5security-and-quality-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /APIJSON/APIJSON/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-command-id="repositories:go-to-security" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Security and quality&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span data-content="Security and quality">Security and quality</span>
          <span id="security-and-quality-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span>


    
</a></li>
      <li data-view-component="true" class="d-inline-flex">
  <a id="insights-tab" href="/APIJSON/APIJSON/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /APIJSON/APIJSON/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-command-id="repositories:go-to-insights" data-analytics-event="{&quot;category&quot;:&quot;Underline navbar&quot;,&quot;action&quot;:&quot;Click tab&quot;,&quot;label&quot;:&quot;Insights&quot;,&quot;target&quot;:&quot;UNDERLINE_NAV.TAB&quot;}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item">
    
              <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        <span data-content="Insights">Insights</span>
          <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span>


    
</a></li>
</ul>
    <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 tmp-pr-3 pr-md-4 tmp-pr-md-4 pr-lg-5 tmp-pr-lg-5 right-0">      <action-menu data-select-variant="none" data-view-component="true">
  <focus-group direction="vertical" mnemonics retain>
    <button id="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-button" popovertarget="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-overlay" aria-controls="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-list" aria-haspopup="true" aria-labelledby="tooltip-781f93b4-6ff2-45b2-9a0d-4aedcd5dcb75" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual">
    <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path>
</svg>
</button><tool-tip id="tooltip-781f93b4-6ff2-45b2-9a0d-4aedcd5dcb75" for="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip>


<anchored-position data-target="action-menu.overlay" id="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-overlay" anchor="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true">
  <div data-view-component="true" class="Overlay Overlay--size-auto">
    
      <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone">          <action-list>
  <div data-view-component="true">
    <ul aria-labelledby="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-button" id="action-menu-fdd9953b-00ea-4579-b576-1b4e2ee70c81-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap">
        <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-7cd6bff6-52cf-44fc-8647-bffa359d41b2" href="/APIJSON/APIJSON/tree/7.7.0" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code">
    <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Code
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-92bbd12d-af7b-412c-9bf5-18f6652dbdc4" href="/APIJSON/APIJSON/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened">
    <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Issues
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-77163e62-3fd6-469e-9619-a4c6df0a5a42" href="/APIJSON/APIJSON/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request">
    <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Pull requests
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-d6510e20-1d31-4abe-9c76-254eda7c8540" href="/APIJSON/APIJSON/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play">
    <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Actions
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i4wiki-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-f8a8f034-89eb-486a-b364-cca161defad5" href="/APIJSON/APIJSON/wiki" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book">
    <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Wiki
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i5security-and-quality-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-f49d64c9-b018-4fd4-b21c-3cc352201068" href="/APIJSON/APIJSON/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield">
    <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Security and quality
</span>      
</a>
  
</li>
        <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem">
    
    
    <a tabindex="-1" id="item-5c336117-d3e8-4b08-b223-6f6e3105b232" href="/APIJSON/APIJSON/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16">
        <span class="ActionListItem-visual ActionListItem-visual--leading">
          <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph">
    <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path>
</svg>
        </span>
      
        <span data-view-component="true" class="ActionListItem-label">
          Insights
</span>      
</a>
  
</li>
</ul>    
</div></action-list>


</div>
      
</div></anchored-position>  </focus-group>
</action-menu></div>
</nav>

    </div>
  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/APIJSON/APIJSON/blob/7.7.0/Document.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":1,"text":"APIJSON 通用文档","anchor":"apijson-通用文档","htmlText":"APIJSON 通用文档"},{"level":3,"text":"1.示例","anchor":"1示例","htmlText":"1.示例"},{"level":3,"text":"2.对比传统方式","anchor":"2对比传统方式","htmlText":"2.对比传统方式"},{"level":3,"text":"3.设计规范","anchor":"3设计规范","htmlText":"3.设计规范"},{"level":2,"text":"1.示例","anchor":"1示例-1","htmlText":"1.示例"},{"level":4,"text":"获取用户","anchor":"获取用户","htmlText":"获取用户"},{"level":4,"text":"获取用户列表","anchor":"获取用户列表","htmlText":"获取用户列表"},{"level":4,"text":"获取动态及发布者用户","anchor":"获取动态及发布者用户","htmlText":"获取动态及发布者用户"},{"level":4,"text":"获取类似微信朋友圈的动态列表","anchor":"获取类似微信朋友圈的动态列表","htmlText":"获取类似微信朋友圈的动态列表"},{"level":2,"text":"2.对比传统RESTful方式","anchor":"2对比传统restful方式","htmlText":"2.对比传统RESTful方式"},{"level":3,"text":"2.1 开发流程","anchor":"21-开发流程","htmlText":"2.1 开发流程"},{"level":3,"text":"2.2 前端请求","anchor":"22-前端请求","htmlText":"2.2 前端请求"},{"level":3,"text":"2.3 后端操作","anchor":"23-后端操作","htmlText":"2.3 后端操作"},{"level":3,"text":"2.4 前端解析","anchor":"24-前端解析","htmlText":"2.4 前端解析"},{"level":3,"text":"2.5 前端对应不同需求的请求","anchor":"25-前端对应不同需求的请求","htmlText":"2.5 前端对应不同需求的请求"},{"level":3,"text":"2.6 后端对应不同请求的返回结果","anchor":"26-后端对应不同请求的返回结果","htmlText":"2.6 后端对应不同请求的返回结果"},{"level":2,"text":"3.设计规范","anchor":"3设计规范-1","htmlText":"3.设计规范"},{"level":3,"text":"3.1 操作方法","anchor":"31-操作方法","htmlText":"3.1 操作方法"},{"level":3,"text":"3.2 功能符","anchor":"32-功能符","htmlText":"3.2 功能符"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/Tencent/APIJSON/blob/master/Document-English.md\"\u003eEnglish\u003c/a\u003e\n\u003cbr\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAPIJSON 通用文档\u003c/h1\u003e\u003ca id=\"user-content-apijson-通用文档\" class=\"anchor\" aria-label=\"Permalink: APIJSON 通用文档\" href=\"#apijson-通用文档\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e本文是通用文档，只和 APIJSON 协议有关，和 C#, Go, Java, JavaScript, PHP, Python, TypeScript 等开发语言无关。 \u003cbr\u003e\n具体开发语言相关的 配置、运行、部署 等文档见各个相关项目的文档，可以在首页点击对应语言的入口来查看。\u003cbr\u003e\n\u003ca href=\"https://github.com/Tencent/APIJSON\"\u003ehttps://github.com/Tencent/APIJSON\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://user-images.githubusercontent.com/5738175/134520081-a63d3817-321c-4e7b-9e03-73c6827a19c1.png\"\u003e\u003cimg src=\"https://user-images.githubusercontent.com/5738175/134520081-a63d3817-321c-4e7b-9e03-73c6827a19c1.png\" alt=\"image\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e后端开发者可以先看 \u003ca href=\"http://apijson.cn/doc/zh/\" rel=\"nofollow\"\u003e图文入门教程1\u003c/a\u003e 或 \u003ca href=\"https://hanxu2018.github.io/APIJSON-DOC/\" rel=\"nofollow\"\u003e图文入门教程2\u003c/a\u003e （和本文档有出入的点以本文档为准。例如正则匹配 key? 已废弃，用 key~ 替代；例如 \"@column\":\"store_id,sum(amt):totAmt\" 中逗号 , 有误，应该用分号 ; 隔开 SQL 函数，改为 \"@column\":\"store_id;sum(amt):totAmt\"）\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"#1\"\u003e1.示例\u003c/a\u003e\u003c/h3\u003e\u003ca id=\"user-content-1示例\" class=\"anchor\" aria-label=\"Permalink: 1.示例\" href=\"#1示例\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"#2\"\u003e2.对比传统方式\u003c/a\u003e\u003c/h3\u003e\u003ca id=\"user-content-2对比传统方式\" class=\"anchor\" aria-label=\"Permalink: 2.对比传统方式\" href=\"#2对比传统方式\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.1\"\u003e2.1 开发流程\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.2\"\u003e2.2 前端请求\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.3\"\u003e2.3 后端操作\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.4\"\u003e2.4 前端解析\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.5\"\u003e2.5 对应不同需求的请求\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#2.6\"\u003e2.6 对应不同请求的结果\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"#3\"\u003e3.设计规范\u003c/a\u003e\u003c/h3\u003e\u003ca id=\"user-content-3设计规范\" class=\"anchor\" aria-label=\"Permalink: 3.设计规范\" href=\"#3设计规范\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#3.1\"\u003e3.1 操作方法\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#3.2\"\u003e3.2 功能符\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-1\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1.示例\u003c/h2\u003e\u003ca id=\"user-content-1示例-1\" class=\"anchor\" aria-label=\"Permalink: 1.示例\" href=\"#1示例-1\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e获取用户\u003c/h4\u003e\u003ca id=\"user-content-获取用户\" class=\"anchor\" aria-label=\"Permalink: 获取用户\" href=\"#获取用户\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e请求：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;User\u0026quot;:{\n    \u0026quot;id\u0026quot;:38710\n  }\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"User\":{\n    \"id\":38710\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D%7D\" rel=\"nofollow\"\u003e点击这里测试\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e返回：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;User\u0026quot;:{\n    \u0026quot;id\u0026quot;:38710,\n    \u0026quot;sex\u0026quot;:0,\n    \u0026quot;name\u0026quot;:\u0026quot;TommyLemon\u0026quot;,\n    \u0026quot;tag\u0026quot;:\u0026quot;Android\u0026amp;Java\u0026quot;,\n    \u0026quot;head\u0026quot;:\u0026quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\u0026quot;,\n    \u0026quot;date\u0026quot;:1485948110000,\n    \u0026quot;pictureList\u0026quot;:[\n      \u0026quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\u0026quot;,\n      \u0026quot;http://common.cnblogs.com/images/icon_weibo_24.png\u0026quot;\n    ]\n  },\n  \u0026quot;code\u0026quot;:200,\n  \u0026quot;msg\u0026quot;:\u0026quot;success\u0026quot;\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"User\":{\n    \"id\":38710,\n    \"sex\":0,\n    \"name\":\"TommyLemon\",\n    \"tag\":\"Android\u0026amp;Java\",\n    \"head\":\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",\n    \"date\":1485948110000,\n    \"pictureList\":[\n      \"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",\n      \"http://common.cnblogs.com/images/icon_weibo_24.png\"\n    ]\n  },\n  \"code\":200,\n  \"msg\":\"success\"\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 各种单表对象查询：简单查询、统计、分组、排序、聚合、比较、筛选字段、字段别名 等\n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_single.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_single.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e获取用户列表\u003c/h4\u003e\u003ca id=\"user-content-获取用户列表\" class=\"anchor\" aria-label=\"Permalink: 获取用户列表\" href=\"#获取用户列表\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e请求：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;[]\u0026quot;:{\n    \u0026quot;count\u0026quot;:3,             //只要3个\n    \u0026quot;User\u0026quot;:{\n      \u0026quot;@column\u0026quot;:\u0026quot;id,name\u0026quot;  //只要id,name这两个字段\n    }\n  }\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"[]\":{\n    \"count\":3,             //只要3个\n    \"User\":{\n      \"@column\":\"id,name\"  //只要id,name这两个字段\n    }\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22@column%22:%22id,name%22%7D%7D%7D\" rel=\"nofollow\"\u003e点击这里测试\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e返回：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;[]\u0026quot;:[\n    {\n      \u0026quot;User\u0026quot;:{\n        \u0026quot;id\u0026quot;:38710,\n        \u0026quot;name\u0026quot;:\u0026quot;TommyLemon\u0026quot;\n      }\n    },\n    {\n      \u0026quot;User\u0026quot;:{\n        \u0026quot;id\u0026quot;:70793,\n        \u0026quot;name\u0026quot;:\u0026quot;Strong\u0026quot;\n      }\n    },\n    {\n      \u0026quot;User\u0026quot;:{\n        \u0026quot;id\u0026quot;:82001,\n        \u0026quot;name\u0026quot;:\u0026quot;Android\u0026quot;\n      }\n    }\n  ],\n  \u0026quot;code\u0026quot;:200,\n  \u0026quot;msg\u0026quot;:\u0026quot;success\u0026quot;\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"[]\":[\n    {\n      \"User\":{\n        \"id\":38710,\n        \"name\":\"TommyLemon\"\n      }\n    },\n    {\n      \"User\":{\n        \"id\":70793,\n        \"name\":\"Strong\"\n      }\n    },\n    {\n      \"User\":{\n        \"id\":82001,\n        \"name\":\"Android\"\n      }\n    }\n  ],\n  \"code\":200,\n  \"msg\":\"success\"\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 各种单表数组查询：简单查询、统计、分组、排序、聚合、分页、比较、搜索、正则、条件组合 等\n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_array.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_array.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e获取动态及发布者用户\u003c/h4\u003e\u003ca id=\"user-content-获取动态及发布者用户\" class=\"anchor\" aria-label=\"Permalink: 获取动态及发布者用户\" href=\"#获取动态及发布者用户\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e请求：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;Moment\u0026quot;:{\n  },\n  \u0026quot;User\u0026quot;:{\n    \u0026quot;id@\u0026quot;:\u0026quot;Moment/userId\u0026quot;  //User.id = Moment.userId\n  }\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"Moment\":{\n  },\n  \"User\":{\n    \"id@\":\"Moment/userId\"  //User.id = Moment.userId\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22Moment%252FuserId%22%7D%7D\" rel=\"nofollow\"\u003e点击这里测试\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e返回：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;Moment\u0026quot;:{\n    \u0026quot;id\u0026quot;:12,\n    \u0026quot;userId\u0026quot;:70793,\n    \u0026quot;date\u0026quot;:\u0026quot;2017-02-08 16:06:11.0\u0026quot;,\n    \u0026quot;content\u0026quot;:\u0026quot;1111534034\u0026quot;\n  },\n  \u0026quot;User\u0026quot;:{\n    \u0026quot;id\u0026quot;:70793,\n    \u0026quot;sex\u0026quot;:0,\n    \u0026quot;name\u0026quot;:\u0026quot;Strong\u0026quot;,\n    \u0026quot;tag\u0026quot;:\u0026quot;djdj\u0026quot;,\n    \u0026quot;head\u0026quot;:\u0026quot;http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\u0026quot;,\n    \u0026quot;contactIdList\u0026quot;:[\n      38710,\n      82002\n    ],\n    \u0026quot;date\u0026quot;:\u0026quot;2017-02-01 19:21:50.0\u0026quot;\n  },\n  \u0026quot;code\u0026quot;:200,\n  \u0026quot;msg\u0026quot;:\u0026quot;success\u0026quot;\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"Moment\":{\n    \"id\":12,\n    \"userId\":70793,\n    \"date\":\"2017-02-08 16:06:11.0\",\n    \"content\":\"1111534034\"\n  },\n  \"User\":{\n    \"id\":70793,\n    \"sex\":0,\n    \"name\":\"Strong\",\n    \"tag\":\"djdj\",\n    \"head\":\"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\",\n    \"contactIdList\":[\n      38710,\n      82002\n    ],\n    \"date\":\"2017-02-01 19:21:50.0\"\n  },\n  \"code\":200,\n  \"msg\":\"success\"\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cbr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e获取类似微信朋友圈的动态列表\u003c/h4\u003e\u003ca id=\"user-content-获取类似微信朋友圈的动态列表\" class=\"anchor\" aria-label=\"Permalink: 获取类似微信朋友圈的动态列表\" href=\"#获取类似微信朋友圈的动态列表\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e请求：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;[]\u0026quot;:{                             //请求一个数组\n    \u0026quot;page\u0026quot;:0,                        //数组条件\n    \u0026quot;count\u0026quot;:2,\n    \u0026quot;Moment\u0026quot;:{                       //请求一个名为Moment的对象\n      \u0026quot;content$\u0026quot;:\u0026quot;%a%\u0026quot;               //对象条件，搜索content中包含a的动态\n    },\n    \u0026quot;User\u0026quot;:{\n      \u0026quot;id@\u0026quot;:\u0026quot;/Moment/userId\u0026quot;,        //User.id = Moment.userId  缺省引用赋值路径，从所处容器的父容器路径开始\n      \u0026quot;@column\u0026quot;:\u0026quot;id,name,head\u0026quot;       //指定返回字段\n    },\n    \u0026quot;Comment[]\u0026quot;:{                    //请求一个名为Comment的数组，并去除Comment包装\n      \u0026quot;count\u0026quot;:2,\n      \u0026quot;Comment\u0026quot;:{\n        \u0026quot;momentId@\u0026quot;:\u0026quot;[]/Moment/id\u0026quot;   //Comment.momentId = Moment.id  完整引用赋值路径\n      }\n    }\n  }\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"[]\":{                             //请求一个数组\n    \"page\":0,                        //数组条件\n    \"count\":2,\n    \"Moment\":{                       //请求一个名为Moment的对象\n      \"content$\":\"%a%\"               //对象条件，搜索content中包含a的动态\n    },\n    \"User\":{\n      \"id@\":\"/Moment/userId\",        //User.id = Moment.userId  缺省引用赋值路径，从所处容器的父容器路径开始\n      \"@column\":\"id,name,head\"       //指定返回字段\n    },\n    \"Comment[]\":{                    //请求一个名为Comment的数组，并去除Comment包装\n      \"count\":2,\n      \"Comment\":{\n        \"momentId@\":\"[]/Moment/id\"   //Comment.momentId = Moment.id  完整引用赋值路径\n      }\n    }\n  }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:2,%22Moment%22:%7B%22content$%22:%22%2525a%2525%22%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22,%22@column%22:%22id,name,head%22%7D,%22Comment%5B%5D%22:%7B%22count%22:2,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003e点击这里测试\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e返回：\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;[]\u0026quot;:[\n    {\n      \u0026quot;Moment\u0026quot;:{\n        \u0026quot;id\u0026quot;:15,\n        \u0026quot;userId\u0026quot;:70793,\n        \u0026quot;date\u0026quot;:1486541171000,\n        \u0026quot;content\u0026quot;:\u0026quot;APIJSON is a JSON Transmission Structure Protocol…\u0026quot;,\n        \u0026quot;praiseUserIdList\u0026quot;:[\n          82055,\n          82002,\n          82001\n        ],\n        \u0026quot;pictureList\u0026quot;:[\n          \u0026quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\u0026quot;,\n          \u0026quot;http://common.cnblogs.com/images/icon_weibo_24.png\u0026quot;\n        ]\n      },\n      \u0026quot;User\u0026quot;:{\n        \u0026quot;id\u0026quot;:70793,\n        \u0026quot;name\u0026quot;:\u0026quot;Strong\u0026quot;,\n        \u0026quot;head\u0026quot;:\u0026quot;http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\u0026quot;\n      },\n      \u0026quot;Comment[]\u0026quot;:[\n        {\n          \u0026quot;id\u0026quot;:176,\n          \u0026quot;toId\u0026quot;:166,\n          \u0026quot;userId\u0026quot;:38710,\n          \u0026quot;momentId\u0026quot;:15,\n          \u0026quot;date\u0026quot;:1490444883000,\n          \u0026quot;content\u0026quot;:\u0026quot;thank you\u0026quot;\n        },\n        {\n          \u0026quot;id\u0026quot;:1490863469638,\n          \u0026quot;toId\u0026quot;:0,\n          \u0026quot;userId\u0026quot;:82002,\n          \u0026quot;momentId\u0026quot;:15,\n          \u0026quot;date\u0026quot;:1490863469000,\n          \u0026quot;content\u0026quot;:\u0026quot;Just do it\u0026quot;\n        }\n      ]\n    },\n    {\n      \u0026quot;Moment\u0026quot;:{\n        \u0026quot;id\u0026quot;:58,\n        \u0026quot;userId\u0026quot;:90814,\n        \u0026quot;date\u0026quot;:1485947671000,\n        \u0026quot;content\u0026quot;:\u0026quot;This is a Content...-435\u0026quot;,\n        \u0026quot;praiseUserIdList\u0026quot;:[\n          38710,\n          82003,\n          82005,\n          93793,\n          82006,\n          82044,\n          82001\n        ],\n        \u0026quot;pictureList\u0026quot;:[\n          \u0026quot;http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\u0026quot;\n        ]\n      },\n      \u0026quot;User\u0026quot;:{\n        \u0026quot;id\u0026quot;:90814,\n        \u0026quot;name\u0026quot;:7,\n        \u0026quot;head\u0026quot;:\u0026quot;http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000\u0026quot;\n      },\n      \u0026quot;Comment[]\u0026quot;:[\n        {\n          \u0026quot;id\u0026quot;:13,\n          \u0026quot;toId\u0026quot;:0,\n          \u0026quot;userId\u0026quot;:82005,\n          \u0026quot;momentId\u0026quot;:58,\n          \u0026quot;date\u0026quot;:1485948050000,\n          \u0026quot;content\u0026quot;:\u0026quot;This is a Content...-13\u0026quot;\n        },\n        {\n          \u0026quot;id\u0026quot;:77,\n          \u0026quot;toId\u0026quot;:13,\n          \u0026quot;userId\u0026quot;:93793,\n          \u0026quot;momentId\u0026quot;:58,\n          \u0026quot;date\u0026quot;:1485948050000,\n          \u0026quot;content\u0026quot;:\u0026quot;This is a Content...-77\u0026quot;\n        }\n      ]\n    }\n  ],\n  \u0026quot;code\u0026quot;:200,\n  \u0026quot;msg\u0026quot;:\u0026quot;success\u0026quot;\n}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\n  \"[]\":[\n    {\n      \"Moment\":{\n        \"id\":15,\n        \"userId\":70793,\n        \"date\":1486541171000,\n        \"content\":\"APIJSON is a JSON Transmission Structure Protocol…\",\n        \"praiseUserIdList\":[\n          82055,\n          82002,\n          82001\n        ],\n        \"pictureList\":[\n          \"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",\n          \"http://common.cnblogs.com/images/icon_weibo_24.png\"\n        ]\n      },\n      \"User\":{\n        \"id\":70793,\n        \"name\":\"Strong\",\n        \"head\":\"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\"\n      },\n      \"Comment[]\":[\n        {\n          \"id\":176,\n          \"toId\":166,\n          \"userId\":38710,\n          \"momentId\":15,\n          \"date\":1490444883000,\n          \"content\":\"thank you\"\n        },\n        {\n          \"id\":1490863469638,\n          \"toId\":0,\n          \"userId\":82002,\n          \"momentId\":15,\n          \"date\":1490863469000,\n          \"content\":\"Just do it\"\n        }\n      ]\n    },\n    {\n      \"Moment\":{\n        \"id\":58,\n        \"userId\":90814,\n        \"date\":1485947671000,\n        \"content\":\"This is a Content...-435\",\n        \"praiseUserIdList\":[\n          38710,\n          82003,\n          82005,\n          93793,\n          82006,\n          82044,\n          82001\n        ],\n        \"pictureList\":[\n          \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"\n        ]\n      },\n      \"User\":{\n        \"id\":90814,\n        \"name\":7,\n        \"head\":\"http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000\"\n      },\n      \"Comment[]\":[\n        {\n          \"id\":13,\n          \"toId\":0,\n          \"userId\":82005,\n          \"momentId\":58,\n          \"date\":1485948050000,\n          \"content\":\"This is a Content...-13\"\n        },\n        {\n          \"id\":77,\n          \"toId\":13,\n          \"userId\":93793,\n          \"momentId\":58,\n          \"date\":1485948050000,\n          \"content\":\"This is a Content...-77\"\n        }\n      ]\n    }\n  ],\n  \"code\":200,\n  \"msg\":\"success\"\n}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 各种多表关联查询：一对一、一对多、多对一、各种条件 等\n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_associate.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_associate.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 各种 JOIN：\u0026lt; LEFT JOIN, \u0026amp; INNER JOIN 等\n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_join.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_join.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 各种子查询：@from@ FROM, key@ =, key\u0026gt;@ \u0026gt;, key{}@ IN, key}{@ EXISTS 等 \n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_subquery.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_subquery.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n  [GIF] APIJSON 部分功能演示集合，由浅入深、由简单到复杂 \n\u003c/p\u003e \n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_summary.gif\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_summary.gif\" alt=\"\" data-animated-image=\"\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://apijson.cn/api\" rel=\"nofollow\"\u003e在线测试\u003c/a\u003e\u003c/p\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-2\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.对比传统RESTful方式\u003c/h2\u003e\u003ca id=\"user-content-2对比传统restful方式\" class=\"anchor\" aria-label=\"Permalink: 2.对比传统RESTful方式\" href=\"#2对比传统restful方式\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.1\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.1 开发流程\u003c/h3\u003e\u003ca id=\"user-content-21-开发流程\" class=\"anchor\" aria-label=\"Permalink: 2.1 开发流程\" href=\"#21-开发流程\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e开发流程\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e接口传输\u003c/td\u003e\n\u003ctd\u003e等后端编辑接口，然后更新文档，前端再按照文档编辑请求和解析代码\u003c/td\u003e\n\u003ctd\u003e前端按照自己的需求编辑请求和解析代码。\u003cbr\u003e没有接口，更不需要文档！前端再也不用和后端沟通接口或文档问题了！\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e兼容旧版\u003c/td\u003e\n\u003ctd\u003e后端增加新接口，用v2表示第2版接口，然后更新文档\u003c/td\u003e\n\u003ctd\u003e什么都不用做！\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n \u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.2\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.2 前端请求\u003c/h3\u003e\u003ca id=\"user-content-22-前端请求\" class=\"anchor\" aria-label=\"Permalink: 2.2 前端请求\" href=\"#22-前端请求\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e前端请求\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e要求\u003c/td\u003e\n\u003ctd\u003e前端按照文档在对应URL后面拼接键值对\u003c/td\u003e\n\u003ctd\u003e前端按照自己的需求在固定URL后拼接JSON\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eURL\u003c/td\u003e\n\u003ctd\u003e不同的请求对应不同的URL，基本上有多少个不同的请求就得有多少个接口URL\u003c/td\u003e\n\u003ctd\u003e相同的操作方法(增删改查)都用同一个URL，\u003cbr\u003e大部分请求都用7个通用接口URL的其中一个\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e键值对\u003c/td\u003e\n\u003ctd\u003ekey=value\u003c/td\u003e\n\u003ctd\u003ekey:value\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e结构\u003c/td\u003e\n\u003ctd\u003e同一个URL内table_name只能有一个 \u003cbr\u003e\u003cbr\u003e base_url/get/table_name?\u003cbr\u003ekey0=value0\u0026amp;key1=value1...\u003c/td\u003e\n\u003ctd\u003e同一个URL后TableName可传任意数量个 \u003cbr\u003e\u003cbr\u003e base_url/get/\u003cbr\u003e{\u003cbr\u003e    TableName0:{\u003cbr\u003e      key0:value0,\u003cbr\u003e      key1:value1,\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    TableName1:{\u003cbr\u003e      ...\u003cbr\u003e    }\u003cbr\u003e    ...\u003cbr\u003e }\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n \u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.3\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.3 后端操作\u003c/h3\u003e\u003ca id=\"user-content-23-后端操作\" class=\"anchor\" aria-label=\"Permalink: 2.3 后端操作\" href=\"#23-后端操作\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e后端操作\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e解析和返回\u003c/td\u003e\n\u003ctd\u003e取出键值对，把键值对作为条件用预设的的方式去查询数据库，最后封装JSON并返回给前端\u003c/td\u003e\n\u003ctd\u003e把Parser#parse方法的返回值返回给前端就行\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e返回JSON结构的设定方式\u003c/td\u003e\n\u003ctd\u003e由后端设定，前端不能修改\u003c/td\u003e\n\u003ctd\u003e由前端设定，后端不能修改\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n \u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.4\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.4 前端解析\u003c/h3\u003e\u003ca id=\"user-content-24-前端解析\" class=\"anchor\" aria-label=\"Permalink: 2.4 前端解析\" href=\"#24-前端解析\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e前端解析\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e查看方式\u003c/td\u003e\n\u003ctd\u003e查文档或问后端，或等请求成功后看日志\u003c/td\u003e\n\u003ctd\u003e看请求就行，所求即所得，不用查、不用问、不用等。也可以等请求成功后看日志\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e解析方法\u003c/td\u003e\n\u003ctd\u003e用JSON解析器来解析JSONObject\u003c/td\u003e\n\u003ctd\u003e可以用JSONResponse解析JSONObject，或使用传统方式\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n \u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.5\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.5 前端对应不同需求的请求\u003c/h3\u003e\u003ca id=\"user-content-25-前端对应不同需求的请求\" class=\"anchor\" aria-label=\"Permalink: 2.5 前端对应不同需求的请求\" href=\"#25-前端对应不同需求的请求\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e前端的请求\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser\u003c/td\u003e\n\u003ctd\u003ebase_url/get/user?id=38710\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMoment和对应的User\u003c/td\u003e\n\u003ctd\u003e分两次请求\u003cbr\u003eMoment: \u003cbr\u003e base_url/get/moment?userId=38710\u003cbr\u003e\u003cbr\u003eUser: \u003cbr\u003e base_url/get/user?id=38710\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id%22:38710%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"userId\":38710\u003cbr\u003e    }, \u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser列表\u003c/td\u003e\n\u003ctd\u003ebase_url/get/user/list?\u003cbr\u003epage=0\u0026amp;count=3\u0026amp;sex=0\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22User%22:%7B%22sex%22:0%7D%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"User[]\":{\u003cbr\u003e      \"page\":0,\u003cbr\u003e       \"count\":3, \u003cbr\u003e      \"User\":{\u003cbr\u003e        \"sex\":0\u003cbr\u003e      }\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMoment列表，\u003cbr\u003e每个Moment包括\u003cbr\u003e1.发布者User\u003cbr\u003e2.前3条Comment\u003c/td\u003e\n\u003ctd\u003eMoment里必须有\u003cbr\u003e1.User对象\u003cbr\u003e2.Comment数组\u003cbr\u003e\u003cbr\u003e base_url/get/moment/list?\u003cbr\u003epage=0\u0026amp;count=3\u0026amp;commentCount=3\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"[]\":{\u003cbr\u003e      \"page\":0, \u003cbr\u003e      \"count\":3, \u003cbr\u003e      \"Moment\":{}, \u003cbr\u003e      \"User\":{\u003cbr\u003e        \"id@\":\"/Moment/userId\"\u003cbr\u003e      },\u003cbr\u003e      \"Comment[]\":{\u003cbr\u003e        \"count\":3,\u003cbr\u003e        \"Comment\":{\u003cbr\u003e          \"momentId@\":\"[]/Moment/id\"\u003cbr\u003e        }\u003cbr\u003e      }\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser发布的Moment列表，\u003cbr\u003e 每个Moment包括\u003cbr\u003e 1.发布者User\u003cbr\u003e 2.前3条Comment\u003c/td\u003e\n\u003ctd\u003e1.Moment里必须有User对象和Comment数组\u003cbr\u003e 2.字段名必须查接口文档，例如评论数量字段名可能是\u003cbr\u003e commentCount,comment_count或者简写cmt_count等各种奇葩写法... \u003cbr\u003e\u003cbr\u003e base_url/get/moment/list?\u003cbr\u003epage=0\u0026amp;count=3\u003cbr\u003e\u0026amp;commentCount=3\u0026amp;userId=38710\u003c/td\u003e\n\u003ctd\u003e有以下几种方式:\u003cbr\u003e\u003cbr\u003e ① 把以上请求里的\u003cbr\u003e\"Moment\":{}, \"User\":{\"id@\":\"/Moment/userId\"}\u003cbr\u003e改为\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003e\"Moment\":{\"userId\":38710}, \"User\":{\"id\":38710}\u003c/a\u003e \u003cbr\u003e\u003cbr\u003e ② 或把User放在上面的最外层省去重复的User\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D,%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710\u003cbr\u003e    },\u003cbr\u003e    \"[]\":{\u003cbr\u003e      \"page\":0,\u003cbr\u003e      \"count\":3, \u003cbr\u003e      \"Moment\":{\u003cbr\u003e        \"userId\":38710\u003cbr\u003e      }, \u003cbr\u003e      \"Comment[]\":{\u003cbr\u003e        \"count\":3,\u003cbr\u003e        \"Comment\":{\u003cbr\u003e          \"momentId@\":\"[]/Moment/id\"\u003cbr\u003e        }\u003cbr\u003e      }\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ③ 如果User之前已经获取到了，还可以不传User来节省请求和返回数据的流量并提升速度\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003ebase_url/get/\u003cbr\u003e{\u003cbr\u003e    \"[]\":{\u003cbr\u003e      \"page\":0,\u003cbr\u003e      \"count\":3, \u003cbr\u003e      \"Moment\":{\u003cbr\u003e        \"userId\":38710\u003cbr\u003e      },\u003cbr\u003e      \"Comment[]\":{\u003cbr\u003e        \"count\":3,\u003cbr\u003e        \"Comment\":{\u003cbr\u003e          \"momentId@\":\"[]/Moment/id\"\u003cbr\u003e        }\u003cbr\u003e      }\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n \u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-2.6\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2.6 后端对应不同请求的返回结果\u003c/h3\u003e\u003ca id=\"user-content-26-后端对应不同请求的返回结果\" class=\"anchor\" aria-label=\"Permalink: 2.6 后端对应不同请求的返回结果\" href=\"#26-后端对应不同请求的返回结果\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e后端的返回结果\u003c/th\u003e\n\u003cth\u003e传统方式\u003c/th\u003e\n\u003cth\u003eAPIJSON\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    \"data\":{\u003cbr\u003e      \"id\":38710,\u003cbr\u003e      \"name\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710,\u003cbr\u003e      \"name\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMoment和对应的User\u003c/td\u003e\n\u003ctd\u003e分别返回两次请求的结果，获取到Moment后取出userId作为User的id条件去查询User \u003cbr\u003e\u003cbr\u003e Moment: \u003cbr\u003e {\u003cbr\u003e    \"data\":{\u003cbr\u003e      \"id\":235,\u003cbr\u003e      \"content\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e} \u003cbr\u003e\u003cbr\u003e User: \u003cbr\u003e {\u003cbr\u003e    \"data\":{\u003cbr\u003e      \"id\":38710,\u003cbr\u003e      \"name\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003ctd\u003e一次性返回，没有传统方式导致的 长时间等待结果、两次结果间关联、线程多次切换 等问题 \u003cbr\u003e\u003cbr\u003e {\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"id\":235,\u003cbr\u003e      \"content\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710,\u003cbr\u003e      \"name\":\"xxx\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser列表\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    \"data\":[\u003cbr\u003e      {\u003cbr\u003e        \"id\":38710,\u003cbr\u003e        \"name\":\"xxx\",\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":82001,\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    \"User[]\":[\u003cbr\u003e      {\u003cbr\u003e        \"id\":38710,\u003cbr\u003e        \"name\":\"xxx\",\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":82001,\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMoment列表，每个Moment包括发布者User和前3条Comment\u003c/td\u003e\n\u003ctd\u003eMoment里必须有\u003cbr\u003e1.User对象\u003cbr\u003e2.Comment数组 \u003cbr\u003e\u003cbr\u003e {\u003cbr\u003e    \"data\":[\u003cbr\u003e      {\u003cbr\u003e        \"id\":235,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":301,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003ctd\u003e1.高灵活，可任意组合\u003cbr\u003e2.低耦合，逻辑很清晰\u003cbr\u003e\u003cbr\u003e{\u003cbr\u003e    \"[]\":[\u003cbr\u003e      {\u003cbr\u003e        \"Moment\":{\u003cbr\u003e          \"id\":235,\u003cbr\u003e          \"content\":\"xxx\",\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"User\":{\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment[]\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"Moment\":{\u003cbr\u003e          \"id\":301,\u003cbr\u003e          \"content\":\"xxx\",\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"User\":{\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUser发布的Moment列表，每个Moment包括发布者User和前3条Comment\u003c/td\u003e\n\u003ctd\u003e1.大量重复User，浪费流量和服务器性能\u003cbr\u003e2.优化很繁琐，需要后端扩展接口、写好文档，前端/前端再配合优化\u003cbr\u003e\u003cbr\u003e{\u003cbr\u003e    \"data\":[\u003cbr\u003e      {\u003cbr\u003e        \"id\":235,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          \"id\":38710,\u003cbr\u003e          \"name\":\"Tommy\"\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":470,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          \"id\":38710,\u003cbr\u003e          \"name\":\"Tommy\"\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":511,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          \"id\":38710,\u003cbr\u003e          \"name\":\"Tommy\"\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      {\u003cbr\u003e        \"id\":595,\u003cbr\u003e        \"content\":\"xxx\",\u003cbr\u003e        ...,\u003cbr\u003e        \"User\":{\u003cbr\u003e          \"id\":38710,\u003cbr\u003e          \"name\":\"Tommy\"\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e        ...\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003ctd\u003e以上不同请求方式的结果:\u003cbr\u003e\u003cbr\u003e ① 常规请求 \u003cbr\u003e {\u003cbr\u003e    \"[]\":[\u003cbr\u003e      {\u003cbr\u003e        \"Moment\":{\u003cbr\u003e          \"id\":235,\u003cbr\u003e          \"content\":\"xxx\",\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"User\":{\u003cbr\u003e          \"id\":38710,\u003cbr\u003e          \"name\":\"Tommy\"\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment[]\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e\u003cbr\u003e ② 省去重复的User \u003cbr\u003e {\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"id\":38710,\u003cbr\u003e      \"name\":\"Tommy\",\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"[]\":[\u003cbr\u003e      {\u003cbr\u003e        \"Moment\":{\u003cbr\u003e          \"id\":235,\u003cbr\u003e          \"content\":\"xxx\",\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment[]\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e\u003cbr\u003e ③ 不查询已获取到的User \u003cbr\u003e {\u003cbr\u003e    \"[]\":[\u003cbr\u003e      {\u003cbr\u003e        \"Moment\":{\u003cbr\u003e          \"id\":235,\u003cbr\u003e          \"content\":\"xxx\",\u003cbr\u003e          ...\u003cbr\u003e        },\u003cbr\u003e        \"Comment[]\":[\u003cbr\u003e          ...\u003cbr\u003e        ]\u003cbr\u003e      },\u003cbr\u003e      ...\u003cbr\u003e    ],\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e1.base_url指基地址，一般是顶级域名，其它分支url都是在base_url后扩展。如base_url:\u003ca href=\"http://apijson.cn:8080/\" rel=\"nofollow\"\u003ehttp://apijson.cn:8080/\u003c/a\u003e ，对应的GET分支url:\u003ca href=\"http://apijson.cn:8080/get/\" rel=\"nofollow\"\u003ehttp://apijson.cn:8080/get/\u003c/a\u003e 。下同。\u003cbr\u003e\n2.请求中的key或value任意一个为null值时，这个 key:value键值对 被视为无效。下同。\u003cbr\u003e\n3.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义，不需要再写；但如果是浏览器或Postman等直接输入url/request，需要把request中的所有 / 都改成 %252F 。下同。\u003cbr\u003e\n4.code，指返回结果中的状态码，200表示成功，其它都是错误码，值全部都是HTTP标准状态码。下同。\u003cbr\u003e\n5.msg，指返回结果中的状态信息，对成功结果或错误原因的详细说明。下同。\u003cbr\u003e\n6.code和msg总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式code和msg。下同。\u003cbr\u003e\n7.id等字段对应的值仅供说明，不一定是数据库里存在的，请求里用的是真实存在的值。下同。\u003c/p\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 id=\"user-content-3\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3.设计规范\u003c/h2\u003e\u003ca id=\"user-content-3设计规范-1\" class=\"anchor\" aria-label=\"Permalink: 3.设计规范\" href=\"#3设计规范-1\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch2 dir=\"auto\"\u003e\u003c/h2\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-3.1\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3.1 操作方法\u003c/h3\u003e\u003ca id=\"user-content-31-操作方法\" class=\"anchor\" aria-label=\"Permalink: 3.1 操作方法\" href=\"#31-操作方法\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e 方法及说明\u003c/th\u003e\n\u003cth\u003eURL\u003c/th\u003e\n\u003cth\u003eRequest\u003c/th\u003e\n\u003cth\u003eResponse\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGET: \u003cbr\u003e 普通获取数据，\u003cbr\u003e 可用浏览器调试\u003c/td\u003e\n\u003ctd\u003ebase_url/get/\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      … \u003cbr\u003e    }\u003cbr\u003e} \u003cbr\u003e {…}内为限制条件\u003cbr\u003e\u003cbr\u003e 例如获取一个 id = 235 的 Moment：\u003cbr\u003e \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fget\u0026amp;type=JSON\u0026amp;json=%7B%22Moment%22%3A%7B%22id%22%3A235%7D%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"id\":235\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eSELECT * FROM Moment WHERE id=235 LIMIT 1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      ...\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e例如\u003cbr\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"id\":235,\u003cbr\u003e      \"userId\":38710,\u003cbr\u003e      \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e }\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHEAD: \u003cbr\u003e 普通获取数量，\u003cbr\u003e 可用浏览器调试\u003c/td\u003e\n\u003ctd\u003ebase_url/head/\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      …\u003cbr\u003e    }\u003cbr\u003e } \u003cbr\u003e {…}内为限制条件 \u003cbr\u003e\u003cbr\u003e 例如获取一个 id = 38710 的 User 所发布的 Moment 总数：\u003cbr\u003e \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fhead\u0026amp;type=JSON\u0026amp;json=%7B%22Moment%22%3A%7B%22userId%22%3A38710%7D%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"userId\":38710\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eSELECT count(*) FROM Moment WHERE userId=38710 LIMIT 1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"count\":10\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e} \u003cbr\u003e 例如\u003cbr\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"count\":10\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e     \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGETS: \u003cbr\u003e 安全/私密获取数据，\u003cbr\u003e 用于获取钱包等\u003cbr\u003e对安全性要求高的数据\u003c/td\u003e\n\u003ctd\u003ebase_url/gets/\u003c/td\u003e\n\u003ctd\u003e最外层加一个 \"tag\":tag，例如 \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026amp;type=JSON\u0026amp;json=%7B%22tag%22%3A%22Privacy%22,%22Privacy%22%3A%7B%22id%22%3A82001%7D%7D\" rel=\"nofollow\"\u003e\"tag\":\"Privacy\"\u003c/a\u003e，其它同GET\u003c/td\u003e\n\u003ctd\u003e同GET\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHEADS: \u003cbr\u003e 安全/私密获取数量，\u003cbr\u003e 用于获取银行卡数量等\u003cbr\u003e对安全性要求高的数据总数\u003c/td\u003e\n\u003ctd\u003ebase_url/heads/\u003c/td\u003e\n\u003ctd\u003e最外层加一个 \"tag\":tag，例如 \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fheads\u0026amp;type=JSON\u0026amp;json=%7B%22tag%22%3A%22Verify%22,%22Verify%22%3A%7B%22phone%22%3A13000082001%7D%7D\" rel=\"nofollow\"\u003e\"tag\":\"Verify\"\u003c/a\u003e，其它同HEAD\u003c/td\u003e\n\u003ctd\u003e同HEAD\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePOST: \u003cbr\u003e 新增数据\u003c/td\u003e\n\u003ctd\u003ebase_url/post/\u003c/td\u003e\n\u003ctd\u003e单个： \u003cbr\u003e {\u003cbr\u003e    TableName:{\u003cbr\u003e      …\u003cbr\u003e    },\u003cbr\u003e    \"tag\":tag\u003cbr\u003e} \u003cbr\u003e {…}中id由后端生成，不能传 \u003cbr\u003e\u003cbr\u003e例如当前登录用户 38710 发布一个新 Comment：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost\u0026amp;type=JSON\u0026amp;json=%7B%22Comment%22:%7B%22momentId%22:12,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%22tag%22:%22Comment%22%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"momentId\":12,\u003cbr\u003e      \"content\":\"APIJSON,let interfaces and documents go to hell !\" \u003cbr\u003e    },\u003cbr\u003e    \"tag\":\"Comment\"\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eINSERT INTO Comment(userId,momentId,content) VALUES(38710,12,'APIJSON,let interfaces and documents go to hell !')\u003c/code\u003e \u003cbr\u003e  \u003cbr\u003e 批量： \u003cbr\u003e {\u003cbr\u003e    TableName[]:[{\u003cbr\u003e        …\u003cbr\u003e      }, {\u003cbr\u003e        …\u003cbr\u003e      }\u003cbr\u003e      …\u003cbr\u003e    ],\u003cbr\u003e    \"tag\":tag\u003cbr\u003e} \u003cbr\u003e {…}中id由后端生成，不能传 \u003cbr\u003e\u003cbr\u003e例如当前登录用户 82001 发布 2 个 Comment：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost\u0026amp;type=JSON\u0026amp;json=%7B%22Comment%5B%5D%22:%5B%7B%22momentId%22:12,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%7B%22momentId%22:15,%22content%22:%22APIJSON%20is%20a%20JSON%20transmision%20protocol.%22%7D%5D,%22tag%22:%22Comment:%5B%5D%22%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Comment[]\":[{\u003cbr\u003e      \"momentId\":12,\u003cbr\u003e      \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr\u003e      }, {\u003cbr\u003e      \"momentId\":15,\u003cbr\u003e      \"content\":\"APIJSON is a JSON transmision protocol.\"\u003cbr\u003e    }],\u003cbr\u003e    \"tag\":\"Comment:[]\"\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e  后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eINSERT INTO Comment(userId,momentId,content) VALUES(82001,12,'APIJSON,let interfaces and documents go to hell !');\u003c/code\u003e\u003cbr\u003e\u003cbr\u003e\u003ccode\u003eINSERT INTO Comment(userId,momentId,content) VALUES(82001,15,'APIJSON is a JSON transmision protocol.');\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e单个： \u003cbr\u003e {\u003cbr\u003e    TableName:{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"id\":38710\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e例如\u003cbr\u003e{\u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"id\":120\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e} \u003cbr\u003e \u003cbr\u003e 批量： \u003cbr\u003e {\u003cbr\u003e    TableName:{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"count\":5,\u003cbr\u003e      \"id[]\":[1, 2, 3, 4, 5]\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e例如\u003cbr\u003e{\u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"count\":2,\u003cbr\u003e      \"id[]\":[1, 2]\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePUT: \u003cbr\u003e 修改数据，\u003cbr\u003e 只修改所传的字段\u003c/td\u003e\n\u003ctd\u003ebase_url/put/\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      \"id\":id,\u003cbr\u003e      …\u003cbr\u003e    },\u003cbr\u003e    \"tag\":tag\u003cbr\u003e} \u003cbr\u003e {…} 中 id 或 id{} 至少传一个 \u003cbr\u003e\u003cbr\u003e例如当前登录用户 82001 修改 id = 235 的 Moment 的 content：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput\u0026amp;type=JSON\u0026amp;json=%7B%22Moment%22:%7B%22id%22:235,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%22tag%22:%22Moment%22%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Moment\":{\u003cbr\u003e      \"id\":235,\u003cbr\u003e      \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr\u003e    },\u003cbr\u003e    \"tag\":\"Moment\"\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eUPDATE Moment SET content='APIJSON,let interfaces and documents go to hell !' WHERE id=235 AND userId=82001 LIMIT 1\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e 批量除了 id{}:[] 也可类似批量 POST，只是每个 {...} 里面都必须有 id。\u003cbr\u003e\"tag\":\"Comment[]\" 对应对象 \"Comment\":{\"id{}\":[1,2,3]}，表示指定记录全部统一设置；\u003cbr\u003e\"tag\":\"Comment:[]\" 多了冒号，对应数组 \"Comment[]\":[{\"id\":1},{\"id\":2},{\"id\":3}]，表示每项单独设置\u003c/td\u003e\n\u003ctd\u003e同POST\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDELETE: \u003cbr\u003e 删除数据\u003c/td\u003e\n\u003ctd\u003ebase_url/delete/\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      \"id\":id\u003cbr\u003e    },\u003cbr\u003e    \"tag\":tag\u003cbr\u003e} \u003cbr\u003e {…} 中 id 或 id{} 至少传一个，一般只传 id 或 id{} \u003cbr\u003e\u003cbr\u003e例如当前登录用户 82001 批量删除 id = 100,110,120 的 Comment：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fdelete\u0026amp;type=JSON\u0026amp;json=%7B%22Comment%22:%7B%22id%7B%7D%22:%5B100,110,120%5D%7D,%22tag%22:%22Comment%5B%5D%22%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"id{}\":[100,110,120]\u003cbr\u003e    },\u003cbr\u003e    \"tag\":\"Comment[]\"\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr\u003e\u003ccode\u003eDELETE FROM Comment WHERE id IN(100,110,120) AND userId=82001 LIMIT 3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e{\u003cbr\u003e    TableName:{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"id[]\":[100,110,120]\u003cbr\u003e      \"count\":3\u003cbr\u003e    },\u003cbr\u003e    \"code\":200,\u003cbr\u003e    \"msg\":\"success\"\u003cbr\u003e}\u003cbr\u003e例如\u003cbr\u003e{\u003cbr\u003e   \"Comment\":{\u003cbr\u003e      \"code\":200,\u003cbr\u003e      \"msg\":\"success\",\u003cbr\u003e      \"id[]\":[100,110,120],\u003cbr\u003e      \"count\":3\u003cbr\u003e   },\u003cbr\u003e   \"code\":200,\u003cbr\u003e   \"msg\":\"success\"\u003cbr\u003e}\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e以上接口的简单形式: \u003cbr\u003e base_url/{method}/{tag}\u003c/td\u003e\n\u003ctd\u003eGET: 普通获取数据 \u003cbr\u003e base_url/get/{tag} \u003cbr\u003e\u003cbr\u003e HEAD: 普通获取数量 \u003cbr\u003e base_url/head/{tag} \u003cbr\u003e\u003cbr\u003e GETS: 安全/私密获取数据 \u003cbr\u003e  base_url/gets/{tag} \u003cbr\u003e\u003cbr\u003e HEADS: 安全/私密获取数量 \u003cbr\u003e base_url/heads/{tag} \u003cbr\u003e\u003cbr\u003e POST: 新增数据 \u003cbr\u003e  base_url/post/{tag} \u003cbr\u003e\u003cbr\u003e PUT: 修改数据  base_url/put/{tag} \u003cbr\u003e\u003cbr\u003e DELETE: 删除数据 \u003cbr\u003e base_url/delete/{tag}\u003c/td\u003e\n\u003ctd\u003e例如安全/私密获取一个 id = 82001 的 Privacy：\u003cbr\u003e \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets%2FPrivacy\u0026amp;type=JSON\u0026amp;json=%7B%22id%22%3A82001%7D\" rel=\"nofollow\"\u003ebase_url/gets/Privacy/ \u003cbr\u003e {\"id\":82001}\u003c/a\u003e \u003cbr\u003e 相当于 \u003cbr\u003e \u003ca href=\"http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026amp;type=JSON\u0026amp;json=%7B%22tag%22%3A%22Privacy%22,%22Privacy%22%3A%7B%22id%22%3A82001%7D%7D\" rel=\"nofollow\"\u003ebase_url/gets/ \u003cbr\u003e{\"tag\":\"Privacy\", \"Privacy\":{\"id\":82001}}\u003c/a\u003e \u003cbr\u003e \u003cbr\u003e 例如批量修改 id = 114, 124 的 Comment 的 content：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput%2FComment%5B%5D\u0026amp;type=JSON\u0026amp;json=%7B%22id%7B%7D%22%3A%5B114,124%5D,%22content%22%3A%22test%20multi%20put%22%7D\" rel=\"nofollow\"\u003ebase_url/put/Comemnt[]/ \u003cbr\u003e {\u003cbr\u003e    \"id{}\":[114,124],\u003cbr\u003e    \"content\":\"test multi put\"\u003cbr\u003e}\u003c/a\u003e \u003cbr\u003e 相当于 \u003cbr\u003e \u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput\u0026amp;type=JSON\u0026amp;json=%7B%22tag%22%3A%22Comment%5B%5D%22,%22Comment%22%3A%7B%22id%7B%7D%22%3A%5B114,124%5D,%22content%22%3A%22test%20multi%20put%22%7D%7D\" rel=\"nofollow\"\u003ebase_url/put/ \u003cbr\u003e {\u003cbr\u003e    \"tag\":\"Comment[]\", \u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"id{}\":[114,124],\u003cbr\u003e      \"content\":\"test multi put\"\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e同以上对应的方法\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e1.TableName指要查询的数据库表Table的名称字符串。第一个字符为大写字母，剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值的类型为JSONObject，结构是 {...}，里面放的是Table的字段(列名)。下同。\u003cbr\u003e\n2.\"tag\":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的标识，一般是要查询的Table的名称，由后端Request表中指定。下同。\u003cbr\u003e\n3.GET、HEAD请求是开放请求，可任意组合任意嵌套。其它请求为受限制的安全/私密请求，对应的 方法（method）, 标识（tag）, 版本（version）, 结构（structure） 都必须和 后端Request表中所指定的 一一对应，否则请求将不被通过。version 不传、为 null 或 \u0026lt;=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本。下同。\u003cbr\u003e\n4.GETS与GET、HEADS与HEAD分别为同一类型的操作方法，请求稍有不同但返回结果相同。下同。\u003cbr\u003e\n5.在HTTP通信中，自动化接口(get,gets,head,heads,post,put,delete) 全用HTTP POST请求。下同。\u003cbr\u003e\n6.所有JSONObject都视为容器(或者文件夹)，结构为 {...} ，里面可以放普通对象或子容器。下同。\u003cbr\u003e\n7.每个对象都有一个唯一的路径(或者叫地址)，假设对象名为refKey，则用 key0/key1/.../refKey 表示。下同。\u003c/p\u003e\n\u003cbr\u003e\n\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 id=\"user-content-3.2\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3.2 功能符\u003c/h3\u003e\u003ca id=\"user-content-32-功能符\" class=\"anchor\" aria-label=\"Permalink: 3.2 功能符\" href=\"#32-功能符\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\u003ch3 dir=\"auto\"\u003e\u003c/h3\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e功能\u003c/th\u003e\n\u003cth\u003e键值对格式\u003c/th\u003e\n\u003cth\u003e使用示例\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e查询数组\u003c/td\u003e\n\u003ctd\u003e\"key[]\":{}，后面是 JSONObject，key 可省略。当 key 和里面的 Table 名相同时，Table 会被提取出来，即 {Table:{Content}} 会被转化为 {Content}\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%7D%7D%7D\" rel=\"nofollow\"\u003e{\"User[]\":{\"User\":{}}}\u003c/a\u003e，查询一个 User 数组。这里 key 和 Table 名都是 User，User 会被提取出来，即 {\"User\":{\"id\", ...}} 会被转化为 {\"id\", ...}，如果要进一步提取 User 中的 id，可以把 User[] 改为 User-id[]，其中 - 用来分隔路径中涉及的 key\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e匹配选项范围\u003c/td\u003e\n\u003ctd\u003e\"key{}\":[]，后面是 JSONArray，作为 key 可取的值的选项\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22id%7B%7D%22:%5B38710,82001,70793%5D%7D%7D%7D\" rel=\"nofollow\"\u003e\"id{}\":[38710,82001,70793]\u003c/a\u003e，对应 SQL 是\u003ccode\u003eid IN(38710,82001,70793)\u003c/code\u003e，查询 id 符合 38710,82001,70793 中任意一个的一个 User 数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e匹配条件范围\u003c/td\u003e\n\u003ctd\u003e\"key{}\":\"条件0,条件1...\"，条件为 SQL 表达式字符串，可进行数字比较运算等\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22id%7B%7D%22:%22%3C=80000,%3E90000%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"id{}\":\"\u0026lt;=80000,\u0026gt;90000\"\u003c/a\u003e，对应 SQL 是\u003ccode\u003eid\u0026lt;=80000 OR id\u0026gt;90000\u003c/code\u003e，查询 id 符合 id\u0026lt;=80000 | id\u0026gt;90000 的一个 User 数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e包含选项范围\u003c/td\u003e\n\u003ctd\u003e\"key\u0026lt;\u0026gt;\":value  =\u0026gt;  \"key\u0026lt;\u0026gt;\":[value]，key 对应值的类型必须为 JSONArray，value 值类型只能为 Boolean, Number, String 中的一种\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22contactIdList%3C%3E%22:38710%7D%7D%7D\" rel=\"nofollow\"\u003e\"contactIdList\u0026lt;\u0026gt;\":38710\u003c/a\u003e，对应SQL是\u003ccode\u003ejson_contains(contactIdList,38710)\u003c/code\u003e，查询 contactIdList 包含 38710 的一个 User 数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e判断是否存在\u003c/td\u003e\n\u003ctd\u003e\"key}{@\":{\u003cbr\u003e    \"from\":\"Table\",\u003cbr\u003e    \"Table\":{ ... }\u003cbr\u003e}\u003cbr\u003e其中：\u003cbr\u003e}{ 表示 EXISTS；\u003cbr\u003e key 用来标识是哪个判断；\u003cbr\u003e @ 后面是 子查询 对象，具体见下方 子查询 的说明。\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%7D%7B@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22momentId%22:15%7D%7D%7D%7D\" rel=\"nofollow\"\u003e\"id}{@\":{\u003cbr\u003e    \"from\":\"Comment\",\u003cbr\u003e    \"Comment\":{\u003cbr\u003e        \"momentId\":15 \u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e WHERE EXISTS(SELECT * FROM Comment WHERE momentId=15)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e远程调用函数\u003c/td\u003e\n\u003ctd\u003e\"key()\":\"函数表达式\"，函数表达式为 function(key0,key1...)，会调用后端对应的函数 function(JSONObject request, String key0, String key1...)，实现 参数校验、数值计算、数据同步、消息推送、字段拼接、结构变换 等特定的业务逻辑处理，\u003cbr\u003e可使用 - 和 + 表示优先级，解析 key-() \u0026gt; 解析当前对象 \u0026gt; 解析 key() \u0026gt; 解析子对象 \u0026gt; 解析 key+()\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22id%22:301,%22isPraised()%22:%22isContain(praiseUserIdList,userId)%22%7D%7D\" rel=\"nofollow\"\u003e\"isPraised()\":\"isContain(praiseUserIdList,userId)\"\u003c/a\u003e，会调用远程函数 \u003ca href=\"https://github.com/APIJSON/apijson-framework/blob/master/src/main/java/apijson/framework/APIJSONFunctionParser.java#L361-L374\"\u003eboolean isContain(JSONObject request, String array, String value)\u003c/a\u003e ，然后变为 \"isPraised\":true 这种（假设点赞用户 id 列表包含了 userId，即这个 User 点了赞）\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e存储过程\u003c/td\u003e\n\u003ctd\u003e\"@key()\":\"SQL函数表达式\"，函数表达式为 \u003cbr\u003e  function(key0,key1...) \u003cbr\u003e 会调用后端数据库对应的存储过程 SQL 函数 \u003cbr\u003e function(String key0, String key1...) \u003cbr\u003e 除了参数会提前赋值，其它和 远程函数 一致\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22@limit%22:10,%22@offset%22:0,%22@procedure()%22:%22getCommentByUserId(id,@limit,@offset)%22%7D%7D\" rel=\"nofollow\"\u003e\"@limit\":10, \u003cbr\u003e \"@offset\":0, \u003cbr\u003e \"@procedure()\":\"getCommentByUserId(id,@limit,@offset)\"\u003c/a\u003e \u003cbr\u003e 会转为 \u003cbr\u003e \u003ccode\u003egetCommentByUserId(38710,10,0)\u003c/code\u003e \u003cbr\u003e 来调用存储过程 SQL 函数 \u003cbr\u003e \u003ccode\u003egetCommentByUserId(IN id bigint, IN limit int, IN offset int)\u003c/code\u003e \u003cbr\u003e 然后变为 \u003cbr\u003e\"procedure\":{\u003cbr\u003e    \"count\":-1, \u003cbr\u003e    \"update\":false, \u003cbr\u003e    \"list\":[] \u003cbr\u003e } \u003cbr\u003e 其中 count 是指写操作影响记录行数，-1 表示不是写操作；update 是指是否为写操作（增删改）；list 为返回结果集\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e引用赋值\u003c/td\u003e\n\u003ctd\u003e\"key@\":\"key0/key1/.../refKey\"，引用路径为用 / 分隔的字符串。以 / 开头的是缺省引用路径，从声明 key 所处容器的父容器路径开始；其它是完整引用路径，从最外层开始。\u003cbr\u003e 被引用的 refKey 必须在声明 key 的上面。如果对 refKey 的容器指定了返回字段，则被引用的 refKey 必须写在 @column 对应的值内，例如 \"@column\":\"refKey,key1,...\"\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D%7D\" rel=\"nofollow\"\u003e\"Moment\":{\u003cbr\u003e    \"userId\":38710\u003cbr\u003e},\u003cbr\u003e\"User\":{\u003cbr\u003e    \"id@\":\"/Moment/userId\"\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e User 内的 id 引用了与 User 同级的 Moment 内的 userId，\u003cbr\u003e即 User.id = Moment.userId，请求完成后\u003cbr\u003e \"id@\":\"/Moment/userId\" 会变成 \"id\":38710\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e子查询\u003c/td\u003e\n\u003ctd\u003e\"key@\":{\u003cbr\u003e    \"range\":\"ALL\", \u003cbr\u003e    \"from\":\"Table\", // 可省略，默认为首个表对象 key 名\u003cbr\u003e    \"Table\":{ ... }\u003cbr\u003e}\u003cbr\u003e其中：\u003cbr\u003erange 可为 ALL,ANY；\u003cbr\u003efrom 为目标表 Table 的名称；\u003cbr\u003e@ 后面的对象类似数组对象，可使用 count 和 join 等功能。\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22@column%22:%22min(userId)%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003e\"id@\":{\u003cbr\u003e    \"from\":\"Comment\", // 可省略\u003cbr\u003e    \"Comment\":{\u003cbr\u003e        \"@column\":\"min(userId)\" \u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e WHERE id=(SELECT min(userId) FROM Comment)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e模糊搜索\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e\"key$\":\"SQL搜索表达式\"\u003c/code\u003e =\u0026gt; \u003ccode\u003e\"key$\":[\"SQL搜索表达式\"]\u003c/code\u003e，任意 SQL 搜索表达式字符串，如 %key%(包含 key), key%(以 key 开始), %k%e%y%(包含字母 k,e,y) 等，% 表示任意字符\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22name$%22:%22%2525m%2525%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"name$\":\"%m%\"\u003c/a\u003e，对应 SQL 是\u003ccode\u003ename LIKE '%m%'\u003c/code\u003e，查询 name 包含 \"m\" 的一个 User 数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e正则匹配\u003c/td\u003e\n\u003ctd\u003e\"key~\":\"正则表达式\" =\u0026gt; \"key~\":[\"正则表达式\"]，任意正则表达式字符串，如 ^[0-9]+$ ，*~ 忽略大小写，可用于高级搜索\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22name~%22:%22%5E%5B0-9%5D%252B$%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"name~\":\"^[0-9]+$\"\u003c/a\u003e，对应 SQL 是\u003ccode\u003ename REGEXP '^[0-9]+$'\u003c/code\u003e，查询 name 中字符全为数字的一个 User 数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e连续范围\u003c/td\u003e\n\u003ctd\u003e\"key%\":\"start,end\" =\u0026gt; \"key%\":[\"start,end\"]，其中 start 和 end 都只能为 Number, String 中的一种，如 \"2017-01-01,2019-01-01\" ，[\"1,90000\", \"82001,100000\"] ，可用于连续范围内的筛选\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22date%2525%22:%222017-10-01,2018-10-01%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"date%\":\"2017-10-01,2018-10-01\"\u003c/a\u003e，对应SQL是\u003ccode\u003edate BETWEEN '2017-10-01' AND '2018-10-01'\u003c/code\u003e，查询在2017-10-01和2018-10-01期间注册的用户的一个User数组\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e新建别名\u003c/td\u003e\n\u003ctd\u003e\"name:alias\"，name 映射为 alias，用 alias 替代 name。可用于 column,Table,SQL 函数 等。只用于 GET 类型、HEAD 类型的请求\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Comment%22:%7B%22@column%22:%22id,toId:parentId%22,%22id%22:51%7D%7D\" rel=\"nofollow\"\u003e\"@column\":\"toId:parentId\"\u003c/a\u003e，对应 SQL 是\u003ccode\u003etoId AS parentId\u003c/code\u003e，将查询的字段 toId 变为 parentId 返回\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e增加 或 扩展\u003c/td\u003e\n\u003ctd\u003e\"key+\":Object，Object的类型由key指定，且类型为 Number,String,JSONArray 中的一种。如 82001,\"apijson\",[\"url0\",\"url1\"] 等。只用于 PUT 请求\u003c/td\u003e\n\u003ctd\u003e\"praiseUserIdList+\":[82001]，对应 SQL 是\u003ccode\u003ejson_insert(praiseUserIdList,82001)\u003c/code\u003e，添加一个点赞用户 id，即这个用户点了赞\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e减少 或 去除\u003c/td\u003e\n\u003ctd\u003e\"key-\":Object，与\"key+\"相反\u003c/td\u003e\n\u003ctd\u003e\"balance-\":100.00，对应SQL是\u003ccode\u003ebalance = balance - 100.00\u003c/code\u003e，余额减少100.00，即花费了100元\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e比较运算\u003c/td\u003e\n\u003ctd\u003e\u0026gt;, \u0026lt;, \u0026gt;=, \u0026lt;= 比较运算符，用于 \u003cbr\u003e① 提供 \"id{}\":\"\u0026lt;=90000\" 这种条件范围的简化写法 \u003cbr\u003e\u003cbr\u003e② 实现子查询相关比较运算\u003cbr\u003e\u003cbr\u003e不支持 \"key=\":Object 和 \"key!=\":Object 这两种写法，直接用更简单的 \"key\":Object 和 \"key!\":Object 替代。\u003c/td\u003e\n\u003ctd\u003e① \u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22User%22:%7B%22id%3C=%22:90000%7D%7D%7D\" rel=\"nofollow\"\u003e\"id\u0026lt;=\":90000\u003c/a\u003e，对应 SQL 是\u003ccode\u003eid\u0026lt;=90000\u003c/code\u003e，查询符合id\u0026lt;=90000的一个User数组\u003cbr\u003e\u003cbr\u003e ② \u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%3E@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22@column%22:%22min(userId)%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003e\"id\u0026gt;@\":{\u003cbr\u003e    \"from\":\"Comment\",\u003cbr\u003e    \"Comment\":{\u003cbr\u003e        \"@column\":\"min(userId)\" \u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e WHERE id\u0026gt;(SELECT min(userId) FROM Comment)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e逻辑运算\u003c/td\u003e\n\u003ctd\u003e\u0026amp;, |, ! 逻辑运算符，对应数据库 SQL 中的 AND, OR, NOT。 \u003cbr\u003e横或纵与：同一键值对的值内条件默认 | 或连接，可以在 key 后加逻辑运算符来具体指定；不同键值对的条件默认 \u0026amp; 与连接，可以用下面说明的对象关键词 @combine 来具体指定。 \u003cbr\u003e\u003cbr\u003e① \u0026amp; 可用于 \"key\u0026amp;{}\":\"条件\"等\u003cbr\u003e\u003cbr\u003e② | 可用于 \"key|{}\":\"条件\", \"key|{}\":[]等，一般可省略\u003cbr\u003e\u003cbr\u003e③ ! 可单独使用，如 \"key!\":Object，也可像 \u0026amp;,| 一样配合其他功能符使用 \u003cbr\u003e \"key!\":null 无效，null 值会导致整个键值对被忽略解析，可以用 \"key{}\":\"!=null\" 替代，\u003cbr\u003e\"key\":null 同理，用 \"key{}\":\"=null\" 替代。\u003c/td\u003e\n\u003ctd\u003e① \u003ca href=\"http://apijson.cn:8080/head/%7B%22User%22:%7B%22id\u0026amp;%7B%7D%22:%22%3E80000,%3C=90000%22%7D%7D\" rel=\"nofollow\"\u003e\"id\u0026amp;{}\":\"\u0026gt;80000,\u0026lt;=90000\"\u003c/a\u003e，对应SQL是\u003ccode\u003eid\u0026gt;80000 AND id\u0026lt;=90000\u003c/code\u003e，即id满足id\u0026gt;80000 \u0026amp; id\u0026lt;=90000\u003cbr\u003e\u003cbr\u003e ② \u003ca href=\"http://apijson.cn:8080/head/%7B%22User%22:%7B%22id%7C%7B%7D%22:%22%3E90000,%3C=80000%22%7D%7D\" rel=\"nofollow\"\u003e\"id|{}\":\"\u0026gt;90000,\u0026lt;=80000\"\u003c/a\u003e，同 \"id{}\":\"\u0026gt;90000,\u0026lt;=80000\"，对应 SQL 是\u003ccode\u003eid\u0026gt;90000 OR id\u0026lt;=80000\u003c/code\u003e，即 id 满足 id\u0026gt;90000 | id\u0026lt;=80000\u003cbr\u003e\u003cbr\u003e ③ \u003ca href=\"http://apijson.cn:8080/head/%7B%22User%22:%7B%22id!%7B%7D%22:%5B82001,38710%5D%7D%7D\" rel=\"nofollow\"\u003e\"id!{}\":[82001,38710]\u003c/a\u003e，对应 SQL 是\u003ccode\u003eid NOT IN(82001,38710)\u003c/code\u003e，即 id 满足 ! (id=82001 | id=38710)，可过滤黑名单的消息\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e数组关键词，可自定义\u003c/td\u003e\n\u003ctd\u003e\"key\":Object，key为 \"[]\":{} 中 {} 内的关键词，Object 的类型由 key 指定\u003cbr\u003e\u003cbr\u003e① \"count\":5，查询数量，0 表示最大值，默认值为 10，默认最大值为 100 \u003cbr\u003e\u003cbr\u003e② \"page\":1，查询页码，从 0 开始，默认值为 0，默认最大值为 100，一般和 count 一起用\u003cbr\u003e\u003cbr\u003e③ \"query\":2，查询内容\u003cbr\u003e0-对象，1-总数和分页详情，2-数据、总数和分页详情\u003cbr\u003e总数关键词为 total，分页详情关键词为 info，\u003cbr\u003e 它们都和 query 同级，通过引用赋值得到自定义 key:value 键值对，不传则返回默认键值对，例如  \u003cbr\u003e\"total@\":\"/[]/total\", \"info@\":\"/[]/info\" \u003cbr\u003e这里query及total仅为GET类型的请求提供方便，\u003cbr\u003e 一般可直接用HEAD类型的请求获取总数\u003cbr\u003e\u003cbr\u003e④ \"join\":\"\u0026amp;/Table0,\u0026lt;/Table1/key1@\" 或 \u003cbr\u003e\"join\":{\u003cbr\u003e    \"\u0026amp;/Table0\":{},  // 支持 ON 多个字段关联,\u003cbr\u003e    \"\u0026lt;/Table1/key1@\":{  // ON 只允许指定的 key1 关联\u003cbr\u003e      \"key0\":value0, // 其它ON条件 \u003cbr\u003e      \"key2\":value2,\u003cbr\u003e      ... \u003cbr\u003e      \"@combine\":\"...\", // 其它ON条件的组合方式 \u003cbr\u003e      \"@column\":\"...\", // 外层 SELECT \u003cbr\u003e      \"@group\":\"...\", // 外层 GROUP BY \u003cbr\u003e      \"@having\":\"...\" // 外层 HAVING \u003cbr\u003e    }\u003cbr\u003e}\u003cbr\u003e多表连接方式：\u003cbr\u003e  \"@\" - APP JOIN \u003cbr\u003e \"\u0026lt;\" - LEFT JOIN \u003cbr\u003e \"\u0026gt;\" - RIGHT JOIN \u003cbr\u003e \"\u0026amp;\" - INNER JOIN \u003cbr\u003e \"|\" - FULL JOIN \u003cbr\u003e  \"!\" - OUTER JOIN \u003cbr\u003e  \"*\" - CROSS JOIN \u003cbr\u003e  \"^\" - SIDE JOIN \u003cbr\u003e  \"(\" - ANTI JOIN \u003cbr\u003e  \")\" - FOREIGN JOIN \u003cbr\u003e其中 @ APP JOIN 为应用层连表，会从已查出的主表里取得所有副表 key@ 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...]，然后把原来副表 count 次查询 key=$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能；\u003cbr\u003e 其它 JOIN 都是 SQL JOIN，具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应 \u003cbr\u003e\u003ccode\u003e\"join\":\"\u0026lt;/ViceTable/key@\",\u003c/code\u003e\u003cbr\u003e\u003ccode\u003e\"MainTable\":{},\u003c/code\u003e\u003cbr\u003e\u003ccode\u003e\"ViceTable\":{\"key@\":\"/MainTable/refKey\"}\u003c/code\u003e\u003cbr\u003e会对应生成 \u003cbr\u003e\u003ccode\u003eMainTable LEFT JOIN ViceTable\u003c/code\u003e \u003cbr\u003e\u003ccode\u003eON ViceTable.key=MainTable.refKey\u003c/code\u003e AND 其它ON条件 \u003cbr\u003e 除了 = 等价关联，也支持 ! 不等关联、\u0026gt; \u0026lt; \u0026gt;= \u0026lt;= 等比较关联和 $ ~ {} \u0026lt;\u0026gt; 等其它复杂关联方式 \u003cbr\u003e\u003cbr\u003e⑤ \"otherKey\":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值\u003c/td\u003e\n\u003ctd\u003e① 查询User数组，最多5个：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:5,%22User%22:%7B%7D%7D%7D\" rel=\"nofollow\"\u003e\"count\":5\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eLIMIT 5\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ② 查询第3页的User数组，每页5个：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:5,%22page%22:3,%22User%22:%7B%7D%7D%7D\" rel=\"nofollow\"\u003e\"count\":5,\u003cbr\u003e\"page\":3\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eLIMIT 5 OFFSET 15\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ③ 查询User数组和对应的User总数：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22query%22:2,%22count%22:5,%22User%22:%7B%7D%7D,%22total@%22:%22%252F%5B%5D%252Ftotal%22,%22info@%22:%22%252F%5B%5D%252Finfo%22%7D\" rel=\"nofollow\"\u003e\"[]\":{\u003cbr\u003e    \"query\":2,\u003cbr\u003e    \"User\":{}\u003cbr\u003e},\u003cbr\u003e\"total@\":\"/[]/total\", // 可省略\u003cbr\u003e\"info@\":\"/[]/info\" // 可省略\u003c/a\u003e\u003cbr\u003e 返回的数据中，总数及分页详情结构为： \u003cbr\u003e  \"total\":139, // 总数 \u003cbr\u003e \"info\":{ // 分页详情 \u003cbr\u003e    \"total\":139, // 总数 \u003cbr\u003e    \"count\":5, // 每页数量 \u003cbr\u003e    \"page\":0, // 当前页码 \u003cbr\u003e    \"max\":27, // 最大页码 \u003cbr\u003e    \"more\":true, // 是否还有更多 \u003cbr\u003e    \"first\":true, // 是否为首页 \u003cbr\u003e    \"last\":false // 是否为尾页 \u003cbr\u003e} \u003cbr\u003e\u003cbr\u003e ④ Moment INNER JOIN User LEFT JOIN Comment：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api/?type=JSON\u0026amp;url=http://apijson.cn:8080/get\u0026amp;json=%7B%22%5B%5D%22:%7B%22count%22:5,%22join%22:%22%26%2FUser%2Fid@,%3C%2FComment%22,%22Moment%22:%7B%22@column%22:%22id,userId,content%22,%22@group%22:%22id%22%7D,%22User%22:%7B%22name~%22:%22t%22,%22id@%22:%22%2FMoment%2FuserId%22,%22@column%22:%22id,name,head%22%7D,%22Comment%22:%7B%22momentId@%22:%22%2FMoment%2Fid%22,%22@column%22:%22id,momentId,content%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"[]\":{\u003cbr\u003e    \"join\":\"\u0026amp;/User/id@,\u0026lt;/Comment\",\u003cbr\u003e    \"Moment\":{\u003cbr\u003e     \"@group\":\"id\" // 主副表不是一对一，要去除重复数据\u003cbr\u003e   },\u003cbr\u003e    \"User\":{\u003cbr\u003e      \"name~\":\"t\",\u003cbr\u003e      \"id@\":\"/Moment/userId\"\u003cbr\u003e    },\u003cbr\u003e    \"Comment\":{\u003cbr\u003e      \"momentId@\":\"/Moment/id\"\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ⑤ 每一层都加当前用户名：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%7D,%22%5B%5D%22:%7B%22name@%22:%22User%252Fname%22,%22Moment%22:%7B%7D%7D%7D\" rel=\"nofollow\"\u003e\"User\":{},\u003cbr\u003e\"[]\":{\u003cbr\u003e    \"name@\":\"User/name\", // 自定义关键词\u003cbr\u003e    \"Moment\":{}\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e对象关键词，可自定义\u003c/td\u003e\n\u003ctd\u003e\"@key\":Object，@key 为 Table:{} 中 {} 内的关键词，Object 的类型由 @key 指定\u003cbr\u003e\u003cbr\u003e① \"@combine\":\"key0 | (key1 \u0026amp; (key2 | !key3))...\"，条件组合方式，最终按 \u003cbr\u003e (其它key条件 AND 连接) AND (key0条件 OR (key1条件 AND (key2条件 OR (NOT key3条件)))) \u003cbr\u003e这种方式连接，其中 \"其它key\" 是指与 @combine 在同一对象，且未被它声明的条件 key，默认都是 \u0026amp; 连接。注意不要缺少或多余任何一个空格。 \u003cbr\u003e\u003cbr\u003e② \"@column\":\"column;function(arg)...\"，返回字段\u003cbr\u003e\u003cbr\u003e③ \"@order\":\"column0+,column1-...\"，排序方式\u003cbr\u003e\u003cbr\u003e④ \"@group\":\"column0,column1...\"，分组方式。如果 @column 里声明了 Table 的 id，则 id 也必须在 @group 中声明；其它情况下必须满足至少一个条件:\u003cbr\u003e1.分组的 key 在 @column 里声明\u003cbr\u003e2.Table 主键在 @group 中声明 \u003cbr\u003e\u003cbr\u003e⑤ \"@having\":\"function0(...)?value0;function1(...)?value1;function2(...)?value2...\" // OR 连接，或 \u003cbr\u003e\"@having\u0026amp;\":\"function0(...)?value0;function1(...)?value1;function2(...)?value2...\" // AND 连接，或 \u003cbr\u003e\"@having\":{\u003cbr\u003e   \"h0\":\"function0(...)?value0\",\u003cbr\u003e   \"h1\":function1(...)?value1\",\u003cbr\u003e   \"h2\":function2(...)?value2...\",\u003cbr\u003e   \"@combine\":\"h0 \u0026amp; (h1 | !h2)\"  // 任意组合，非必传\u003cbr\u003e}\u003cbr\u003eSQL 函数条件，一般和 @group 一起用，函数一般在 @column 里声明\u003cbr\u003e\u003cbr\u003e⑥ \"@schema\":\"sys\"，集合空间(数据库名/模式)，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr\u003e\u003cbr\u003e⑦ \"@database\":\"POSTGRESQL\"，数据库类型，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr\u003e\u003cbr\u003e⑧ \"@datasource\":\"DRUID\"，跨数据源，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr\u003e\u003cbr\u003e⑨ \"@json\":\"key0,key1...\"，转为 JSON 格式返回，符合 JSONObject 则转为 {...}，符合 JSONArray 则转为 [...] \u003cbr\u003e\u003cbr\u003e⑩ \"@role\":\"OWNER\"，来访角色，包括\u003cbr\u003eUNKNOWN,LOGIN,CONTACT,CIRCLE,OWNER,ADMIN，\u003cbr\u003e可以在最外层作为全局默认配置，\u003cbr\u003e可自定义其它角色并重写 Verifier.verify 等相关方法来自定义校验 \u003cbr\u003e\u003cbr\u003e⑪ \"@explain\":true，性能分析，可以在最外层作为全局默认配置 \u003cbr\u003e\u003cbr\u003e⑫ \"@raw\":\"key0,key1...\"，其中 key0, key1 都对应有键值对\u003cbr\u003e \"key0\":\"SQL片段或SQL片段的别名\", \u003cbr\u003e \"key1\":\"SQL片段或SQL片段的别名\" \u003cbr\u003e 自定义原始SQL片段，可扩展嵌套SQL函数等复杂语句，必须是后端已配置的，只有其它功能符都做不到才考虑，谨慎使用，注意防 SQL 注入\u003cbr\u003e\u003cbr\u003e⑬ \"@null\":\"key1,key2...\"，空值键值对，自动插入 key1:null, key2:null ... 并作为有效键值对执行，作为条件时对应 SQL 是 \u003ccode\u003eWHERE tag IS NULL\u003c/code\u003e，作为值时对应 SQL 是 \u003ccode\u003eSET tag = NULL\u003c/code\u003e\u003cbr\u003e\u003cbr\u003e⑭ \"@otherKey\":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值\u003c/td\u003e\n\u003ctd\u003e① 搜索 name 或 tag 任何一个字段包含字符 a 的 User 列表：\u003cbr\u003e \u003ca href=\"http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:10,%22User%22:%7B%22@column%22:%22id,name,tag%22,%22name~%22:%22a%22,%22tag~%22:%22a%22,%22@combine%22:%22name~%20%7C%20tag~%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"name~\":\"a\",\u003cbr\u003e\"tag~\":\"a\",\u003cbr\u003e\"@combine\":\"name~ | tag~\"\u003c/a\u003e \u003cbr\u003e对应SQL是\u003ccode\u003ename REGEXP 'a' OR tag REGEXP 'a'\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ② 只查询 id,sex,name 这几列并且请求结果也按照这个顺序：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22@column%22:%22id,sex,name%22,%22id%22:38710%7D%7D\" rel=\"nofollow\"\u003e\"@column\":\"id,sex,name\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eSELECT id,sex,name\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ③ 查询按 name 降序、id 默认顺序 排序的 User 数组：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22User%22:%7B%22@column%22:%22name,id%22,%22@order%22:%22name-,id%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@order\":\"name-,id\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eORDER BY name DESC,id\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ④ 查询按 userId 分组的 Moment 数组：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId,id%22,%22@group%22:%22userId,id%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@group\":\"userId,id\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eGROUP BY userId,id\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ⑤ 查询 按 userId 分组、id 最大值\u0026gt;=100 的 Moment 数组：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId%253Bmax(id)%22,%22@group%22:%22userId%22,%22@having%22:%22max(id)%3E=100%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@column\":\"userId;max(id)\",\u003cbr\u003e\"@group\":\"userId\",\u003cbr\u003e\"@having\":\"max(id)\u0026gt;=100\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eSELECT userId,max(id) ... GROUP BY userId HAVING max(id)\u0026gt;=100\u003c/code\u003e \u003cbr\u003e还可以指定函数返回名：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId%253Bmax(id):maxId%22,%22@group%22:%22userId%22,%22@having%22:%22(maxId)%3E=100%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@column\":\"userId;max(id):maxId\",\u003cbr\u003e\"@group\":\"userId\",\u003cbr\u003e\"@having\":\"(maxId)\u0026gt;=100\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eSELECT userId,max(id) AS maxId ... GROUP BY userId HAVING (maxId)\u0026gt;=100\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ⑥ 查询 sys 内的 User 表：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22@schema%22:%22sys%22%7D%7D\" rel=\"nofollow\"\u003e\"@schema\":\"sys\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eFROM sys.User\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ⑦ 查询 PostgreSQL 数据库的 User 表：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22@database%22:%22POSTGRESQL%22,%22@explain%22:true%7D%7D\" rel=\"nofollow\"\u003e\"@database\":\"POSTGRESQL\"\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ⑧ 使用 Druid 连接池查询 User 表：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22@datasource%22:%22DRUID%22%7D%7D\" rel=\"nofollow\"\u003e\"@datasource\":\"DRUID\"\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ⑨ 将 VARCHAR 字符串字段 get 转为 JSONArray 返回：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22Access%22:%7B%22@json%22:%22get%22%7D%7D\" rel=\"nofollow\"\u003e\"@json\":\"get\"\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ⑩ 查询当前用户的动态：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@role%22:%22OWNER%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@role\":\"OWNER\"\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ⑪ 开启性能分析：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@explain%22:true%7D%7D%7D\" rel=\"nofollow\"\u003e\"@explain\":true\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eEXPLAIN\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ⑫ 统计最近一周偶数 userId 的数量\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@column%22:%22date%3bleft(date,10):day%3bsum(if(userId%252=0,1,0))%22,%22@group%22:%22day%22,%22@having%22:%22to_days(now())-to_days(%60date%60)%3C=7%22,%22@raw%22:%22@column,@having%22%7D%7D%7D\" rel=\"nofollow\"\u003e\"@column\":\"date;left(date,10):day;sum(if(userId%2=0,1,0))\",\u003cbr\u003e\"@group\":\"day\",\u003cbr\u003e\"@having\":\"to_days(now())-to_days(`date`)\u0026lt;=7\",\u003cbr\u003e\"@raw\":\"@column,@having\"\u003c/a\u003e\u003cbr\u003e对应 SQL 是\u003ccode\u003eSELECT date, left(date,10) AS day, sum(if(userId%2=0,1,0)) ... GROUP BY day HAVING to_days(now())-to_days(`date`)\u0026lt;=7\u003c/code\u003e \u003cbr\u003e\u003cbr\u003e ⑬ 把用户的标签设置为空 \u003cbr\u003e\u003ca href=\"http://apijson.cn/api/?type=JSON\u0026amp;url=http://apijson.cn:8080/put/User\u0026amp;json=%7B%22id%22:82001,%22@null%22:%22tag%22,%22@explain%22:true%7D\" rel=\"nofollow\"\u003e\"@null\":\"tag\"\u003c/a\u003e \u003cbr\u003e\u003cbr\u003e ⑭  从pictureList 获取第 0 张图片：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710,%22@position%22:0,%22firstPicture()%22:%22getFromArray(pictureList,@position)%22%7D%7D\" rel=\"nofollow\"\u003e\"@position\":0, // 自定义关键词\u003cbr\u003e\"firstPicture()\":\"getFromArray(pictureList,@position)\"\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e全局关键词\u003c/td\u003e\n\u003ctd\u003e为最外层对象 {} 内的关键词。其中 @database，@schema, @datasource, @role, @explain 基本同对象关键词，见上方说明，区别是全局关键词会每个表对象中没有时自动放入，作为默认值。 \u003cbr\u003e\u003cbr\u003e① \"tag\":\"Table\"，后面的 tag 是非 GET、HEAD 请求中匹配请求的 JSON 结构的标识，一般是要查询的 Table 的名称或该名称对应的数组 Table[] 或 Table:[]，由后端 Request 表中指定。 \u003cbr\u003e\u003cbr\u003e② \"version\":1，接口版本，version 不传、为 null 或 \u0026lt;=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本，由后端 Request 表中指定。\u003cbr\u003e\u003cbr\u003e③ \"format\":true，格式化返回 Response JSON 的 key，一般是将 TableName 转为 tableName, TableName[] 转为 tableNameList, Table:alias 转为 alias, TableName-key[] 转为 tableNameKeyList 等小驼峰格式。\u003c/td\u003e\n\u003ctd\u003e①  查隐私信息：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026amp;type=JSON\u0026amp;json=%7B%22tag%22:%22Privacy%22,%22Privacy%22:%7B%22id%22:82001%7D%7D\" rel=\"nofollow\"\u003e{\"tag\":\"Privacy\",\"Privacy\":{\"id\":82001}}\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e ② 使用第 1 版接口查隐私信息：\u003cbr\u003e\u003ca href=\"http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026amp;type=JSON\u0026amp;json=%7B%22version%22:1,%22tag%22:%22Privacy%22,%22Privacy%22:%7B%22id%22:82001%7D%7D\" rel=\"nofollow\"\u003e{\"version\":1,\"tag\":\"Privacy\",\"Privacy\":{\"id\":82001}}\u003c/a\u003e \u003cbr\u003e\u003cbr\u003e ③ 格式化朋友圈接口返回 JSON 中的 key：\u003cbr\u003e\u003ca href=\"http://apijson.cn:8080/get/%7B%22format%22:true,%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D\" rel=\"nofollow\"\u003e{\u003cbr\u003e    \"format\":true, \u003cbr\u003e    \"[]\":{\u003cbr\u003e      \"page\":0, \u003cbr\u003e      \"count\":3, \u003cbr\u003e      \"Moment\":{}, \u003cbr\u003e      \"User\":{\u003cbr\u003e        \"id@\":\"/Moment/userId\"\u003cbr\u003e      },\u003cbr\u003e      \"Comment[]\":{\u003cbr\u003e        \"count\":3,\u003cbr\u003e        \"Comment\":{\u003cbr\u003e          \"momentId@\":\"[]/Moment/id\"\u003cbr\u003e        }\u003cbr\u003e      }\u003cbr\u003e    }\u003cbr\u003e}\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cbr\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"APIJSON 通用文档","fully_qualified_name":"APIJSON 通用文档","kind":"section_1","ident_start":88,"ident_end":108,"extent_start":86,"extent_end":64578,"ident_utf16":{"start":{"line_number":3,"utf16_col":2},"end":{"line_number":3,"utf16_col":14}},"extent_utf16":{"start":{"line_number":3,"utf16_col":0},"end":{"line_number":426,"utf16_col":0}}},{"name":"[1.示例](#1)","fully_qualified_name":"[1.示例](#1)","kind":"section_3","ident_start":961,"ident_end":975,"extent_start":957,"extent_end":976,"ident_utf16":{"start":{"line_number":12,"utf16_col":6},"end":{"line_number":12,"utf16_col":16}},"extent_utf16":{"start":{"line_number":12,"utf16_col":2},"end":{"line_number":13,"utf16_col":0}}},{"name":"[2.对比传统方式](#2)","fully_qualified_name":"[2.对比传统方式](#2)","kind":"section_3","ident_start":982,"ident_end":1008,"extent_start":978,"extent_end":1009,"ident_utf16":{"start":{"line_number":13,"utf16_col":6},"end":{"line_number":13,"utf16_col":20}},"extent_utf16":{"start":{"line_number":13,"utf16_col":2},"end":{"line_number":14,"utf16_col":0}}},{"name":"[3.设计规范](#3)","fully_qualified_name":"[3.设计规范](#3)","kind":"section_3","ident_start":1207,"ident_end":1227,"extent_start":1203,"extent_end":1228,"ident_utf16":{"start":{"line_number":20,"utf16_col":6},"end":{"line_number":20,"utf16_col":18}},"extent_utf16":{"start":{"line_number":20,"utf16_col":2},"end":{"line_number":21,"utf16_col":0}}},{"name":"\u003ch2 id=\"1\"\u003e1.示例\u003ch2/\u003e","fully_qualified_name":"\u003ch2 id=\"1\"\u003e1.示例\u003ch2/\u003e","kind":"section_2","ident_start":1284,"ident_end":1308,"extent_start":1281,"extent_end":8238,"ident_utf16":{"start":{"line_number":25,"utf16_col":3},"end":{"line_number":25,"utf16_col":23}},"extent_utf16":{"start":{"line_number":25,"utf16_col":0},"end":{"line_number":308,"utf16_col":0}}},{"name":"获取用户","fully_qualified_name":"获取用户","kind":"section_4","ident_start":1315,"ident_end":1327,"extent_start":1310,"extent_end":2258,"ident_utf16":{"start":{"line_number":27,"utf16_col":5},"end":{"line_number":27,"utf16_col":9}},"extent_utf16":{"start":{"line_number":27,"utf16_col":0},"end":{"line_number":65,"utf16_col":0}}},{"name":"获取用户列表","fully_qualified_name":"获取用户列表","kind":"section_4","ident_start":2263,"ident_end":2281,"extent_start":2258,"extent_end":3231,"ident_utf16":{"start":{"line_number":65,"utf16_col":5},"end":{"line_number":65,"utf16_col":11}},"extent_utf16":{"start":{"line_number":65,"utf16_col":0},"end":{"line_number":114,"utf16_col":0}}},{"name":"获取动态及发布者用户","fully_qualified_name":"获取动态及发布者用户","kind":"section_4","ident_start":3236,"ident_end":3266,"extent_start":3231,"extent_end":3993,"ident_utf16":{"start":{"line_number":114,"utf16_col":5},"end":{"line_number":114,"utf16_col":15}},"extent_utf16":{"start":{"line_number":114,"utf16_col":0},"end":{"line_number":154,"utf16_col":0}}},{"name":"获取类似微信朋友圈的动态列表","fully_qualified_name":"获取类似微信朋友圈的动态列表","kind":"section_4","ident_start":3998,"ident_end":4040,"extent_start":3993,"extent_end":8238,"ident_utf16":{"start":{"line_number":154,"utf16_col":5},"end":{"line_number":154,"utf16_col":19}},"extent_utf16":{"start":{"line_number":154,"utf16_col":0},"end":{"line_number":308,"utf16_col":0}}},{"name":"\u003ch2 id=\"2\"\u003e2.对比传统RESTful方式\u003ch2/\u003e","fully_qualified_name":"\u003ch2 id=\"2\"\u003e2.对比传统RESTful方式\u003ch2/\u003e","kind":"section_2","ident_start":8241,"ident_end":8284,"extent_start":8238,"extent_end":28076,"ident_utf16":{"start":{"line_number":308,"utf16_col":3},"end":{"line_number":308,"utf16_col":34}},"extent_utf16":{"start":{"line_number":308,"utf16_col":0},"end":{"line_number":376,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.1\"\u003e2.1 开发流程\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.1\"\u003e2.1 开发流程\u003ch3/\u003e","kind":"section_3","ident_start":8290,"ident_end":8324,"extent_start":8286,"extent_end":8797,"ident_utf16":{"start":{"line_number":310,"utf16_col":4},"end":{"line_number":310,"utf16_col":30}},"extent_utf16":{"start":{"line_number":310,"utf16_col":0},"end":{"line_number":318,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.2\"\u003e2.2 前端请求\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.2\"\u003e2.2 前端请求\u003ch3/\u003e","kind":"section_3","ident_start":8801,"ident_end":8835,"extent_start":8797,"extent_end":9794,"ident_utf16":{"start":{"line_number":318,"utf16_col":4},"end":{"line_number":318,"utf16_col":30}},"extent_utf16":{"start":{"line_number":318,"utf16_col":0},"end":{"line_number":328,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.3\"\u003e2.3 后端操作\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.3\"\u003e2.3 后端操作\u003ch3/\u003e","kind":"section_3","ident_start":9798,"ident_end":9832,"extent_start":9794,"extent_end":10229,"ident_utf16":{"start":{"line_number":328,"utf16_col":4},"end":{"line_number":328,"utf16_col":30}},"extent_utf16":{"start":{"line_number":328,"utf16_col":0},"end":{"line_number":336,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.4\"\u003e2.4 前端解析\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.4\"\u003e2.4 前端解析\u003ch3/\u003e","kind":"section_3","ident_start":10233,"ident_end":10267,"extent_start":10229,"extent_end":10656,"ident_utf16":{"start":{"line_number":336,"utf16_col":4},"end":{"line_number":336,"utf16_col":30}},"extent_utf16":{"start":{"line_number":336,"utf16_col":0},"end":{"line_number":344,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.5\"\u003e2.5 前端对应不同需求的请求\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.5\"\u003e2.5 前端对应不同需求的请求\u003ch3/\u003e","kind":"section_3","ident_start":10660,"ident_end":10715,"extent_start":10656,"extent_end":15472,"ident_utf16":{"start":{"line_number":344,"utf16_col":4},"end":{"line_number":344,"utf16_col":37}},"extent_utf16":{"start":{"line_number":344,"utf16_col":0},"end":{"line_number":355,"utf16_col":0}}},{"name":"\u003ch3 id=\"2.6\"\u003e2.6 后端对应不同请求的返回结果\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"2.6\"\u003e2.6 后端对应不同请求的返回结果\u003ch3/\u003e","kind":"section_3","ident_start":15476,"ident_end":15537,"extent_start":15472,"extent_end":28076,"ident_utf16":{"start":{"line_number":355,"utf16_col":4},"end":{"line_number":355,"utf16_col":39}},"extent_utf16":{"start":{"line_number":355,"utf16_col":0},"end":{"line_number":376,"utf16_col":0}}},{"name":"\u003ch2 id=\"3\"\u003e3.设计规范\u003ch2/\u003e","fully_qualified_name":"\u003ch2 id=\"3\"\u003e3.设计规范\u003ch2/\u003e","kind":"section_2","ident_start":28079,"ident_end":28109,"extent_start":28076,"extent_end":64578,"ident_utf16":{"start":{"line_number":376,"utf16_col":3},"end":{"line_number":376,"utf16_col":25}},"extent_utf16":{"start":{"line_number":376,"utf16_col":0},"end":{"line_number":426,"utf16_col":0}}},{"name":"\u003ch3 id=\"3.1\"\u003e3.1 操作方法\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"3.1\"\u003e3.1 操作方法\u003ch3/\u003e","kind":"section_3","ident_start":28115,"ident_end":28149,"extent_start":28111,"extent_end":40407,"ident_utf16":{"start":{"line_number":378,"utf16_col":4},"end":{"line_number":378,"utf16_col":30}},"extent_utf16":{"start":{"line_number":378,"utf16_col":0},"end":{"line_number":401,"utf16_col":0}}},{"name":"\u003ch3 id=\"3.2\"\u003e3.2 功能符\u003ch3/\u003e","fully_qualified_name":"\u003ch3 id=\"3.2\"\u003e3.2 功能符\u003ch3/\u003e","kind":"section_3","ident_start":40411,"ident_end":40442,"extent_start":40407,"extent_end":64578,"ident_utf16":{"start":{"line_number":401,"utf16_col":4},"end":{"line_number":401,"utf16_col":29}},"extent_utf16":{"start":{"line_number":401,"utf16_col":0},"end":{"line_number":426,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":74359442,"defaultBranch":"main","name":"APIJSON","ownerLogin":"APIJSON","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-11-21T12:03:29.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/41146037?v=4","public":true,"private":false,"isOrgOwned":true,"isArchived":false},"currentUser":null,"uploadToken":"nKc-4L92jjV6NhZzxB_mrzCLIQklC4QKxb6rSAyEi9rLp88EUziudrRT18tejg4stqZHC95JLG4fnzwBW81zMw","allShortcutsEnabled":false,"treeExpanded":true,"path":"Document.md","symbolsExpanded":false,"refInfo":{"name":"7.7.0","listCacheKey":"v0:1789182757.0","canEdit":false,"currentOid":"013441a045b5935bde59f6a54edc73340515f480"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"APIJSONORM","path":"APIJSONORM","contentType":"directory"},{"name":"assets","path":"assets","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"APIJSON初期构思及实现.docx","path":"APIJSON初期构思及实现.docx","contentType":"file"},{"name":"APIJSON初期构思及实现.pages","path":"APIJSON初期构思及实现.pages","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"CONTRIBUTING_COMMIT.md","path":"CONTRIBUTING_COMMIT.md","contentType":"file"},{"name":"Document-English.md","path":"Document-English.md","contentType":"file"},{"name":"Document.md","path":"Document.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Navigation.md","path":"Navigation.md","contentType":"file"},{"name":"README-English.md","path":"README-English.md","contentType":"file"},{"name":"README-extend.md","path":"README-extend.md","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"Roadmap.md","path":"Roadmap.md","contentType":"file"},{"name":"logo.png","path":"logo.png","contentType":"file"},{"name":"详细的说明文档.md","path":"详细的说明文档.md","contentType":"file"}],"totalCount":18}},"fileTreeProcessingTime":57.889726,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"7.7.0","listCacheKey":"v0:1789182757.0","canEdit":false,"refType":"tag","currentOid":"013441a045b5935bde59f6a54edc73340515f480","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"Document.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/APIJSON/APIJSON/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"Document.md","displayUrl":"https://github.com/APIJSON/APIJSON/blob/7.7.0/Document.md?raw=true","headerInfo":{"blobSize":"63.1 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":null,"isGitLfs":false,"onBranch":false,"shortPath":"e20bfbb","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FAPIJSON%2FAPIJSON%2Fblob%2F7.7.0%2FDocument.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"426","truncatedSloc":"365"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/APIJSON/APIJSON/blob/7.7.0/Document.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/APIJSON/APIJSON/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/APIJSON/APIJSON/raw/refs/tags/7.7.0/Document.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["[English](https://github.com/Tencent/APIJSON/blob/master/Document-English.md)","\u003cbr /\u003e","","# APIJSON 通用文档 ","本文是通用文档，只和 APIJSON 协议有关，和 C#, Go, Java, JavaScript, PHP, Python, TypeScript 等开发语言无关。 \u003cbr /\u003e","具体开发语言相关的 配置、运行、部署 等文档见各个相关项目的文档，可以在首页点击对应语言的入口来查看。\u003cbr /\u003e","https://github.com/Tencent/APIJSON","![image](https://user-images.githubusercontent.com/5738175/134520081-a63d3817-321c-4e7b-9e03-73c6827a19c1.png)","","","后端开发者可以先看 [图文入门教程1](http://apijson.cn/doc/zh/) 或 [图文入门教程2](https://hanxu2018.github.io/APIJSON-DOC/) （和本文档有出入的点以本文档为准。例如正则匹配 key? 已废弃，用 key~ 替代；例如 \"@column\":\"store_id,sum(amt):totAmt\" 中逗号 , 有误，应该用分号 ; 隔开 SQL 函数，改为 \"@column\":\"store_id;sum(amt):totAmt\"）","","* ### [1.示例](#1)","* ### [2.对比传统方式](#2)","* [2.1 开发流程](#2.1)","* [2.2 前端请求](#2.2)","* [2.3 后端操作](#2.3)","* [2.4 前端解析](#2.4)","* [2.5 对应不同需求的请求](#2.5)","* [2.6 对应不同请求的结果](#2.6)","* ### [3.设计规范](#3)","* [3.1 操作方法](#3.1)","* [3.2 功能符](#3.2)","","","## \u003ch2 id=\"1\"\u003e1.示例\u003ch2/\u003e","","#### 获取用户","请求：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"User\":{","    \"id\":38710","  }","}","\u003c/code\u003e\u003c/pre\u003e","","[点击这里测试](http://apijson.cn:8080/get/{\"User\":{\"id\":38710}})","","返回：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"User\":{","    \"id\":38710,","    \"sex\":0,","    \"name\":\"TommyLemon\",","    \"tag\":\"Android\u0026Java\",","    \"head\":\"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",","    \"date\":1485948110000,","    \"pictureList\":[","      \"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",","      \"http://common.cnblogs.com/images/icon_weibo_24.png\"","    ]","  },","  \"code\":200,","  \"msg\":\"success\"","}","\u003c/code\u003e\u003c/pre\u003e","","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 各种单表对象查询：简单查询、统计、分组、排序、聚合、比较、筛选字段、字段别名 等\u003c/a\u003e","\u003c/p\u003e ","  ","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_single.gif)","  ","\u003cbr /\u003e","","#### 获取用户列表","请求：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"[]\":{","    \"count\":3,             //只要3个","    \"User\":{","      \"@column\":\"id,name\"  //只要id,name这两个字段","    }","  }","}","\u003c/code\u003e\u003c/pre\u003e","","[点击这里测试](http://apijson.cn:8080/get/{\"[]\":{\"count\":3,\"User\":{\"@column\":\"id,name\"}}})","","返回：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"[]\":[","    {","      \"User\":{","        \"id\":38710,","        \"name\":\"TommyLemon\"","      }","    },","    {","      \"User\":{","        \"id\":70793,","        \"name\":\"Strong\"","      }","    },","    {","      \"User\":{","        \"id\":82001,","        \"name\":\"Android\"","      }","    }","  ],","  \"code\":200,","  \"msg\":\"success\"","}","\u003c/code\u003e\u003c/pre\u003e","","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 各种单表数组查询：简单查询、统计、分组、排序、聚合、分页、比较、搜索、正则、条件组合 等\u003c/a\u003e","\u003c/p\u003e ","","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_array.gif)","","\u003cbr /\u003e","","#### 获取动态及发布者用户","请求：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"Moment\":{","  },","  \"User\":{","    \"id@\":\"Moment/userId\"  //User.id = Moment.userId","  }","}","\u003c/code\u003e\u003c/pre\u003e","","[点击这里测试](http://apijson.cn:8080/get/{\"Moment\":{},\"User\":{\"id@\":\"Moment%252FuserId\"}})","","返回：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"Moment\":{","    \"id\":12,","    \"userId\":70793,","    \"date\":\"2017-02-08 16:06:11.0\",","    \"content\":\"1111534034\"","  },","  \"User\":{","    \"id\":70793,","    \"sex\":0,","    \"name\":\"Strong\",","    \"tag\":\"djdj\",","    \"head\":\"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\",","    \"contactIdList\":[","      38710,","      82002","    ],","    \"date\":\"2017-02-01 19:21:50.0\"","  },","  \"code\":200,","  \"msg\":\"success\"","}","\u003c/code\u003e\u003c/pre\u003e","  ","\u003cbr /\u003e","","#### 获取类似微信朋友圈的动态列表","请求：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"[]\":{                             //请求一个数组","    \"page\":0,                        //数组条件","    \"count\":2,","    \"Moment\":{                       //请求一个名为Moment的对象","      \"content$\":\"%a%\"               //对象条件，搜索content中包含a的动态","    },","    \"User\":{","      \"id@\":\"/Moment/userId\",        //User.id = Moment.userId  缺省引用赋值路径，从所处容器的父容器路径开始","      \"@column\":\"id,name,head\"       //指定返回字段","    },","    \"Comment[]\":{                    //请求一个名为Comment的数组，并去除Comment包装","      \"count\":2,","      \"Comment\":{","        \"momentId@\":\"[]/Moment/id\"   //Comment.momentId = Moment.id  完整引用赋值路径","      }","    }","  }","}","\u003c/code\u003e\u003c/pre\u003e","","[点击这里测试](http://apijson.cn:8080/get/{\"[]\":{\"page\":0,\"count\":2,\"Moment\":{\"content$\":\"%2525a%2525\"},\"User\":{\"id@\":\"%252FMoment%252FuserId\",\"@column\":\"id,name,head\"},\"Comment[]\":{\"count\":2,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}})","","返回：","\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{","  \"[]\":[","    {","      \"Moment\":{","        \"id\":15,","        \"userId\":70793,","        \"date\":1486541171000,","        \"content\":\"APIJSON is a JSON Transmission Structure Protocol…\",","        \"praiseUserIdList\":[","          82055,","          82002,","          82001","        ],","        \"pictureList\":[","          \"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000\",","          \"http://common.cnblogs.com/images/icon_weibo_24.png\"","        ]","      },","      \"User\":{","        \"id\":70793,","        \"name\":\"Strong\",","        \"head\":\"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000\"","      },","      \"Comment[]\":[","        {","          \"id\":176,","          \"toId\":166,","          \"userId\":38710,","          \"momentId\":15,","          \"date\":1490444883000,","          \"content\":\"thank you\"","        },","        {","          \"id\":1490863469638,","          \"toId\":0,","          \"userId\":82002,","          \"momentId\":15,","          \"date\":1490863469000,","          \"content\":\"Just do it\"","        }","      ]","    },","    {","      \"Moment\":{","        \"id\":58,","        \"userId\":90814,","        \"date\":1485947671000,","        \"content\":\"This is a Content...-435\",","        \"praiseUserIdList\":[","          38710,","          82003,","          82005,","          93793,","          82006,","          82044,","          82001","        ],","        \"pictureList\":[","          \"http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg\"","        ]","      },","      \"User\":{","        \"id\":90814,","        \"name\":7,","        \"head\":\"http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000\"","      },","      \"Comment[]\":[","        {","          \"id\":13,","          \"toId\":0,","          \"userId\":82005,","          \"momentId\":58,","          \"date\":1485948050000,","          \"content\":\"This is a Content...-13\"","        },","        {","          \"id\":77,","          \"toId\":13,","          \"userId\":93793,","          \"momentId\":58,","          \"date\":1485948050000,","          \"content\":\"This is a Content...-77\"","        }","      ]","    }","  ],","  \"code\":200,","  \"msg\":\"success\"","}","\u003c/code\u003e\u003c/pre\u003e","","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 各种多表关联查询：一对一、一对多、多对一、各种条件 等\u003c/a\u003e","\u003c/p\u003e ","","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_associate.gif)","","\u003cbr /\u003e","  ","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 各种 JOIN：\u003c LEFT JOIN, \u0026 INNER JOIN 等\u003c/a\u003e","\u003c/p\u003e ","","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_join.gif)","  ","\u003cbr /\u003e","  ","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 各种子查询：@from@ FROM, key@ =, key\u003e@ \u003e, key{}@ IN, key}{@ EXISTS 等 \u003c/a\u003e","\u003c/p\u003e ","","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_subquery.gif)","    ","\u003cbr /\u003e","    ","\u003cp align=\"center\" \u003e","  \u003ca \u003e[GIF] APIJSON 部分功能演示集合，由浅入深、由简单到复杂 \u003c/a\u003e","\u003c/p\u003e ","","![](https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_summary.gif)","","\u003cbr /\u003e","","[在线测试](http://apijson.cn/api)","","\u003cbr /\u003e","\u003cbr /\u003e"," ","## \u003ch2 id=\"2\"\u003e2.对比传统RESTful方式\u003ch2/\u003e","","### \u003ch3 id=\"2.1\"\u003e2.1 开发流程\u003ch3/\u003e"," 开发流程 | 传统方式 | APIJSON","-------- | ------------ | ------------"," 接口传输 | 等后端编辑接口，然后更新文档，前端再按照文档编辑请求和解析代码 | 前端按照自己的需求编辑请求和解析代码。\u003cbr /\u003e没有接口，更不需要文档！前端再也不用和后端沟通接口或文档问题了！"," 兼容旧版 | 后端增加新接口，用v2表示第2版接口，然后更新文档 | 什么都不用做！"," "," \u003cbr /\u003e"," ","### \u003ch3 id=\"2.2\"\u003e2.2 前端请求\u003ch3/\u003e"," 前端请求 | 传统方式 | APIJSON","-------- | ------------ | ------------"," 要求 | 前端按照文档在对应URL后面拼接键值对 | 前端按照自己的需求在固定URL后拼接JSON"," URL | 不同的请求对应不同的URL，基本上有多少个不同的请求就得有多少个接口URL | 相同的操作方法(增删改查)都用同一个URL，\u003cbr /\u003e大部分请求都用7个通用接口URL的其中一个"," 键值对 | key=value | key:value"," 结构 | 同一个URL内table_name只能有一个 \u003cbr /\u003e\u003cbr /\u003e base_url/get/table_name?\u003cbr /\u003ekey0=value0\u0026key1=value1... | 同一个URL后TableName可传任意数量个 \u003cbr /\u003e\u003cbr /\u003e base_url/get/\u003cbr /\u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName0:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; key0:value0,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; key1:value1,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName1:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; ...\u003cbr \u003e }"," "," \u003cbr /\u003e"," ","### \u003ch3 id=\"2.3\"\u003e2.3 后端操作\u003ch3/\u003e"," 后端操作 | 传统方式 | APIJSON","-------- | ------------ | ------------"," 解析和返回 | 取出键值对，把键值对作为条件用预设的的方式去查询数据库，最后封装JSON并返回给前端 | 把Parser#parse方法的返回值返回给前端就行"," 返回JSON结构的设定方式 | 由后端设定，前端不能修改 | 由前端设定，后端不能修改"," "," \u003cbr /\u003e"," ","### \u003ch3 id=\"2.4\"\u003e2.4 前端解析\u003ch3/\u003e"," 前端解析 | 传统方式 | APIJSON","-------- | ------------ | ------------"," 查看方式 | 查文档或问后端，或等请求成功后看日志 | 看请求就行，所求即所得，不用查、不用问、不用等。也可以等请求成功后看日志"," 解析方法 | 用JSON解析器来解析JSONObject | 可以用JSONResponse解析JSONObject，或使用传统方式"," "," \u003cbr /\u003e"," ","### \u003ch3 id=\"2.5\"\u003e2.5 前端对应不同需求的请求\u003ch3/\u003e"," 前端的请求 | 传统方式 | APIJSON","-------- | ------------ | ------------"," User | base_url/get/user?id=38710 | [base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"User\":{\"id\":38710}})"," Moment和对应的User | 分两次请求\u003cbr /\u003eMoment: \u003cbr /\u003e base_url/get/moment?userId=38710\u003cbr /\u003e\u003cbr /\u003eUser: \u003cbr /\u003e base_url/get/user?id=38710 | [base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"userId\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; }, \u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"Moment\":{\"userId\":38710},\"User\":{\"id\":38710}})"," User列表 | base_url/get/user/list?\u003cbr /\u003epage=0\u0026count=3\u0026sex=0 | [base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"page\":0,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;  \"count\":3, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"sex\":0\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"User[]\":{\"page\":0,\"count\":3,\"User\":{\"sex\":0}}})"," Moment列表，\u003cbr /\u003e每个Moment包括\u003cbr /\u003e1.发布者User\u003cbr /\u003e2.前3条Comment | Moment里必须有\u003cbr /\u003e1.User对象\u003cbr \u003e2.Comment数组\u003cbr /\u003e\u003cbr /\u003e base_url/get/moment/list?\u003cbr /\u003epage=0\u0026count=3\u0026commentCount=3 | [base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"page\":0, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{}, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id@\":\"/Moment/userId\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId@\":\"[]/Moment/id\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"[]\":{\"page\":0,\"count\":3,\"Moment\":{},\"User\":{\"id@\":\"%252FMoment%252FuserId\"},\"Comment[]\":{\"count\":3,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}})"," User发布的Moment列表，\u003cbr /\u003e 每个Moment包括\u003cbr /\u003e 1.发布者User\u003cbr /\u003e 2.前3条Comment | 1.Moment里必须有User对象和Comment数组\u003cbr \u003e 2.字段名必须查接口文档，例如评论数量字段名可能是\u003cbr /\u003e commentCount,comment_count或者简写cmt_count等各种奇葩写法... \u003cbr /\u003e\u003cbr /\u003e base_url/get/moment/list?\u003cbr /\u003epage=0\u0026count=3\u003cbr /\u003e\u0026commentCount=3\u0026userId=38710 | 有以下几种方式:\u003cbr /\u003e\u003cbr /\u003e ① 把以上请求里的\u003cbr \u003e\"Moment\":{}, \"User\":{\"id@\":\"/Moment/userId\"}\u003cbr \u003e改为\u003cbr \u003e[\"Moment\":{\"userId\":38710}, \"User\":{\"id\":38710}](http://apijson.cn:8080/get/{\"[]\":{\"page\":0,\"count\":3,\"Moment\":{\"userId\":38710},\"User\":{\"id\":38710},\"Comment[]\":{\"count\":3,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}}) \u003cbr /\u003e\u003cbr /\u003e ② 或把User放在上面的最外层省去重复的User\u003cbr /\u003e[base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"page\":0,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"userId\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId@\":\"[]/Moment/id\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"User\":{\"id\":38710},\"[]\":{\"page\":0,\"count\":3,\"Moment\":{\"userId\":38710},\"Comment[]\":{\"count\":3,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}})\u003cbr /\u003e\u003cbr /\u003e ③ 如果User之前已经获取到了，还可以不传User来节省请求和返回数据的流量并提升速度\u003cbr /\u003e[base_url/get/\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"page\":0,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"userId\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId@\":\"[]/Moment/id\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"[]\":{\"page\":0,\"count\":3,\"Moment\":{\"userId\":38710},\"Comment[]\":{\"count\":3,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}})"," "," \u003cbr /\u003e"," ","### \u003ch3 id=\"2.6\"\u003e2.6 后端对应不同请求的返回结果\u003ch3/\u003e"," 后端的返回结果 | 传统方式 | APIJSON","-------- | ------------ | ------------"," User | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}"," Moment和对应的User | 分别返回两次请求的结果，获取到Moment后取出userId作为User的id条件去查询User \u003cbr /\u003e\u003cbr /\u003e Moment: \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} \u003cbr /\u003e\u003cbr /\u003e User: \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} | 一次性返回，没有传统方式导致的 长时间等待结果、两次结果间关联、线程多次切换 等问题 \u003cbr /\u003e\u003cbr /\u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}"," User列表 | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":82001,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":82001,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}"," Moment列表，每个Moment包括发布者User和前3条Comment | Moment里必须有\u003cbr /\u003e1.User对象\u003cbr /\u003e2.Comment数组 \u003cbr /\u003e\u003cbr /\u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":301,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} | 1.高灵活，可任意组合\u003cbr /\u003e2.低耦合，逻辑很清晰\u003cbr /\u003e\u003cbr /\u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":301,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}"," User发布的Moment列表，每个Moment包括发布者User和前3条Comment | 1.大量重复User，浪费流量和服务器性能\u003cbr /\u003e2.优化很繁琐，需要后端扩展接口、写好文档，前端/前端再配合优化\u003cbr /\u003e\u003cbr /\u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"data\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":470,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":511,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":595,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} | 以上不同请求方式的结果:\u003cbr /\u003e\u003cbr /\u003e ① 常规请求 \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr /\u003e\u003cbr /\u003e ② 省去重复的User \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name\":\"Tommy\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr /\u003e\u003cbr /\u003e ③ 不查询已获取到的User \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"xxx\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":[\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ]\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}","","","1.base_url指基地址，一般是顶级域名，其它分支url都是在base_url后扩展。如base_url:http://apijson.cn:8080/ ，对应的GET分支url:http://apijson.cn:8080/get/ 。下同。\u003cbr \u003e","2.请求中的key或value任意一个为null值时，这个 key:value键值对 被视为无效。下同。\u003cbr \u003e","3.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义，不需要再写；但如果是浏览器或Postman等直接输入url/request，需要把request中的所有 / 都改成 %252F 。下同。\u003cbr \u003e","4.code，指返回结果中的状态码，200表示成功，其它都是错误码，值全部都是HTTP标准状态码。下同。\u003cbr \u003e","5.msg，指返回结果中的状态信息，对成功结果或错误原因的详细说明。下同。\u003cbr \u003e","6.code和msg总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式code和msg。下同。\u003cbr \u003e","7.id等字段对应的值仅供说明，不一定是数据库里存在的，请求里用的是真实存在的值。下同。","","\u003cbr /\u003e","\u003cbr /\u003e","","## \u003ch2 id=\"3\"\u003e3.设计规范\u003ch2/\u003e","","### \u003ch3 id=\"3.1\"\u003e3.1 操作方法\u003ch3/\u003e","","  方法及说明 | URL | Request | Response","------------ | ------------ | ------------ | ------------","GET: \u003cbr \u003e 普通获取数据，\u003cbr \u003e 可用浏览器调试 | base_url/get/ | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; … \u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e} \u003cbr \u003e {…}内为限制条件\u003cbr \u003e\u003cbr \u003e 例如获取一个 id = 235 的 Moment：\u003cbr \u003e [{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fget\u0026type=JSON\u0026json={\"Moment\"%3A{\"id\"%3A235}}) \u003cbr \u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`SELECT * FROM Moment WHERE id=235 LIMIT 1` | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ...\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr \u003e例如\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"userId\":38710,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e }","HEAD: \u003cbr \u003e 普通获取数量，\u003cbr \u003e 可用浏览器调试 | base_url/head/ | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e } \u003cbr \u003e {…}内为限制条件 \u003cbr \u003e\u003cbr \u003e 例如获取一个 id = 38710 的 User 所发布的 Moment 总数：\u003cbr \u003e [{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"userId\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fhead\u0026type=JSON\u0026json={\"Moment\"%3A{\"userId\"%3A38710}}) \u003cbr \u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`SELECT count(*) FROM Moment WHERE userId=38710 LIMIT 1`  | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":10\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} \u003cbr \u003e 例如\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":10\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;  \"msg\":\"success\"\u003cbr \u003e}","GETS: \u003cbr \u003e 安全/私密获取数据，\u003cbr \u003e 用于获取钱包等\u003cbr \u003e对安全性要求高的数据 | base_url/gets/ | 最外层加一个 \"tag\":tag，例如 [\"tag\":\"Privacy\"](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026type=JSON\u0026json={\"tag\"%3A\"Privacy\",\"Privacy\"%3A{\"id\"%3A82001}})，其它同GET | 同GET","HEADS: \u003cbr \u003e 安全/私密获取数量，\u003cbr \u003e 用于获取银行卡数量等\u003cbr \u003e对安全性要求高的数据总数 | base_url/heads/ | 最外层加一个 \"tag\":tag，例如 [\"tag\":\"Verify\"](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fheads\u0026type=JSON\u0026json={\"tag\"%3A\"Verify\",\"Verify\"%3A{\"phone\"%3A13000082001}})，其它同HEAD | 同HEAD","POST: \u003cbr \u003e 新增数据 | base_url/post/ | 单个： \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":tag\u003cbr \u003e} \u003cbr \u003e {…}中id由后端生成，不能传 \u003cbr \u003e\u003cbr \u003e例如当前登录用户 38710 发布一个新 Comment：\u003cbr \u003e[{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId\":12,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"APIJSON,let interfaces and documents go to hell !\" \u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":\"Comment\"\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost\u0026type=JSON\u0026json={\"Comment\":{\"momentId\":12,\"content\":\"APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!\"},\"tag\":\"Comment\"}) \u003cbr \u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`INSERT INTO Comment(userId,momentId,content) VALUES(38710,12,'APIJSON,let interfaces and documents go to hell !')` \u003cbr \u003e  \u003cbr \u003e 批量： \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName\\[]:\\[{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }, {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp; ],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":tag\u003cbr \u003e} \u003cbr \u003e {…}中id由后端生成，不能传 \u003cbr \u003e\u003cbr \u003e例如当前登录用户 82001 发布 2 个 Comment：\u003cbr \u003e[{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment[]\":[{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId\":12,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }, {\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId\":15,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"APIJSON is a JSON transmision protocol.\"\u003cbr \u003e \u0026nbsp;\u0026nbsp; }],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":\"Comment:[]\"\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost\u0026type=JSON\u0026json={\"Comment[]\":[{\"momentId\":12,\"content\":\"APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!\"},{\"momentId\":15,\"content\":\"APIJSON%20is%20a%20JSON%20transmision%20protocol.\"}],\"tag\":\"Comment:[]\"})\u003cbr \u003e  后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`INSERT INTO Comment(userId,momentId,content) VALUES(82001,12,'APIJSON,let interfaces and documents go to hell !');`\u003cbr \u003e\u003cbr \u003e`INSERT INTO Comment(userId,momentId,content) VALUES(82001,15,'APIJSON is a JSON transmision protocol.');`   | 单个： \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":38710\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr \u003e例如\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":120\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e} \u003cbr \u003e \u003cbr \u003e 批量： \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":5,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id[]\":[1, 2, 3, 4, 5]\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr \u003e例如\u003cbr \u003e{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":2,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id[]\":\\[1, 2]\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}","PUT: \u003cbr \u003e 修改数据，\u003cbr \u003e 只修改所传的字段 | base_url/put/ | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":id,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; …\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":tag\u003cbr \u003e} \u003cbr \u003e {…} 中 id 或 id{} 至少传一个 \u003cbr \u003e\u003cbr \u003e例如当前登录用户 82001 修改 id = 235 的 Moment 的 content：\u003cbr \u003e[{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":235,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"APIJSON,let interfaces and documents go to hell !\"\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":\"Moment\"\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput\u0026type=JSON\u0026json={\"Moment\":{\"id\":235,\"content\":\"APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!\"},\"tag\":\"Moment\"}) \u003cbr \u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`UPDATE Moment SET content='APIJSON,let interfaces and documents go to hell !' WHERE id=235 AND userId=82001 LIMIT 1` \u003cbr \u003e\u003cbr \u003e 批量除了 id{}:\\[] 也可类似批量 POST，只是每个 {...} 里面都必须有 id。\u003cbr \u003e\"tag\":\"Comment[]\" 对应对象 \"Comment\":{\"id{}\":[1,2,3]}，表示指定记录全部统一设置；\u003cbr \u003e\"tag\":\"Comment:[]\" 多了冒号，对应数组 \"Comment[]\":[{\"id\":1},{\"id\":2},{\"id\":3}]，表示每项单独设置 | 同POST","DELETE: \u003cbr \u003e 删除数据 | base_url/delete/ | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id\":id\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":tag\u003cbr \u003e} \u003cbr \u003e {…} 中 id 或 id{} 至少传一个，一般只传 id 或 id{} \u003cbr \u003e\u003cbr \u003e例如当前登录用户 82001 批量删除 id = 100,110,120 的 Comment：\u003cbr \u003e[{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id{}\":[100,110,120]\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":\"Comment[]\"\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fdelete\u0026type=JSON\u0026json={\"Comment\":{\"id{}\":[100,110,120]},\"tag\":\"Comment[]\"}) \u003cbr \u003e 后端校验通过后自动解析为 SQL 并执行：\u003cbr \u003e`DELETE FROM Comment WHERE id IN(100,110,120) AND userId=82001 LIMIT 3` | {\u003cbr \u003e \u0026nbsp;\u0026nbsp; TableName:{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id[]\":[100,110,120]\u003cbr \u003e\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp; \"count\":3\u003cbr \u003e \u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}\u003cbr \u003e例如\u003cbr \u003e{\u003cbr \u003e\u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp; \"msg\":\"success\",\u003cbr \u003e\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp; \"id[]\":[100,110,120],\u003cbr \u003e\u0026nbsp;\u0026nbsp; \u0026nbsp;\u0026nbsp; \"count\":3\u003cbr \u003e\u0026nbsp;\u0026nbsp; },\u003cbr \u003e\u0026nbsp;\u0026nbsp; \"code\":200,\u003cbr \u003e\u0026nbsp;\u0026nbsp; \"msg\":\"success\"\u003cbr \u003e}","以上接口的简单形式: \u003cbr \u003e base_url/{method}/{tag} |  GET: 普通获取数据 \u003cbr \u003e base_url/get/{tag} \u003cbr \u003e\u003cbr \u003e HEAD: 普通获取数量 \u003cbr \u003e base_url/head/{tag} \u003cbr \u003e\u003cbr \u003e GETS: 安全/私密获取数据 \u003cbr \u003e  base_url/gets/{tag} \u003cbr \u003e\u003cbr \u003e HEADS: 安全/私密获取数量 \u003cbr \u003e base_url/heads/{tag} \u003cbr \u003e\u003cbr \u003e POST: 新增数据 \u003cbr \u003e  base_url/post/{tag} \u003cbr \u003e\u003cbr \u003e PUT: 修改数据  base_url/put/{tag} \u003cbr \u003e\u003cbr \u003e DELETE: 删除数据 \u003cbr \u003e base_url/delete/{tag} | 例如安全/私密获取一个 id = 82001 的 Privacy：\u003cbr \u003e [base_url/gets/Privacy/ \u003cbr \u003e {\"id\":82001}](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets%2FPrivacy\u0026type=JSON\u0026json={\"id\"%3A82001}) \u003cbr \u003e 相当于 \u003cbr \u003e [base_url/gets/ \u003cbr \u003e{\"tag\":\"Privacy\", \"Privacy\":{\"id\":82001}}](http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026type=JSON\u0026json={\"tag\"%3A\"Privacy\",\"Privacy\"%3A{\"id\"%3A82001}}) \u003cbr \u003e \u003cbr \u003e 例如批量修改 id = 114, 124 的 Comment 的 content：\u003cbr \u003e[base_url/put/Comemnt[]/ \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"id{}\":[114,124],\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"content\":\"test multi put\"\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput%2FComment[]\u0026type=JSON\u0026json={\"id{}\"%3A[114,124],\"content\"%3A\"test%20multi%20put\"}) \u003cbr \u003e 相当于 \u003cbr \u003e [base_url/put/ \u003cbr \u003e {\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"tag\":\"Comment[]\", \u003cbr \u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id{}\":[114,124],\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"content\":\"test multi put\"\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput\u0026type=JSON\u0026json={\"tag\"%3A\"Comment[]\",\"Comment\"%3A{\"id{}\"%3A[114,124],\"content\"%3A\"test%20multi%20put\"}})  | 同以上对应的方法","","1.TableName指要查询的数据库表Table的名称字符串。第一个字符为大写字母，剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值的类型为JSONObject，结构是 {...}，里面放的是Table的字段(列名)。下同。\u003cbr \u003e","2.\"tag\":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的标识，一般是要查询的Table的名称，由后端Request表中指定。下同。\u003cbr \u003e","3.GET、HEAD请求是开放请求，可任意组合任意嵌套。其它请求为受限制的安全/私密请求，对应的 方法（method）, 标识（tag）, 版本（version）, 结构（structure） 都必须和 后端Request表中所指定的 一一对应，否则请求将不被通过。version 不传、为 null 或 \u003c=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本。下同。\u003cbr \u003e","4.GETS与GET、HEADS与HEAD分别为同一类型的操作方法，请求稍有不同但返回结果相同。下同。\u003cbr \u003e","5.在HTTP通信中，自动化接口(get,gets,head,heads,post,put,delete) 全用HTTP POST请求。下同。\u003cbr \u003e","6.所有JSONObject都视为容器(或者文件夹)，结构为 {...} ，里面可以放普通对象或子容器。下同。\u003cbr \u003e","7.每个对象都有一个唯一的路径(或者叫地址)，假设对象名为refKey，则用 key0/key1/.../refKey 表示。下同。","","\u003cbr \u003e","","### \u003ch3 id=\"3.2\"\u003e3.2 功能符\u003ch3/\u003e"," "," 功能 | 键值对格式 | 使用示例","------------ | ------------ | ------------"," 查询数组 | \"key[]\":{}，后面是 JSONObject，key 可省略。当 key 和里面的 Table 名相同时，Table 会被提取出来，即 {Table:{Content}} 会被转化为 {Content} | [{\"User[]\":{\"User\":{}}}](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{}}})，查询一个 User 数组。这里 key 和 Table 名都是 User，User 会被提取出来，即 {\"User\":{\"id\", ...}} 会被转化为 {\"id\", ...}，如果要进一步提取 User 中的 id，可以把 User[] 改为 User-id[]，其中 - 用来分隔路径中涉及的 key"," 匹配选项范围 | \"key{}\":[]，后面是 JSONArray，作为 key 可取的值的选项 | [\"id{}\":[38710,82001,70793]](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"id{}\":[38710,82001,70793]}}})，对应 SQL 是`id IN(38710,82001,70793)`，查询 id 符合 38710,82001,70793 中任意一个的一个 User 数组"," 匹配条件范围 | \"key{}\":\"条件0,条件1...\"，条件为 SQL 表达式字符串，可进行数字比较运算等 | [\"id{}\":\"\u003c=80000,\\\u003e90000\"](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"id{}\":\"\u003c=80000,\\\u003e90000\"}}})，对应 SQL 是`id\u003c=80000 OR id\u003e90000`，查询 id 符合 id\\\u003c=80000 \\| id\u003e90000 的一个 User 数组"," 包含选项范围 | \"key\u003c\\\u003e\":value  =\u003e  \"key\u003c\\\u003e\":[value]，key 对应值的类型必须为 JSONArray，value 值类型只能为 Boolean, Number, String 中的一种 |  [\"contactIdList\u003c\\\u003e\":38710](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"contactIdList\u003c\\\u003e\":38710}}})，对应SQL是`json_contains(contactIdList,38710)`，查询 contactIdList 包含 38710 的一个 User 数组"," 判断是否存在 | \"key}{@\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"from\":\"Table\",\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Table\":{ ... }\u003cbr /\u003e}\u003cbr /\u003e其中：\u003cbr /\u003e}{ 表示 EXISTS；\u003cbr /\u003e key 用来标识是哪个判断；\u003cbr /\u003e @ 后面是 子查询 对象，具体见下方 子查询 的说明。 | [\"id}{@\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"from\":\"Comment\",\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp;  \u0026nbsp;\u0026nbsp; \"momentId\":15 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; }\u003cbr /\u003e}](http://apijson.cn:8080/get/{\"User\":{\"id}{@\":{\"from\":\"Comment\",\"Comment\":{\"momentId\":15}}}})\u003cbr /\u003e WHERE EXISTS(SELECT * FROM Comment WHERE momentId=15)"," 远程调用函数 | \"key()\":\"函数表达式\"，函数表达式为 function(key0,key1...)，会调用后端对应的函数 function(JSONObject request, String key0, String key1...)，实现 参数校验、数值计算、数据同步、消息推送、字段拼接、结构变换 等特定的业务逻辑处理，\u003cbr\u003e可使用 - 和 + 表示优先级，解析 key-() \u003e 解析当前对象 \u003e 解析 key() \u003e 解析子对象 \u003e 解析 key+()  | [\"isPraised()\":\"isContain(praiseUserIdList,userId)\"](http://apijson.cn:8080/get/{\"Moment\":{\"id\":301,\"isPraised()\":\"isContain(praiseUserIdList,userId)\"}})，会调用远程函数 [boolean isContain(JSONObject request, String array, String value)](https://github.com/APIJSON/apijson-framework/blob/master/src/main/java/apijson/framework/APIJSONFunctionParser.java#L361-L374) ，然后变为 \"isPraised\":true 这种（假设点赞用户 id 列表包含了 userId，即这个 User 点了赞）"," 存储过程 | \"@key()\":\"SQL函数表达式\"，函数表达式为 \u003cbr /\u003e  function(key0,key1...) \u003cbr /\u003e 会调用后端数据库对应的存储过程 SQL 函数 \u003cbr /\u003e function(String key0, String key1...) \u003cbr /\u003e 除了参数会提前赋值，其它和 远程函数 一致 | [\"@limit\":10, \u003cbr /\u003e \"@offset\":0, \u003cbr /\u003e \"@procedure()\":\"getCommentByUserId(id,@limit,@offset)\"](http://apijson.cn:8080/get/{\"User\":{\"@limit\":10,\"@offset\":0,\"@procedure()\":\"getCommentByUserId(id,@limit,@offset)\"}}) \u003cbr /\u003e 会转为 \u003cbr /\u003e `getCommentByUserId(38710,10,0)` \u003cbr /\u003e 来调用存储过程 SQL 函数 \u003cbr /\u003e `getCommentByUserId(IN id bigint, IN limit int, IN offset int)` \u003cbr /\u003e 然后变为 \u003cbr /\u003e\"procedure\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"count\":-1, \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"update\":false, \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"list\":[] \u003cbr /\u003e } \u003cbr /\u003e 其中 count 是指写操作影响记录行数，-1 表示不是写操作；update 是指是否为写操作（增删改）；list 为返回结果集"," 引用赋值 | \"key@\":\"key0/key1/.../refKey\"，引用路径为用 / 分隔的字符串。以 / 开头的是缺省引用路径，从声明 key 所处容器的父容器路径开始；其它是完整引用路径，从最外层开始。\u003cbr /\u003e 被引用的 refKey 必须在声明 key 的上面。如果对 refKey 的容器指定了返回字段，则被引用的 refKey 必须写在 @column 对应的值内，例如 \"@column\":\"refKey,key1,...\" | [\"Moment\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"userId\":38710\u003cbr /\u003e},\u003cbr /\u003e\"User\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"id@\":\"/Moment/userId\"\u003cbr /\u003e}](http://apijson.cn:8080/get/{\"Moment\":{\"userId\":38710},\"User\":{\"id@\":\"%252FMoment%252FuserId\"}})\u003cbr /\u003e User 内的 id 引用了与 User 同级的 Moment 内的 userId，\u003cbr /\u003e即 User.id = Moment.userId，请求完成后\u003cbr \u003e \"id@\":\"/Moment/userId\" 会变成 \"id\":38710"," 子查询 | \"key@\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"range\":\"ALL\", \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"from\":\"Table\", // 可省略，默认为首个表对象 key 名\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Table\":{ ... }\u003cbr /\u003e}\u003cbr /\u003e其中：\u003cbr /\u003erange 可为 ALL,ANY；\u003cbr /\u003efrom 为目标表 Table 的名称；\u003cbr /\u003e@ 后面的对象类似数组对象，可使用 count 和 join 等功能。 | [\"id@\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"from\":\"Comment\", // 可省略\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp;  \u0026nbsp;\u0026nbsp; \"@column\":\"min(userId)\" \u003cbr /\u003e \u0026nbsp;\u0026nbsp; }\u003cbr /\u003e}](http://apijson.cn:8080/get/{\"User\":{\"id@\":{\"from\":\"Comment\",\"Comment\":{\"@column\":\"min(userId)\"}}}})\u003cbr /\u003e WHERE id=(SELECT min(userId) FROM Comment)"," 模糊搜索 | `\"key$\":\"SQL搜索表达式\"` =\u003e `\"key$\":[\"SQL搜索表达式\"]`，任意 SQL 搜索表达式字符串，如 %key%(包含 key), key%(以 key 开始), %k%e%y%(包含字母 k,e,y) 等，% 表示任意字符 | [\"name$\":\"%m%\"](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"name$\":\"%2525m%2525\"}}})，对应 SQL 是`name LIKE '%m%'`，查询 name 包含 \"m\" 的一个 User 数组"," 正则匹配 | \"key~\":\"正则表达式\" =\u003e \"key~\":[\"正则表达式\"]，任意正则表达式字符串，如 ^[0-9]+$ ，*~ 忽略大小写，可用于高级搜索 | [\"name~\":\"^[0-9]+$\"](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"name~\":\"^[0-9]%252B$\"}}})，对应 SQL 是`name REGEXP '^[0-9]+$'`，查询 name 中字符全为数字的一个 User 数组"," 连续范围 | \"key%\":\"start,end\" =\u003e \"key%\":[\"start,end\"]，其中 start 和 end 都只能为 Number, String 中的一种，如 \"2017-01-01,2019-01-01\" ，[\"1,90000\", \"82001,100000\"] ，可用于连续范围内的筛选 | [\"date%\":\"2017-10-01,2018-10-01\"](http://apijson.cn:8080/get/{\"User[]\":{\"count\":3,\"User\":{\"date%2525\":\"2017-10-01,2018-10-01\"}}})，对应SQL是`date BETWEEN '2017-10-01' AND '2018-10-01'`，查询在2017-10-01和2018-10-01期间注册的用户的一个User数组"," 新建别名 | \"name:alias\"，name 映射为 alias，用 alias 替代 name。可用于 column,Table,SQL 函数 等。只用于 GET 类型、HEAD 类型的请求 | [\"@column\":\"toId:parentId\"](http://apijson.cn:8080/get/{\"Comment\":{\"@column\":\"id,toId:parentId\",\"id\":51}})，对应 SQL 是`toId AS parentId`，将查询的字段 toId 变为 parentId 返回"," 增加 或 扩展 | \"key+\":Object，Object的类型由key指定，且类型为 Number,String,JSONArray 中的一种。如 82001,\"apijson\",[\"url0\",\"url1\"] 等。只用于 PUT 请求 | \"praiseUserIdList+\":[82001]，对应 SQL 是`json_insert(praiseUserIdList,82001)`，添加一个点赞用户 id，即这个用户点了赞"," 减少 或 去除 | \"key-\":Object，与\"key+\"相反 | \"balance-\":100.00，对应SQL是`balance = balance - 100.00`，余额减少100.00，即花费了100元"," 比较运算 | \u003e, \u003c, \u003e=, \u003c= 比较运算符，用于 \u003cbr /\u003e① 提供 \"id{}\":\"\u003c=90000\" 这种条件范围的简化写法 \u003cbr /\u003e\u003cbr /\u003e② 实现子查询相关比较运算\u003cbr /\u003e\u003cbr /\u003e不支持 \"key=\":Object 和 \"key!=\":Object 这两种写法，直接用更简单的 \"key\":Object 和 \"key!\":Object 替代。 |  ① [\"id\u003c=\":90000](http://apijson.cn:8080/get/{\"[]\":{\"User\":{\"id\u003c=\":90000}}})，对应 SQL 是`id\u003c=90000`，查询符合id\u003c=90000的一个User数组\u003cbr /\u003e\u003cbr /\u003e ② [\"id\u003e@\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"from\":\"Comment\",\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp;  \u0026nbsp;\u0026nbsp; \"@column\":\"min(userId)\" \u003cbr /\u003e \u0026nbsp;\u0026nbsp; }\u003cbr /\u003e}](http://apijson.cn:8080/get/{\"User\":{\"id\u003e@\":{\"from\":\"Comment\",\"Comment\":{\"@column\":\"min(userId)\"}}}})\u003cbr /\u003e WHERE id\u003e(SELECT min(userId) FROM Comment)"," 逻辑运算 | \u0026, \\|, ! 逻辑运算符，对应数据库 SQL 中的 AND, OR, NOT。 \u003cbr /\u003e横或纵与：同一键值对的值内条件默认 \\| 或连接，可以在 key 后加逻辑运算符来具体指定；不同键值对的条件默认 \u0026 与连接，可以用下面说明的对象关键词 @combine 来具体指定。 \u003cbr /\u003e\u003cbr /\u003e① \u0026 可用于 \"key\u0026{}\":\"条件\"等\u003cbr /\u003e\u003cbr /\u003e② \\| 可用于 \"key\\|{}\":\"条件\", \"key\\|{}\":[]等，一般可省略\u003cbr /\u003e\u003cbr /\u003e③ ! 可单独使用，如 \"key!\":Object，也可像 \u0026,\\| 一样配合其他功能符使用 \u003cbr /\u003e \"key!\":null 无效，null 值会导致整个键值对被忽略解析，可以用 \"key{}\":\"!=null\" 替代，\u003cbr /\u003e\"key\":null 同理，用 \"key{}\":\"=null\" 替代。 |  ① [\"id\u0026{}\":\"\u003e80000,\u003c=90000\"](http://apijson.cn:8080/head/{\"User\":{\"id\u0026{}\":\"\u003e80000,\u003c=90000\"}})，对应SQL是`id\u003e80000 AND id\u003c=90000`，即id满足id\u003e80000 \u0026 id\u003c=90000\u003cbr /\u003e\u003cbr /\u003e ② [\"id\\|{}\":\"\u003e90000,\u003c=80000\"](http://apijson.cn:8080/head/{\"User\":{\"id\\|{}\":\"\u003e90000,\u003c=80000\"}})，同 \"id{}\":\"\u003e90000,\u003c=80000\"，对应 SQL 是`id\u003e90000 OR id\u003c=80000`，即 id 满足 id\u003e90000 \\| id\u003c=80000\u003cbr /\u003e\u003cbr /\u003e ③ [\"id!{}\":[82001,38710]](http://apijson.cn:8080/head/{\"User\":{\"id!{}\":[82001,38710]}})，对应 SQL 是`id NOT IN(82001,38710)`，即 id 满足 ! (id=82001 \\| id=38710)，可过滤黑名单的消息"," 数组关键词，可自定义 | \"key\":Object，key为 \"[]\":{} 中 {} 内的关键词，Object 的类型由 key 指定\u003cbr /\u003e\u003cbr /\u003e① \"count\":5，查询数量，0 表示最大值，默认值为 10，默认最大值为 100 \u003cbr /\u003e\u003cbr /\u003e② \"page\":1，查询页码，从 0 开始，默认值为 0，默认最大值为 100，一般和 count 一起用\u003cbr /\u003e\u003cbr /\u003e③ \"query\":2，查询内容\u003cbr /\u003e0-对象，1-总数和分页详情，2-数据、总数和分页详情\u003cbr /\u003e总数关键词为 total，分页详情关键词为 info，\u003cbr /\u003e 它们都和 query 同级，通过引用赋值得到自定义 key:value 键值对，不传则返回默认键值对，例如  \u003cbr /\u003e\"total@\":\"/[]/total\", \"info@\":\"/[]/info\" \u003cbr /\u003e这里query及total仅为GET类型的请求提供方便，\u003cbr /\u003e 一般可直接用HEAD类型的请求获取总数\u003cbr /\u003e\u003cbr /\u003e④ \"join\":\"\u0026/Table0,\\\u003c/Table1/key1@\" 或 \u003cbr /\u003e\"join\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"\u0026/Table0\":{},  // 支持 ON 多个字段关联,\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"\\\u003c/Table1/key1@\":{  // ON 只允许指定的 key1 关联\u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"key0\":value0, // 其它ON条件 \u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"key2\":value2,\u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; ... \u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"@combine\":\"...\", // 其它ON条件的组合方式 \u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"@column\":\"...\", // 外层 SELECT \u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"@group\":\"...\", // 外层 GROUP BY \u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"@having\":\"...\" // 外层 HAVING \u003cbr /\u003e \u0026nbsp;\u0026nbsp; }\u003cbr /\u003e}\u003cbr /\u003e多表连接方式：\u003cbr /\u003e  \"@\" - APP JOIN \u003cbr /\u003e \"\\\u003c\" - LEFT JOIN \u003cbr /\u003e \"\u003e\" - RIGHT JOIN \u003cbr /\u003e \"\u0026\" - INNER JOIN \u003cbr /\u003e \"\\|\" - FULL JOIN \u003cbr /\u003e  \"!\" - OUTER JOIN \u003cbr /\u003e  \"*\" - CROSS JOIN \u003cbr /\u003e  \"^\" - SIDE JOIN \u003cbr /\u003e  \"(\" - ANTI JOIN \u003cbr /\u003e  \")\" - FOREIGN JOIN \u003cbr /\u003e其中 @ APP JOIN 为应用层连表，会从已查出的主表里取得所有副表 key@ 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...]，然后把原来副表 count 次查询 key=$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能；\u003cbr /\u003e 其它 JOIN 都是 SQL JOIN，具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应 \u003cbr /\u003e`\"join\":\"\u003c/ViceTable/key@\",`\u003cbr /\u003e`\"MainTable\":{},`\u003cbr /\u003e`\"ViceTable\":{\"key@\":\"/MainTable/refKey\"}`\u003cbr /\u003e会对应生成 \u003cbr /\u003e`MainTable LEFT JOIN ViceTable` \u003cbr /\u003e`ON ViceTable.key=MainTable.refKey` AND 其它ON条件 \u003cbr /\u003e 除了 = 等价关联，也支持 ! 不等关联、\\\u003e \\\u003c \\\u003e= \\\u003c= 等比较关联和 $ ~ {} \u003c\u003e 等其它复杂关联方式 \u003cbr /\u003e\u003cbr /\u003e⑤ \"otherKey\":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值  | ① 查询User数组，最多5个：\u003cbr /\u003e[\"count\":5](http://apijson.cn:8080/get/{\"[]\":{\"count\":5,\"User\":{}}})\u003cbr /\u003e对应 SQL 是`LIMIT 5` \u003cbr /\u003e\u003cbr /\u003e ② 查询第3页的User数组，每页5个：\u003cbr /\u003e[\"count\":5,\u003cbr /\u003e\"page\":3](http://apijson.cn:8080/get/{\"[]\":{\"count\":5,\"page\":3,\"User\":{}}})\u003cbr /\u003e对应 SQL 是`LIMIT 5 OFFSET 15` \u003cbr /\u003e\u003cbr /\u003e ③ 查询User数组和对应的User总数：\u003cbr /\u003e[\"[]\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"query\":2,\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"User\":{}\u003cbr /\u003e},\u003cbr /\u003e\"total@\":\"/[]/total\", // 可省略\u003cbr /\u003e\"info@\":\"/[]/info\" // 可省略](http://apijson.cn:8080/get/{\"[]\":{\"query\":2,\"count\":5,\"User\":{}},\"total@\":\"%252F[]%252Ftotal\",\"info@\":\"%252F[]%252Finfo\"})\u003cbr /\u003e 返回的数据中，总数及分页详情结构为： \u003cbr /\u003e  \"total\":139, // 总数 \u003cbr /\u003e \"info\":{ // 分页详情 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"total\":139, // 总数 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"count\":5, // 每页数量 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"page\":0, // 当前页码 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"max\":27, // 最大页码 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"more\":true, // 是否还有更多 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"first\":true, // 是否为首页 \u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"last\":false // 是否为尾页 \u003cbr /\u003e} \u003cbr /\u003e\u003cbr /\u003e ④ Moment INNER JOIN User LEFT JOIN Comment：\u003cbr /\u003e[\"[]\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"join\":\"\u0026/User/id@,\\\u003c/Comment\",\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Moment\":{\u003cbr /\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"@group\":\"id\" // 主副表不是一对一，要去除重复数据\u003cbr /\u003e\u0026nbsp;\u0026nbsp; },\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"User\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"name~\":\"t\",\u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id@\":\"/Moment/userId\"\u003cbr /\u003e \u0026nbsp;\u0026nbsp; },\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId@\":\"/Moment/id\"\u003cbr /\u003e \u0026nbsp;\u0026nbsp; }\u003cbr /\u003e}](http://apijson.cn/api/?type=JSON\u0026url=http://apijson.cn:8080/get\u0026json=%7B%22%5B%5D%22:%7B%22count%22:5,%22join%22:%22%26%2FUser%2Fid@,%3C%2FComment%22,%22Moment%22:%7B%22@column%22:%22id,userId,content%22,%22@group%22:%22id%22%7D,%22User%22:%7B%22name~%22:%22t%22,%22id@%22:%22%2FMoment%2FuserId%22,%22@column%22:%22id,name,head%22%7D,%22Comment%22:%7B%22momentId@%22:%22%2FMoment%2Fid%22,%22@column%22:%22id,momentId,content%22%7D%7D%7D)\u003cbr /\u003e\u003cbr /\u003e ⑤ 每一层都加当前用户名：\u003cbr /\u003e[\"User\":{},\u003cbr /\u003e\"[]\":{\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"name@\":\"User/name\", // 自定义关键词\u003cbr /\u003e \u0026nbsp;\u0026nbsp; \"Moment\":{}\u003cbr /\u003e}](http://apijson.cn:8080/get/{\"User\":{},\"[]\":{\"name@\":\"User%252Fname\",\"Moment\":{}}})"," 对象关键词，可自定义 | \"@key\":Object，@key 为 Table:{} 中 {} 内的关键词，Object 的类型由 @key 指定\u003cbr /\u003e\u003cbr /\u003e① \"@combine\":\"key0 \\| (key1 \u0026 (key2 \\| !key3))...\"，条件组合方式，最终按 \u003cbr /\u003e (其它key条件 AND 连接) AND (key0条件 OR (key1条件 AND (key2条件 OR (NOT key3条件)))) \u003cbr /\u003e这种方式连接，其中 \"其它key\" 是指与 @combine 在同一对象，且未被它声明的条件 key，默认都是 \u0026 连接。注意不要缺少或多余任何一个空格。 \u003cbr /\u003e\u003cbr /\u003e② \"@column\":\"column;function(arg)...\"，返回字段\u003cbr /\u003e\u003cbr /\u003e③ \"@order\":\"column0+,column1-...\"，排序方式\u003cbr /\u003e\u003cbr /\u003e④ \"@group\":\"column0,column1...\"，分组方式。如果 @column 里声明了 Table 的 id，则 id 也必须在 @group 中声明；其它情况下必须满足至少一个条件:\u003cbr /\u003e1.分组的 key 在 @column 里声明\u003cbr /\u003e2.Table 主键在 @group 中声明 \u003cbr /\u003e\u003cbr /\u003e⑤ \"@having\":\"function0(...)?value0;function1(...)?value1;function2(...)?value2...\" // OR 连接，或 \u003cbr /\u003e\"@having\u0026\":\"function0(...)?value0;function1(...)?value1;function2(...)?value2...\" // AND 连接，或 \u003cbr /\u003e\"@having\":{\u003cbr /\u003e\u0026nbsp;\u0026nbsp; \"h0\":\"function0(...)?value0\",\u003cbr /\u003e\u0026nbsp;\u0026nbsp; \"h1\":function1(...)?value1\",\u003cbr /\u003e\u0026nbsp;\u0026nbsp; \"h2\":function2(...)?value2...\",\u003cbr /\u003e\u0026nbsp;\u0026nbsp; \"@combine\":\"h0 \u0026 (h1 \\| !h2)\"  // 任意组合，非必传\u003cbr /\u003e}\u003cbr /\u003eSQL 函数条件，一般和 @group 一起用，函数一般在 @column 里声明\u003cbr /\u003e\u003cbr /\u003e⑥ \"@schema\":\"sys\"，集合空间(数据库名/模式)，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr /\u003e\u003cbr /\u003e⑦ \"@database\":\"POSTGRESQL\"，数据库类型，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr /\u003e\u003cbr /\u003e⑧ \"@datasource\":\"DRUID\"，跨数据源，非默认的值可通过它来指定，可以在最外层作为全局默认配置\u003cbr /\u003e\u003cbr /\u003e⑨ \"@json\":\"key0,key1...\"，转为 JSON 格式返回，符合 JSONObject 则转为 {...}，符合 JSONArray 则转为 \\[...] \u003cbr /\u003e\u003cbr /\u003e⑩ \"@role\":\"OWNER\"，来访角色，包括\u003cbr /\u003eUNKNOWN,LOGIN,CONTACT,CIRCLE,OWNER,ADMIN，\u003cbr /\u003e可以在最外层作为全局默认配置，\u003cbr /\u003e可自定义其它角色并重写 Verifier.verify 等相关方法来自定义校验 \u003cbr /\u003e\u003cbr /\u003e⑪ \"@explain\":true，性能分析，可以在最外层作为全局默认配置 \u003cbr /\u003e\u003cbr /\u003e⑫ \"@raw\":\"key0,key1...\"，其中 key0, key1 都对应有键值对\u003cbr /\u003e \"key0\":\"SQL片段或SQL片段的别名\", \u003cbr /\u003e \"key1\":\"SQL片段或SQL片段的别名\" \u003cbr /\u003e 自定义原始SQL片段，可扩展嵌套SQL函数等复杂语句，必须是后端已配置的，只有其它功能符都做不到才考虑，谨慎使用，注意防 SQL 注入\u003cbr /\u003e\u003cbr /\u003e⑬ \"@null\":\"key1,key2...\"，空值键值对，自动插入 key1:null, key2:null ... 并作为有效键值对执行，作为条件时对应 SQL 是 `WHERE tag IS NULL`，作为值时对应 SQL 是 `SET tag = NULL`\u003cbr /\u003e\u003cbr /\u003e⑭ \"@otherKey\":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值 | ① 搜索 name 或 tag 任何一个字段包含字符 a 的 User 列表：\u003cbr /\u003e [\"name~\":\"a\",\u003cbr /\u003e\"tag~\":\"a\",\u003cbr /\u003e\"@combine\":\"name~ \\| tag~\"](http://apijson.cn:8080/get/{\"User[]\":{\"count\":10,\"User\":{\"@column\":\"id,name,tag\",\"name~\":\"a\",\"tag~\":\"a\",\"@combine\":\"name~%20%7C%20tag~\"}}}) \u003cbr /\u003e对应SQL是`name REGEXP 'a' OR tag REGEXP 'a'` \u003cbr /\u003e\u003cbr /\u003e ② 只查询 id,sex,name 这几列并且请求结果也按照这个顺序：\u003cbr /\u003e[\"@column\":\"id,sex,name\"](http://apijson.cn:8080/get/{\"User\":{\"@column\":\"id,sex,name\",\"id\":38710}})\u003cbr /\u003e对应 SQL 是`SELECT id,sex,name` \u003cbr /\u003e\u003cbr /\u003e ③ 查询按 name 降序、id 默认顺序 排序的 User 数组：\u003cbr /\u003e[\"@order\":\"name-,id\"](http://apijson.cn:8080/get/{\"[]\":{\"count\":10,\"User\":{\"@column\":\"name,id\",\"@order\":\"name-,id\"}}})\u003cbr /\u003e对应 SQL 是`ORDER BY name DESC,id` \u003cbr /\u003e\u003cbr /\u003e ④ 查询按 userId 分组的 Moment 数组：\u003cbr /\u003e[\"@group\":\"userId,id\"](http://apijson.cn:8080/get/{\"[]\":{\"count\":10,\"Moment\":%7B\"@column\":\"userId,id\",\"@group\":\"userId,id\"}}})\u003cbr /\u003e对应 SQL 是`GROUP BY userId,id` \u003cbr /\u003e\u003cbr /\u003e ⑤ 查询 按 userId 分组、id 最大值\u003e=100 的 Moment 数组：\u003cbr /\u003e[\"@column\":\"userId;max(id)\",\u003cbr /\u003e\"@group\":\"userId\",\u003cbr /\u003e\"@having\":\"max(id)\u003e=100\"](http://apijson.cn:8080/get/{\"[]\":{\"count\":10,\"Moment\":{\"@column\":\"userId%253Bmax(id)\",\"@group\":\"userId\",\"@having\":\"max(id)\u003e=100\"}}})\u003cbr /\u003e对应 SQL 是`SELECT userId,max(id) ... GROUP BY userId HAVING max(id)\u003e=100` \u003cbr /\u003e还可以指定函数返回名：\u003cbr /\u003e[\"@column\":\"userId;max(id):maxId\",\u003cbr /\u003e\"@group\":\"userId\",\u003cbr /\u003e\"@having\":\"(maxId)\u003e=100\"](http://apijson.cn:8080/get/{\"[]\":{\"count\":10,\"Moment\":{\"@column\":\"userId%253Bmax(id):maxId\",\"@group\":\"userId\",\"@having\":\"(maxId)\u003e=100\"}}})\u003cbr /\u003e对应 SQL 是`SELECT userId,max(id) AS maxId ... GROUP BY userId HAVING (maxId)\u003e=100` \u003cbr /\u003e\u003cbr /\u003e ⑥ 查询 sys 内的 User 表：\u003cbr /\u003e[\"@schema\":\"sys\"](http://apijson.cn:8080/get/{\"User\":{\"@schema\":\"sys\"}})\u003cbr /\u003e对应 SQL 是`FROM sys.User` \u003cbr /\u003e\u003cbr /\u003e ⑦ 查询 PostgreSQL 数据库的 User 表：\u003cbr /\u003e[\"@database\":\"POSTGRESQL\"](http://apijson.cn:8080/get/{\"User\":{\"@database\":\"POSTGRESQL\",\"@explain\":true}})\u003cbr /\u003e\u003cbr /\u003e ⑧ 使用 Druid 连接池查询 User 表：\u003cbr /\u003e[\"@datasource\":\"DRUID\"](http://apijson.cn:8080/get/{\"User\":{\"@datasource\":\"DRUID\"}})\u003cbr /\u003e\u003cbr /\u003e ⑨ 将 VARCHAR 字符串字段 get 转为 JSONArray 返回：\u003cbr /\u003e[\"@json\":\"get\"](http://apijson.cn:8080/get/{\"Access\":{\"@json\":\"get\"}})\u003cbr /\u003e\u003cbr /\u003e ⑩ 查询当前用户的动态：\u003cbr /\u003e[\"@role\":\"OWNER\"](http://apijson.cn:8080/get/{\"[]\":{\"Moment\":{\"@role\":\"OWNER\"}}})\u003cbr /\u003e\u003cbr /\u003e ⑪ 开启性能分析：\u003cbr /\u003e[\"@explain\":true](http://apijson.cn:8080/get/{\"[]\":{\"Moment\":{\"@explain\":true}}})\u003cbr /\u003e对应 SQL 是`EXPLAIN` \u003cbr /\u003e\u003cbr /\u003e ⑫ 统计最近一周偶数 userId 的数量\u003cbr /\u003e[\"@column\":\"date;left(date,10):day;sum(if(userId%2=0,1,0))\",\u003cbr /\u003e\"@group\":\"day\",\u003cbr /\u003e\"@having\":\"to_days(now())-to_days(\\`date\\`)\u003c=7\",\u003cbr /\u003e\"@raw\":\"@column,@having\"](http://apijson.cn:8080/get/{\"[]\":{\"Moment\":{\"@column\":\"date%3bleft(date,10):day%3bsum(if(userId%252=0,1,0))\",\"@group\":\"day\",\"@having\":\"to_days(now())-to_days(\\`date\\`)\u003c=7\",\"@raw\":\"@column,@having\"}}})\u003cbr /\u003e对应 SQL 是``SELECT date, left(date,10) AS day, sum(if(userId%2=0,1,0)) ... GROUP BY day HAVING to_days(now())-to_days(`date`)\u003c=7`` \u003cbr /\u003e\u003cbr /\u003e ⑬ 把用户的标签设置为空 \u003cbr /\u003e[\"@null\":\"tag\"](http://apijson.cn/api/?type=JSON\u0026url=http://apijson.cn:8080/put/User\u0026json={%22id%22:82001,%22@null%22:%22tag%22,%22@explain%22:true}) \u003cbr /\u003e\u003cbr /\u003e ⑭  从pictureList 获取第 0 张图片：\u003cbr /\u003e[\"@position\":0, // 自定义关键词\u003cbr /\u003e\"firstPicture()\":\"getFromArray(pictureList,@position)\"](http://apijson.cn:8080/get/{\"User\":{\"id\":38710,\"@position\":0,\"firstPicture()\":\"getFromArray(pictureList,@position)\"}})"," 全局关键词 | 为最外层对象 {} 内的关键词。其中 @database，@schema, @datasource, @role, @explain 基本同对象关键词，见上方说明，区别是全局关键词会每个表对象中没有时自动放入，作为默认值。 \u003cbr /\u003e\u003cbr /\u003e① \"tag\":\"Table\"，后面的 tag 是非 GET、HEAD 请求中匹配请求的 JSON 结构的标识，一般是要查询的 Table 的名称或该名称对应的数组 Table[] 或 Table:[]，由后端 Request 表中指定。 \u003cbr /\u003e\u003cbr /\u003e② \"version\":1，接口版本，version 不传、为 null 或 \u003c=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本，由后端 Request 表中指定。\u003cbr /\u003e\u003cbr /\u003e③ \"format\":true，格式化返回 Response JSON 的 key，一般是将 TableName 转为 tableName, TableName[] 转为 tableNameList, Table:alias 转为 alias, TableName-key[] 转为 tableNameKeyList 等小驼峰格式。  | ①  查隐私信息：\u003cbr /\u003e[{\"tag\":\"Privacy\",\"Privacy\":{\"id\":82001}}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026type=JSON\u0026json={%22tag%22:%22Privacy%22,%22Privacy%22:{%22id%22:82001}})\u003cbr /\u003e\u003cbr /\u003e ② 使用第 1 版接口查隐私信息：\u003cbr /\u003e[{\"version\":1,\"tag\":\"Privacy\",\"Privacy\":{\"id\":82001}}](http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets\u0026type=JSON\u0026json={%22version%22:1,%22tag%22:%22Privacy%22,%22Privacy%22:{%22id%22:82001}}) \u003cbr /\u003e\u003cbr /\u003e ③ 格式化朋友圈接口返回 JSON 中的 key：\u003cbr /\u003e[{\u003cbr \u003e \u0026nbsp;\u0026nbsp; \"format\":true, \u003cbr \u003e \u0026nbsp;\u0026nbsp; \"[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"page\":0, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Moment\":{}, \u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"User\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"id@\":\"/Moment/userId\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; },\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment[]\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"count\":3,\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"Comment\":{\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; \"momentId@\":\"[]/Moment/id\"\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp; }\u003cbr \u003e \u0026nbsp;\u0026nbsp; }\u003cbr \u003e}](http://apijson.cn:8080/get/{\"format\":true,\"[]\":{\"page\":0,\"count\":3,\"Moment\":{},\"User\":{\"id@\":\"%252FMoment%252FuserId\"},\"Comment[]\":{\"count\":3,\"Comment\":{\"momentId@\":\"[]%252FMoment%252Fid\"}}}})","\u003cbr /\u003e"],"stylingDirectives":[[[0,1,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,76,"pl-corl"],[76,77,"pl-s"]],[[1,3,"pl-ent"]],[],[[0,15,"pl-mh"],[2,14,"pl-en"]],[[86,88,"pl-ent"]],[[52,54,"pl-ent"]],[[0,34,"pl-corl"]],[[0,2,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,109,"pl-corl"],[109,110,"pl-s"]],[],[],[[10,11,"pl-s"],[18,19,"pl-s"],[19,20,"pl-s"],[20,45,"pl-corl"],[45,46,"pl-s"],[49,50,"pl-s"],[57,58,"pl-s"],[58,59,"pl-s"],[59,99,"pl-corl"],[99,100,"pl-s"],[139,140,"pl-s"],[148,155,"pl-s"],[149,155,"pl-corl"],[175,176,"pl-s"],[176,182,"pl-en"],[215,222,"pl-s"],[216,222,"pl-corl"],[242,243,"pl-s"],[243,249,"pl-en"]],[],[[0,1,"pl-v"],[2,16,"pl-mh"],[6,16,"pl-en"],[6,7,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,15,"pl-corl"],[15,16,"pl-s"]],[[0,1,"pl-v"],[2,20,"pl-mh"],[6,20,"pl-en"],[6,7,"pl-s"],[15,16,"pl-s"],[16,17,"pl-s"],[17,19,"pl-corl"],[19,20,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,22,"pl-corl"],[22,23,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,22,"pl-corl"],[22,23,"pl-s"]],[[0,1,"pl-v"],[2,18,"pl-mh"],[6,18,"pl-en"],[6,7,"pl-s"],[13,14,"pl-s"],[14,15,"pl-s"],[15,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,17,"pl-corl"],[17,18,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[10,11,"pl-s"],[11,12,"pl-s"],[12,16,"pl-corl"],[16,17,"pl-s"]],[],[],[[0,23,"pl-mh"],[3,23,"pl-en"],[4,6,"pl-ent"],[7,9,"pl-e"],[10,11,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[19,21,"pl-ent"]],[],[[0,9,"pl-mh"],[5,9,"pl-en"]],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[0,1,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,57,"pl-corl"],[57,58,"pl-s"]],[],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[62,63,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,104,"pl-corl"],[104,105,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[0,11,"pl-mh"],[5,11,"pl-en"]],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[0,1,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,83,"pl-corl"],[83,84,"pl-s"]],[],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[66,67,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,103,"pl-corl"],[103,104,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[0,15,"pl-mh"],[5,15,"pl-en"]],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[0,1,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,84,"pl-corl"],[84,85,"pl-s"]],[],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[1,3,"pl-ent"]],[],[[0,19,"pl-mh"],[5,19,"pl-en"]],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[0,1,"pl-s"],[7,8,"pl-s"],[8,9,"pl-s"],[9,235,"pl-corl"],[235,236,"pl-s"]],[],[],[[1,4,"pl-ent"],[6,10,"pl-ent"],[11,16,"pl-e"],[17,18,"pl-s"],[18,31,"pl-s"],[31,32,"pl-s"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[2,6,"pl-ent"],[9,12,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[49,50,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,107,"pl-corl"],[107,108,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[57,58,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,102,"pl-corl"],[102,103,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[26,31,"pl-s"],[27,31,"pl-corl"],[85,86,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,106,"pl-corl"],[106,107,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[1,2,"pl-ent"],[3,8,"pl-e"],[9,10,"pl-s"],[10,16,"pl-s"],[16,17,"pl-s"]],[[3,4,"pl-ent"],[6,7,"pl-s"],[10,11,"pl-s"],[43,44,"pl-ent"]],[[2,3,"pl-ent"]],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,4,"pl-s"],[4,105,"pl-corl"],[105,106,"pl-s"]],[],[[1,3,"pl-ent"]],[],[[0,1,"pl-s"],[5,6,"pl-s"],[6,7,"pl-s"],[7,28,"pl-corl"],[28,29,"pl-s"]],[],[[1,3,"pl-ent"]],[[1,3,"pl-ent"]],[],[[0,34,"pl-mh"],[3,34,"pl-en"],[4,6,"pl-ent"],[7,9,"pl-e"],[10,11,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[30,32,"pl-ent"]],[],[[0,30,"pl-mh"],[4,30,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[26,28,"pl-ent"]],[],[],[[62,64,"pl-ent"]],[],[],[[2,4,"pl-ent"]],[],[[0,30,"pl-mh"],[4,30,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[26,28,"pl-ent"]],[],[],[],[[70,72,"pl-ent"]],[[22,23,"pl-s"],[23,28,"pl-en"]],[[30,32,"pl-ent"],[36,38,"pl-ent"],[67,69,"pl-ent"],[126,128,"pl-ent"],[132,134,"pl-ent"],[152,154,"pl-ent"],[159,161,"pl-ent"],[164,176,"pl-c1"],[165,169,"pl-k"],[171,175,"pl-k"],[190,192,"pl-ent"],[195,219,"pl-c1"],[196,200,"pl-k"],[202,206,"pl-k"],[208,212,"pl-k"],[214,218,"pl-k"],[224,225,"pl-s"],[225,231,"pl-en"],[233,235,"pl-ent"],[238,262,"pl-c1"],[239,243,"pl-k"],[245,249,"pl-k"],[251,255,"pl-k"],[257,261,"pl-k"],[267,268,"pl-s"],[268,274,"pl-en"],[276,278,"pl-ent"],[281,305,"pl-c1"],[282,286,"pl-k"],[288,292,"pl-k"],[294,298,"pl-k"],[300,304,"pl-k"],[310,312,"pl-ent"],[315,327,"pl-c1"],[316,320,"pl-k"],[322,326,"pl-k"],[331,333,"pl-ent"],[336,348,"pl-c1"],[337,341,"pl-k"],[343,347,"pl-k"],[362,364,"pl-ent"],[367,391,"pl-c1"],[368,372,"pl-k"],[374,378,"pl-k"],[380,384,"pl-k"],[386,390,"pl-k"],[396,398,"pl-ent"],[401,413,"pl-c1"],[402,406,"pl-k"],[408,412,"pl-k"],[416,418,"pl-ent"],[421,433,"pl-c1"],[422,426,"pl-k"],[428,432,"pl-k"],[438,440,"pl-ent"]],[],[[2,4,"pl-ent"]],[],[[0,30,"pl-mh"],[4,30,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[26,28,"pl-ent"]],[],[],[],[],[],[[2,4,"pl-ent"]],[],[[0,30,"pl-mh"],[4,30,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[26,28,"pl-ent"]],[],[],[],[],[],[[2,4,"pl-ent"]],[],[[0,37,"pl-mh"],[4,37,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[33,35,"pl-ent"]],[],[],[[37,38,"pl-s"],[52,54,"pl-ent"],[58,60,"pl-ent"],[63,75,"pl-c1"],[64,68,"pl-k"],[70,74,"pl-k"],[85,87,"pl-ent"],[90,114,"pl-c1"],[91,95,"pl-k"],[97,101,"pl-k"],[103,107,"pl-k"],[109,113,"pl-k"],[126,128,"pl-ent"],[131,143,"pl-c1"],[132,136,"pl-k"],[138,142,"pl-k"],[146,148,"pl-ent"],[151,152,"pl-s"],[152,153,"pl-s"],[153,201,"pl-corl"],[201,202,"pl-s"]],[[24,26,"pl-ent"],[38,40,"pl-ent"],[77,79,"pl-ent"],[83,85,"pl-ent"],[95,97,"pl-ent"],[130,131,"pl-s"],[145,147,"pl-ent"],[151,153,"pl-ent"],[156,168,"pl-c1"],[157,161,"pl-k"],[163,167,"pl-k"],[180,182,"pl-ent"],[185,209,"pl-c1"],[186,190,"pl-k"],[192,196,"pl-k"],[198,202,"pl-k"],[204,208,"pl-k"],[225,227,"pl-ent"],[230,242,"pl-c1"],[231,235,"pl-k"],[237,241,"pl-k"],[247,249,"pl-ent"],[252,264,"pl-c1"],[253,257,"pl-k"],[259,263,"pl-k"],[274,276,"pl-ent"],[279,303,"pl-c1"],[280,284,"pl-k"],[286,290,"pl-k"],[292,296,"pl-k"],[298,302,"pl-k"],[315,317,"pl-ent"],[320,332,"pl-c1"],[321,325,"pl-k"],[327,331,"pl-k"],[335,337,"pl-ent"],[340,341,"pl-s"],[341,342,"pl-s"],[342,416,"pl-corl"],[416,417,"pl-s"]],[[34,36,"pl-ent"],[62,63,"pl-s"],[77,79,"pl-ent"],[83,85,"pl-ent"],[88,100,"pl-c1"],[89,93,"pl-k"],[95,99,"pl-k"],[106,107,"pl-s"],[107,108,"pl-s"],[112,114,"pl-ent"],[117,141,"pl-c1"],[118,122,"pl-k"],[124,128,"pl-k"],[130,134,"pl-k"],[136,140,"pl-k"],[152,154,"pl-ent"],[157,181,"pl-c1"],[158,162,"pl-k"],[164,168,"pl-k"],[170,174,"pl-k"],[176,180,"pl-k"],[195,197,"pl-ent"],[200,224,"pl-c1"],[201,205,"pl-k"],[207,211,"pl-k"],[213,217,"pl-k"],[219,223,"pl-k"],[234,236,"pl-ent"],[239,275,"pl-c1"],[240,244,"pl-k"],[246,250,"pl-k"],[252,256,"pl-k"],[258,262,"pl-k"],[264,268,"pl-k"],[270,274,"pl-k"],[284,286,"pl-ent"],[289,313,"pl-c1"],[290,294,"pl-k"],[296,300,"pl-k"],[302,306,"pl-k"],[308,312,"pl-k"],[316,318,"pl-ent"],[321,333,"pl-c1"],[322,326,"pl-k"],[328,332,"pl-k"],[336,338,"pl-ent"],[341,342,"pl-s"],[342,343,"pl-s"],[343,418,"pl-corl"],[418,419,"pl-s"]],[],[],[],[[2,4,"pl-ent"]],[],[[0,39,"pl-mh"],[4,39,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[35,37,"pl-ent"]],[],[],[[10,12,"pl-ent"],[15,27,"pl-c1"],[16,20,"pl-k"],[22,26,"pl-k"],[37,39,"pl-ent"],[42,66,"pl-c1"],[43,47,"pl-k"],[49,53,"pl-k"],[55,59,"pl-k"],[61,65,"pl-k"],[79,81,"pl-ent"],[84,108,"pl-c1"],[85,89,"pl-k"],[91,95,"pl-k"],[97,101,"pl-k"],[103,107,"pl-k"],[123,125,"pl-ent"],[128,152,"pl-c1"],[129,133,"pl-k"],[135,139,"pl-k"],[141,145,"pl-k"],[147,151,"pl-k"],[157,159,"pl-ent"],[162,174,"pl-c1"],[163,167,"pl-k"],[169,173,"pl-k"],[178,180,"pl-ent"],[183,195,"pl-c1"],[184,188,"pl-k"],[190,194,"pl-k"],[208,210,"pl-ent"],[213,225,"pl-c1"],[214,218,"pl-k"],[220,224,"pl-k"],[242,244,"pl-ent"],[252,254,"pl-ent"],[257,269,"pl-c1"],[258,262,"pl-k"],[264,268,"pl-k"],[279,281,"pl-ent"],[284,308,"pl-c1"],[285,289,"pl-k"],[291,295,"pl-k"],[297,301,"pl-k"],[303,307,"pl-k"],[321,323,"pl-ent"],[326,350,"pl-c1"],[327,331,"pl-k"],[333,337,"pl-k"],[339,343,"pl-k"],[345,349,"pl-k"],[365,367,"pl-ent"],[370,394,"pl-c1"],[371,375,"pl-k"],[377,381,"pl-k"],[383,387,"pl-k"],[389,393,"pl-k"],[399,401,"pl-ent"],[404,416,"pl-c1"],[405,409,"pl-k"],[411,415,"pl-k"],[420,422,"pl-ent"],[425,437,"pl-c1"],[426,430,"pl-k"],[432,436,"pl-k"],[450,452,"pl-ent"],[455,467,"pl-c1"],[456,460,"pl-k"],[462,466,"pl-k"],[484,486,"pl-ent"]],[],[],[],[],[],[],[[55,78,"pl-corl"],[92,119,"pl-corl"],[125,127,"pl-ent"]],[[33,34,"pl-s"],[34,39,"pl-en"],[53,55,"pl-ent"]],[[123,125,"pl-ent"]],[[53,55,"pl-ent"]],[[38,40,"pl-ent"]],[[62,64,"pl-ent"]],[],[],[[1,3,"pl-ent"]],[[1,3,"pl-ent"]],[],[[0,25,"pl-mh"],[3,25,"pl-en"],[4,6,"pl-ent"],[7,9,"pl-e"],[10,11,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[21,23,"pl-ent"]],[],[[0,30,"pl-mh"],[4,30,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[26,28,"pl-ent"]],[],[],[],[],[],[[7,9,"pl-ent"],[23,25,"pl-ent"],[36,38,"pl-ent"],[82,83,"pl-s"],[83,86,"pl-en"],[90,91,"pl-s"],[106,107,"pl-s"],[107,108,"pl-s"],[108,234,"pl-corl"],[234,235,"pl-s"]],[[8,10,"pl-ent"],[24,26,"pl-ent"],[40,42,"pl-ent"],[89,90,"pl-s"],[90,93,"pl-en"],[97,98,"pl-s"],[112,113,"pl-s"],[113,114,"pl-s"],[114,248,"pl-corl"],[248,249,"pl-s"]],[],[],[],[],[],[[120,122,"pl-ent"]],[[7,8,"pl-s"],[8,11,"pl-en"],[81,83,"pl-ent"]],[[191,193,"pl-ent"]],[[52,54,"pl-ent"]],[[72,74,"pl-ent"]],[[56,58,"pl-ent"]],[],[],[[1,3,"pl-ent"]],[],[[0,29,"pl-mh"],[4,29,"pl-en"],[5,7,"pl-ent"],[8,10,"pl-e"],[11,12,"pl-s"],[12,15,"pl-s"],[15,16,"pl-s"],[25,27,"pl-ent"]],[],[],[],[[12,13,"pl-s"],[13,14,"pl-s"],[115,116,"pl-s"],[122,123,"pl-s"],[123,124,"pl-s"],[138,139,"pl-s"],[139,140,"pl-s"],[140,199,"pl-corl"],[199,200,"pl-s"],[319,320,"pl-s"],[320,321,"pl-s"],[332,333,"pl-s"],[333,334,"pl-s"]],[[18,19,"pl-s"],[19,20,"pl-s"],[52,53,"pl-s"],[60,61,"pl-s"],[78,80,"pl-s"],[80,81,"pl-s"],[81,166,"pl-corl"],[166,167,"pl-s"],[176,177,"pl-s"],[177,201,"pl-c1"],[201,202,"pl-s"]],[[59,60,"pl-s"],[76,78,"pl-c1"],[84,85,"pl-s"],[85,86,"pl-s"],[86,169,"pl-corl"],[158,160,"pl-c1"],[169,170,"pl-s"],[179,180,"pl-s"],[180,201,"pl-c1"],[201,202,"pl-s"],[214,216,"pl-c1"],[223,225,"pl-c1"]],[[15,17,"pl-c1"],[18,19,"pl-s"],[19,24,"pl-en"],[35,37,"pl-c1"],[39,40,"pl-s"],[45,46,"pl-s"],[116,117,"pl-s"],[132,134,"pl-c1"],[141,142,"pl-s"],[142,143,"pl-s"],[143,226,"pl-corl"],[214,216,"pl-c1"],[226,227,"pl-s"],[234,235,"pl-s"],[235,269,"pl-c1"],[269,270,"pl-s"]],[[21,23,"pl-ent"],[27,39,"pl-c1"],[28,32,"pl-k"],[34,38,"pl-k"],[56,58,"pl-ent"],[62,74,"pl-c1"],[63,67,"pl-k"],[69,73,"pl-k"],[91,93,"pl-ent"],[98,100,"pl-ent"],[107,109,"pl-ent"],[126,128,"pl-ent"],[147,149,"pl-ent"],[183,184,"pl-s"],[194,196,"pl-ent"],[200,212,"pl-c1"],[201,205,"pl-k"],[207,211,"pl-k"],[231,233,"pl-ent"],[237,249,"pl-c1"],[238,242,"pl-k"],[244,248,"pl-k"],[262,264,"pl-ent"],[268,280,"pl-c1"],[269,273,"pl-k"],[275,279,"pl-k"],[282,294,"pl-c1"],[283,287,"pl-k"],[289,293,"pl-k"],[310,312,"pl-ent"],[316,328,"pl-c1"],[317,321,"pl-k"],[323,327,"pl-k"],[331,333,"pl-ent"],[337,338,"pl-s"],[338,339,"pl-s"],[339,429,"pl-corl"],[429,430,"pl-s"],[431,433,"pl-ent"]],[[170,172,"pl-ent"],[242,243,"pl-s"],[293,294,"pl-s"],[294,295,"pl-s"],[295,394,"pl-corl"],[394,395,"pl-s"],[404,405,"pl-s"],[470,471,"pl-s"],[471,472,"pl-s"],[472,597,"pl-corl"],[597,598,"pl-s"],[616,617,"pl-s"],[617,621,"pl-en"]],[[9,13,"pl-s"],[10,13,"pl-corl"],[36,38,"pl-ent"],[67,69,"pl-ent"],[97,99,"pl-ent"],[142,144,"pl-ent"],[172,173,"pl-s"],[174,180,"pl-s"],[175,180,"pl-corl"],[187,189,"pl-ent"],[194,201,"pl-s"],[195,201,"pl-corl"],[207,209,"pl-ent"],[214,224,"pl-s"],[215,224,"pl-corl"],[251,257,"pl-s"],[252,257,"pl-corl"],[258,265,"pl-s"],[259,265,"pl-corl"],[267,268,"pl-s"],[268,269,"pl-s"],[269,385,"pl-corl"],[385,386,"pl-s"],[388,390,"pl-ent"],[399,401,"pl-ent"],[405,406,"pl-s"],[406,436,"pl-c1"],[436,437,"pl-s"],[439,441,"pl-ent"],[461,463,"pl-ent"],[467,468,"pl-s"],[468,529,"pl-c1"],[529,530,"pl-s"],[532,534,"pl-ent"],[544,546,"pl-ent"],[563,565,"pl-ent"],[569,581,"pl-c1"],[570,574,"pl-k"],[576,580,"pl-k"],[595,597,"pl-ent"],[601,613,"pl-c1"],[602,606,"pl-k"],[608,612,"pl-k"],[622,623,"pl-s"],[623,628,"pl-en"],[631,633,"pl-ent"],[637,649,"pl-c1"],[638,642,"pl-k"],[644,648,"pl-k"],[657,658,"pl-s"],[658,659,"pl-s"],[661,663,"pl-ent"],[670,672,"pl-ent"]],[[108,110,"pl-ent"],[180,187,"pl-s"],[181,187,"pl-corl"],[198,205,"pl-s"],[199,205,"pl-corl"],[227,228,"pl-s"],[239,241,"pl-ent"],[245,257,"pl-c1"],[246,250,"pl-k"],[252,256,"pl-k"],[273,275,"pl-ent"],[281,283,"pl-ent"],[295,297,"pl-ent"],[301,313,"pl-c1"],[302,306,"pl-k"],[308,312,"pl-k"],[337,339,"pl-ent"],[343,344,"pl-s"],[344,345,"pl-s"],[345,439,"pl-corl"],[439,440,"pl-s"],[441,443,"pl-ent"],[490,492,"pl-ent"],[527,529,"pl-ent"]],[[16,18,"pl-ent"],[22,34,"pl-c1"],[23,27,"pl-k"],[29,33,"pl-k"],[51,53,"pl-ent"],[57,69,"pl-c1"],[58,62,"pl-k"],[64,68,"pl-k"],[108,110,"pl-ent"],[114,126,"pl-c1"],[115,119,"pl-k"],[121,125,"pl-k"],[143,145,"pl-ent"],[150,152,"pl-ent"],[159,161,"pl-ent"],[182,184,"pl-ent"],[208,210,"pl-ent"],[251,252,"pl-s"],[260,262,"pl-ent"],[266,278,"pl-c1"],[267,271,"pl-k"],[273,277,"pl-k"],[304,306,"pl-ent"],[310,322,"pl-c1"],[311,315,"pl-k"],[317,321,"pl-k"],[335,337,"pl-ent"],[341,353,"pl-c1"],[342,346,"pl-k"],[348,352,"pl-k"],[355,367,"pl-c1"],[356,360,"pl-k"],[362,366,"pl-k"],[369,376,"pl-s"],[370,376,"pl-corl"],[393,395,"pl-ent"],[399,411,"pl-c1"],[400,404,"pl-k"],[406,410,"pl-k"],[414,416,"pl-ent"],[420,421,"pl-s"],[421,422,"pl-s"],[422,520,"pl-corl"],[520,521,"pl-s"],[522,524,"pl-ent"]],[[8,9,"pl-s"],[9,26,"pl-c1"],[26,27,"pl-s"],[31,32,"pl-s"],[32,51,"pl-c1"],[51,52,"pl-s"],[135,136,"pl-s"],[149,150,"pl-s"],[150,151,"pl-s"],[151,231,"pl-corl"],[231,232,"pl-s"],[241,242,"pl-s"],[242,257,"pl-c1"],[257,258,"pl-s"]],[[12,13,"pl-s"],[30,31,"pl-s"],[33,34,"pl-s"],[41,42,"pl-s"],[57,58,"pl-s"],[61,62,"pl-s"],[66,67,"pl-s"],[67,68,"pl-s"],[85,86,"pl-s"],[91,92,"pl-s"],[96,97,"pl-s"],[100,101,"pl-s"],[104,105,"pl-s"],[105,106,"pl-s"],[106,187,"pl-corl"],[187,188,"pl-s"],[197,198,"pl-s"],[198,220,"pl-c1"],[220,221,"pl-s"]],[[37,38,"pl-s"],[49,50,"pl-s"],[118,119,"pl-s"],[144,145,"pl-s"],[161,162,"pl-s"],[193,194,"pl-s"],[194,195,"pl-s"],[195,289,"pl-corl"],[289,290,"pl-s"],[297,298,"pl-s"],[298,340,"pl-c1"],[340,341,"pl-s"]],[[13,14,"pl-s"],[14,19,"pl-en"],[102,103,"pl-s"],[104,111,"pl-s"],[105,111,"pl-corl"],[118,119,"pl-s"],[119,127,"pl-en"],[128,129,"pl-s"],[129,130,"pl-s"],[130,207,"pl-corl"],[207,208,"pl-s"],[217,218,"pl-s"],[218,234,"pl-c1"],[234,235,"pl-s"]],[[17,18,"pl-s"],[18,24,"pl-en"],[93,94,"pl-s"],[107,108,"pl-s"],[144,145,"pl-s"],[150,151,"pl-s"],[160,161,"pl-s"],[161,196,"pl-c1"],[196,197,"pl-s"]],[[17,18,"pl-s"],[18,24,"pl-en"],[61,62,"pl-s"],[62,88,"pl-c1"],[88,89,"pl-s"]],[[31,33,"pl-ent"],[71,73,"pl-ent"],[77,79,"pl-ent"],[96,98,"pl-ent"],[102,104,"pl-ent"],[117,118,"pl-s"],[118,124,"pl-en"],[134,135,"pl-s"],[135,141,"pl-en"],[161,162,"pl-s"],[162,168,"pl-en"],[177,178,"pl-s"],[178,184,"pl-en"],[194,195,"pl-s"],[207,208,"pl-s"],[208,209,"pl-s"],[209,266,"pl-corl"],[266,267,"pl-s"],[276,277,"pl-s"],[277,286,"pl-c1"],[286,287,"pl-s"],[311,313,"pl-ent"],[317,319,"pl-ent"],[325,326,"pl-s"],[335,337,"pl-ent"],[341,353,"pl-c1"],[342,346,"pl-k"],[348,352,"pl-k"],[372,374,"pl-ent"],[378,390,"pl-c1"],[379,383,"pl-k"],[385,389,"pl-k"],[403,405,"pl-ent"],[409,421,"pl-c1"],[410,414,"pl-k"],[416,420,"pl-k"],[423,435,"pl-c1"],[424,428,"pl-k"],[430,434,"pl-k"],[437,444,"pl-s"],[438,444,"pl-corl"],[461,463,"pl-ent"],[467,479,"pl-c1"],[468,472,"pl-k"],[474,478,"pl-k"],[482,484,"pl-ent"],[488,489,"pl-s"],[489,490,"pl-s"],[490,589,"pl-corl"],[589,590,"pl-s"],[591,593,"pl-ent"]],[],[],[],[],[[1,3,"pl-ent"]]],"colorizedLines":null}},"title":"APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON","appPayload":{},"meta":{"title":"APIJSON/Document.md at 7.7.0 · APIJSON/APIJSON"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/APIJSON/APIJSON" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="7.7.0 branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">7.7.0</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/APIJSON/APIJSON/tree/7.7.0" data-discover="true">APIJSON</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">Document.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_5ipla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_5ipla9lik5_ _R_5ipla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_5ipla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_v4pla9lik5_" id="_R_14pla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_v4pla9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_v4tla9lik5_" id="_R_14tla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_v4tla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/APIJSON/APIJSON/commits/7.7.0/Document.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/APIJSON/APIJSON/commits/7.7.0/Document.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="63.1 KB" style="--truncate-max-width:100%"><span>426 lines (365 loc) · 63.1 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="7.7.0 tag" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">7.7.0</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/APIJSON/APIJSON/tree/7.7.0" data-discover="true">APIJSON</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">Document.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="63.1 KB" style="--truncate-max-width:100%"><span>426 lines (365 loc) · 63.1 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/APIJSON/APIJSON/raw/refs/tags/7.7.0/Document.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><p dir="auto"><a href="https://github.com/Tencent/APIJSON/blob/master/Document-English.md">English</a>
<br></p>
<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">APIJSON 通用文档</h1><a id="user-content-apijson-通用文档" class="anchor" aria-label="Permalink: APIJSON 通用文档" href="#apijson-通用文档"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">本文是通用文档，只和 APIJSON 协议有关，和 C#, Go, Java, JavaScript, PHP, Python, TypeScript 等开发语言无关。 <br>
具体开发语言相关的 配置、运行、部署 等文档见各个相关项目的文档，可以在首页点击对应语言的入口来查看。<br>
<a href="https://github.com/Tencent/APIJSON">https://github.com/Tencent/APIJSON</a>
<a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/5738175/134520081-a63d3817-321c-4e7b-9e03-73c6827a19c1.png"><img src="https://user-images.githubusercontent.com/5738175/134520081-a63d3817-321c-4e7b-9e03-73c6827a19c1.png" alt="image" style="max-width: 100%;"></a></p>
<p dir="auto">后端开发者可以先看 <a href="http://apijson.cn/doc/zh/" rel="nofollow">图文入门教程1</a> 或 <a href="https://hanxu2018.github.io/APIJSON-DOC/" rel="nofollow">图文入门教程2</a> （和本文档有出入的点以本文档为准。例如正则匹配 key? 已废弃，用 key~ 替代；例如 "@column":"store_id,sum(amt):totAmt" 中逗号 , 有误，应该用分号 ; 隔开 SQL 函数，改为 "@column":"store_id;sum(amt):totAmt"）</p>
<ul dir="auto">
<li>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><a href="#1">1.示例</a></h3><a id="user-content-1示例" class="anchor" aria-label="Permalink: 1.示例" href="#1示例"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</li>
<li>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><a href="#2">2.对比传统方式</a></h3><a id="user-content-2对比传统方式" class="anchor" aria-label="Permalink: 2.对比传统方式" href="#2对比传统方式"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</li>
<li><a href="#2.1">2.1 开发流程</a></li>
<li><a href="#2.2">2.2 前端请求</a></li>
<li><a href="#2.3">2.3 后端操作</a></li>
<li><a href="#2.4">2.4 前端解析</a></li>
<li><a href="#2.5">2.5 对应不同需求的请求</a></li>
<li><a href="#2.6">2.6 对应不同请求的结果</a></li>
<li>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><a href="#3">3.设计规范</a></h3><a id="user-content-3设计规范" class="anchor" aria-label="Permalink: 3.设计规范" href="#3设计规范"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
</li>
<li><a href="#3.1">3.1 操作方法</a></li>
<li><a href="#3.2">3.2 功能符</a></li>
</ul>
<h2 dir="auto"></h2><div class="markdown-heading" dir="auto"><h2 id="user-content-1" tabindex="-1" class="heading-element" dir="auto">1.示例</h2><a id="user-content-1示例-1" class="anchor" aria-label="Permalink: 1.示例" href="#1示例-1"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h2 dir="auto"></h2>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">获取用户</h4><a id="user-content-获取用户" class="anchor" aria-label="Permalink: 获取用户" href="#获取用户"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">请求：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;User&quot;:{
    &quot;id&quot;:38710
  }
}"><pre class="notranslate"><code>{
  "User":{
    "id":38710
  }
}
</code></pre></div>
<p dir="auto"><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D%7D" rel="nofollow">点击这里测试</a></p>
<p dir="auto">返回：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;User&quot;:{
    &quot;id&quot;:38710,
    &quot;sex&quot;:0,
    &quot;name&quot;:&quot;TommyLemon&quot;,
    &quot;tag&quot;:&quot;Android&amp;Java&quot;,
    &quot;head&quot;:&quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000&quot;,
    &quot;date&quot;:1485948110000,
    &quot;pictureList&quot;:[
      &quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000&quot;,
      &quot;http://common.cnblogs.com/images/icon_weibo_24.png&quot;
    ]
  },
  &quot;code&quot;:200,
  &quot;msg&quot;:&quot;success&quot;
}"><pre class="notranslate"><code>{
  "User":{
    "id":38710,
    "sex":0,
    "name":"TommyLemon",
    "tag":"Android&amp;Java",
    "head":"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
    "date":1485948110000,
    "pictureList":[
      "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
      "http://common.cnblogs.com/images/icon_weibo_24.png"
    ]
  },
  "code":200,
  "msg":"success"
}
</code></pre></div>
<p align="center" dir="auto">
  [GIF] APIJSON 各种单表对象查询：简单查询、统计、分组、排序、聚合、比较、筛选字段、字段别名 等
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_single.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_single.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">获取用户列表</h4><a id="user-content-获取用户列表" class="anchor" aria-label="Permalink: 获取用户列表" href="#获取用户列表"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">请求：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;[]&quot;:{
    &quot;count&quot;:3,             //只要3个
    &quot;User&quot;:{
      &quot;@column&quot;:&quot;id,name&quot;  //只要id,name这两个字段
    }
  }
}"><pre class="notranslate"><code>{
  "[]":{
    "count":3,             //只要3个
    "User":{
      "@column":"id,name"  //只要id,name这两个字段
    }
  }
}
</code></pre></div>
<p dir="auto"><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22@column%22:%22id,name%22%7D%7D%7D" rel="nofollow">点击这里测试</a></p>
<p dir="auto">返回：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;[]&quot;:[
    {
      &quot;User&quot;:{
        &quot;id&quot;:38710,
        &quot;name&quot;:&quot;TommyLemon&quot;
      }
    },
    {
      &quot;User&quot;:{
        &quot;id&quot;:70793,
        &quot;name&quot;:&quot;Strong&quot;
      }
    },
    {
      &quot;User&quot;:{
        &quot;id&quot;:82001,
        &quot;name&quot;:&quot;Android&quot;
      }
    }
  ],
  &quot;code&quot;:200,
  &quot;msg&quot;:&quot;success&quot;
}"><pre class="notranslate"><code>{
  "[]":[
    {
      "User":{
        "id":38710,
        "name":"TommyLemon"
      }
    },
    {
      "User":{
        "id":70793,
        "name":"Strong"
      }
    },
    {
      "User":{
        "id":82001,
        "name":"Android"
      }
    }
  ],
  "code":200,
  "msg":"success"
}
</code></pre></div>
<p align="center" dir="auto">
  [GIF] APIJSON 各种单表数组查询：简单查询、统计、分组、排序、聚合、分页、比较、搜索、正则、条件组合 等
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_array.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_array.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">获取动态及发布者用户</h4><a id="user-content-获取动态及发布者用户" class="anchor" aria-label="Permalink: 获取动态及发布者用户" href="#获取动态及发布者用户"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">请求：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;Moment&quot;:{
  },
  &quot;User&quot;:{
    &quot;id@&quot;:&quot;Moment/userId&quot;  //User.id = Moment.userId
  }
}"><pre class="notranslate"><code>{
  "Moment":{
  },
  "User":{
    "id@":"Moment/userId"  //User.id = Moment.userId
  }
}
</code></pre></div>
<p dir="auto"><a href="http://apijson.cn:8080/get/%7B%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22Moment%252FuserId%22%7D%7D" rel="nofollow">点击这里测试</a></p>
<p dir="auto">返回：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;Moment&quot;:{
    &quot;id&quot;:12,
    &quot;userId&quot;:70793,
    &quot;date&quot;:&quot;2017-02-08 16:06:11.0&quot;,
    &quot;content&quot;:&quot;1111534034&quot;
  },
  &quot;User&quot;:{
    &quot;id&quot;:70793,
    &quot;sex&quot;:0,
    &quot;name&quot;:&quot;Strong&quot;,
    &quot;tag&quot;:&quot;djdj&quot;,
    &quot;head&quot;:&quot;http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000&quot;,
    &quot;contactIdList&quot;:[
      38710,
      82002
    ],
    &quot;date&quot;:&quot;2017-02-01 19:21:50.0&quot;
  },
  &quot;code&quot;:200,
  &quot;msg&quot;:&quot;success&quot;
}"><pre class="notranslate"><code>{
  "Moment":{
    "id":12,
    "userId":70793,
    "date":"2017-02-08 16:06:11.0",
    "content":"1111534034"
  },
  "User":{
    "id":70793,
    "sex":0,
    "name":"Strong",
    "tag":"djdj",
    "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000",
    "contactIdList":[
      38710,
      82002
    ],
    "date":"2017-02-01 19:21:50.0"
  },
  "code":200,
  "msg":"success"
}
</code></pre></div>
<br>
<div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">获取类似微信朋友圈的动态列表</h4><a id="user-content-获取类似微信朋友圈的动态列表" class="anchor" aria-label="Permalink: 获取类似微信朋友圈的动态列表" href="#获取类似微信朋友圈的动态列表"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">请求：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;[]&quot;:{                             //请求一个数组
    &quot;page&quot;:0,                        //数组条件
    &quot;count&quot;:2,
    &quot;Moment&quot;:{                       //请求一个名为Moment的对象
      &quot;content$&quot;:&quot;%a%&quot;               //对象条件，搜索content中包含a的动态
    },
    &quot;User&quot;:{
      &quot;id@&quot;:&quot;/Moment/userId&quot;,        //User.id = Moment.userId  缺省引用赋值路径，从所处容器的父容器路径开始
      &quot;@column&quot;:&quot;id,name,head&quot;       //指定返回字段
    },
    &quot;Comment[]&quot;:{                    //请求一个名为Comment的数组，并去除Comment包装
      &quot;count&quot;:2,
      &quot;Comment&quot;:{
        &quot;momentId@&quot;:&quot;[]/Moment/id&quot;   //Comment.momentId = Moment.id  完整引用赋值路径
      }
    }
  }
}"><pre class="notranslate"><code>{
  "[]":{                             //请求一个数组
    "page":0,                        //数组条件
    "count":2,
    "Moment":{                       //请求一个名为Moment的对象
      "content$":"%a%"               //对象条件，搜索content中包含a的动态
    },
    "User":{
      "id@":"/Moment/userId",        //User.id = Moment.userId  缺省引用赋值路径，从所处容器的父容器路径开始
      "@column":"id,name,head"       //指定返回字段
    },
    "Comment[]":{                    //请求一个名为Comment的数组，并去除Comment包装
      "count":2,
      "Comment":{
        "momentId@":"[]/Moment/id"   //Comment.momentId = Moment.id  完整引用赋值路径
      }
    }
  }
}
</code></pre></div>
<p dir="auto"><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:2,%22Moment%22:%7B%22content$%22:%22%2525a%2525%22%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22,%22@column%22:%22id,name,head%22%7D,%22Comment%5B%5D%22:%7B%22count%22:2,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">点击这里测试</a></p>
<p dir="auto">返回：</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{
  &quot;[]&quot;:[
    {
      &quot;Moment&quot;:{
        &quot;id&quot;:15,
        &quot;userId&quot;:70793,
        &quot;date&quot;:1486541171000,
        &quot;content&quot;:&quot;APIJSON is a JSON Transmission Structure Protocol…&quot;,
        &quot;praiseUserIdList&quot;:[
          82055,
          82002,
          82001
        ],
        &quot;pictureList&quot;:[
          &quot;http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000&quot;,
          &quot;http://common.cnblogs.com/images/icon_weibo_24.png&quot;
        ]
      },
      &quot;User&quot;:{
        &quot;id&quot;:70793,
        &quot;name&quot;:&quot;Strong&quot;,
        &quot;head&quot;:&quot;http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000&quot;
      },
      &quot;Comment[]&quot;:[
        {
          &quot;id&quot;:176,
          &quot;toId&quot;:166,
          &quot;userId&quot;:38710,
          &quot;momentId&quot;:15,
          &quot;date&quot;:1490444883000,
          &quot;content&quot;:&quot;thank you&quot;
        },
        {
          &quot;id&quot;:1490863469638,
          &quot;toId&quot;:0,
          &quot;userId&quot;:82002,
          &quot;momentId&quot;:15,
          &quot;date&quot;:1490863469000,
          &quot;content&quot;:&quot;Just do it&quot;
        }
      ]
    },
    {
      &quot;Moment&quot;:{
        &quot;id&quot;:58,
        &quot;userId&quot;:90814,
        &quot;date&quot;:1485947671000,
        &quot;content&quot;:&quot;This is a Content...-435&quot;,
        &quot;praiseUserIdList&quot;:[
          38710,
          82003,
          82005,
          93793,
          82006,
          82044,
          82001
        ],
        &quot;pictureList&quot;:[
          &quot;http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg&quot;
        ]
      },
      &quot;User&quot;:{
        &quot;id&quot;:90814,
        &quot;name&quot;:7,
        &quot;head&quot;:&quot;http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000&quot;
      },
      &quot;Comment[]&quot;:[
        {
          &quot;id&quot;:13,
          &quot;toId&quot;:0,
          &quot;userId&quot;:82005,
          &quot;momentId&quot;:58,
          &quot;date&quot;:1485948050000,
          &quot;content&quot;:&quot;This is a Content...-13&quot;
        },
        {
          &quot;id&quot;:77,
          &quot;toId&quot;:13,
          &quot;userId&quot;:93793,
          &quot;momentId&quot;:58,
          &quot;date&quot;:1485948050000,
          &quot;content&quot;:&quot;This is a Content...-77&quot;
        }
      ]
    }
  ],
  &quot;code&quot;:200,
  &quot;msg&quot;:&quot;success&quot;
}"><pre class="notranslate"><code>{
  "[]":[
    {
      "Moment":{
        "id":15,
        "userId":70793,
        "date":1486541171000,
        "content":"APIJSON is a JSON Transmission Structure Protocol…",
        "praiseUserIdList":[
          82055,
          82002,
          82001
        ],
        "pictureList":[
          "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
          "http://common.cnblogs.com/images/icon_weibo_24.png"
        ]
      },
      "User":{
        "id":70793,
        "name":"Strong",
        "head":"http://static.oschina.net/uploads/user/585/1170143_50.jpg?t=1390226446000"
      },
      "Comment[]":[
        {
          "id":176,
          "toId":166,
          "userId":38710,
          "momentId":15,
          "date":1490444883000,
          "content":"thank you"
        },
        {
          "id":1490863469638,
          "toId":0,
          "userId":82002,
          "momentId":15,
          "date":1490863469000,
          "content":"Just do it"
        }
      ]
    },
    {
      "Moment":{
        "id":58,
        "userId":90814,
        "date":1485947671000,
        "content":"This is a Content...-435",
        "praiseUserIdList":[
          38710,
          82003,
          82005,
          93793,
          82006,
          82044,
          82001
        ],
        "pictureList":[
          "http://static.oschina.net/uploads/img/201604/22172507_aMmH.jpg"
        ]
      },
      "User":{
        "id":90814,
        "name":7,
        "head":"http://static.oschina.net/uploads/user/51/102723_50.jpg?t=1449212504000"
      },
      "Comment[]":[
        {
          "id":13,
          "toId":0,
          "userId":82005,
          "momentId":58,
          "date":1485948050000,
          "content":"This is a Content...-13"
        },
        {
          "id":77,
          "toId":13,
          "userId":93793,
          "momentId":58,
          "date":1485948050000,
          "content":"This is a Content...-77"
        }
      ]
    }
  ],
  "code":200,
  "msg":"success"
}
</code></pre></div>
<p align="center" dir="auto">
  [GIF] APIJSON 各种多表关联查询：一对一、一对多、多对一、各种条件 等
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_associate.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_associate.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<p align="center" dir="auto">
  [GIF] APIJSON 各种 JOIN：&lt; LEFT JOIN, &amp; INNER JOIN 等
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_join.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_join.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<p align="center" dir="auto">
  [GIF] APIJSON 各种子查询：@from@ FROM, key@ =, key&gt;@ &gt;, key{}@ IN, key}{@ EXISTS 等 
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_subquery.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_subquery.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<p align="center" dir="auto">
  [GIF] APIJSON 部分功能演示集合，由浅入深、由简单到复杂 
</p> 
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_summary.gif"><img src="https://raw.githubusercontent.com/TommyLemon/StaticResources/master/APIJSON/APIJSON_query_summary.gif" alt="" data-animated-image="" style="max-width: 100%;"></a></p>
<br>
<p dir="auto"><a href="http://apijson.cn/api" rel="nofollow">在线测试</a></p>
<br>
<br>
<h2 dir="auto"></h2><div class="markdown-heading" dir="auto"><h2 id="user-content-2" tabindex="-1" class="heading-element" dir="auto">2.对比传统RESTful方式</h2><a id="user-content-2对比传统restful方式" class="anchor" aria-label="Permalink: 2.对比传统RESTful方式" href="#2对比传统restful方式"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h2 dir="auto"></h2>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.1" tabindex="-1" class="heading-element" dir="auto">2.1 开发流程</h3><a id="user-content-21-开发流程" class="anchor" aria-label="Permalink: 2.1 开发流程" href="#21-开发流程"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>开发流程</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>接口传输</td>
<td>等后端编辑接口，然后更新文档，前端再按照文档编辑请求和解析代码</td>
<td>前端按照自己的需求编辑请求和解析代码。<br>没有接口，更不需要文档！前端再也不用和后端沟通接口或文档问题了！</td>
</tr>
<tr>
<td>兼容旧版</td>
<td>后端增加新接口，用v2表示第2版接口，然后更新文档</td>
<td>什么都不用做！</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
 <br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.2" tabindex="-1" class="heading-element" dir="auto">2.2 前端请求</h3><a id="user-content-22-前端请求" class="anchor" aria-label="Permalink: 2.2 前端请求" href="#22-前端请求"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>前端请求</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>要求</td>
<td>前端按照文档在对应URL后面拼接键值对</td>
<td>前端按照自己的需求在固定URL后拼接JSON</td>
</tr>
<tr>
<td>URL</td>
<td>不同的请求对应不同的URL，基本上有多少个不同的请求就得有多少个接口URL</td>
<td>相同的操作方法(增删改查)都用同一个URL，<br>大部分请求都用7个通用接口URL的其中一个</td>
</tr>
<tr>
<td>键值对</td>
<td>key=value</td>
<td>key:value</td>
</tr>
<tr>
<td>结构</td>
<td>同一个URL内table_name只能有一个 <br><br> base_url/get/table_name?<br>key0=value0&amp;key1=value1...</td>
<td>同一个URL后TableName可传任意数量个 <br><br> base_url/get/<br>{<br>    TableName0:{<br>      key0:value0,<br>      key1:value1,<br>      ...<br>    },<br>    TableName1:{<br>      ...<br>    }<br>    ...<br> }</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
 <br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.3" tabindex="-1" class="heading-element" dir="auto">2.3 后端操作</h3><a id="user-content-23-后端操作" class="anchor" aria-label="Permalink: 2.3 后端操作" href="#23-后端操作"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>后端操作</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>解析和返回</td>
<td>取出键值对，把键值对作为条件用预设的的方式去查询数据库，最后封装JSON并返回给前端</td>
<td>把Parser#parse方法的返回值返回给前端就行</td>
</tr>
<tr>
<td>返回JSON结构的设定方式</td>
<td>由后端设定，前端不能修改</td>
<td>由前端设定，后端不能修改</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
 <br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.4" tabindex="-1" class="heading-element" dir="auto">2.4 前端解析</h3><a id="user-content-24-前端解析" class="anchor" aria-label="Permalink: 2.4 前端解析" href="#24-前端解析"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>前端解析</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>查看方式</td>
<td>查文档或问后端，或等请求成功后看日志</td>
<td>看请求就行，所求即所得，不用查、不用问、不用等。也可以等请求成功后看日志</td>
</tr>
<tr>
<td>解析方法</td>
<td>用JSON解析器来解析JSONObject</td>
<td>可以用JSONResponse解析JSONObject，或使用传统方式</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
 <br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.5" tabindex="-1" class="heading-element" dir="auto">2.5 前端对应不同需求的请求</h3><a id="user-content-25-前端对应不同需求的请求" class="anchor" aria-label="Permalink: 2.5 前端对应不同需求的请求" href="#25-前端对应不同需求的请求"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>前端的请求</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>User</td>
<td>base_url/get/user?id=38710</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "User":{<br>      "id":38710<br>    }<br>}</a></td>
</tr>
<tr>
<td>Moment和对应的User</td>
<td>分两次请求<br>Moment: <br> base_url/get/moment?userId=38710<br><br>User: <br> base_url/get/user?id=38710</td>
<td><a href="http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id%22:38710%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "Moment":{<br>      "userId":38710<br>    }, <br>    "User":{<br>      "id":38710<br>    }<br>}</a></td>
</tr>
<tr>
<td>User列表</td>
<td>base_url/get/user/list?<br>page=0&amp;count=3&amp;sex=0</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22User%22:%7B%22sex%22:0%7D%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "User[]":{<br>      "page":0,<br>       "count":3, <br>      "User":{<br>        "sex":0<br>      }<br>    }<br>}</a></td>
</tr>
<tr>
<td>Moment列表，<br>每个Moment包括<br>1.发布者User<br>2.前3条Comment</td>
<td>Moment里必须有<br>1.User对象<br>2.Comment数组<br><br> base_url/get/moment/list?<br>page=0&amp;count=3&amp;commentCount=3</td>
<td><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "[]":{<br>      "page":0, <br>      "count":3, <br>      "Moment":{}, <br>      "User":{<br>        "id@":"/Moment/userId"<br>      },<br>      "Comment[]":{<br>        "count":3,<br>        "Comment":{<br>          "momentId@":"[]/Moment/id"<br>        }<br>      }<br>    }<br>}</a></td>
</tr>
<tr>
<td>User发布的Moment列表，<br> 每个Moment包括<br> 1.发布者User<br> 2.前3条Comment</td>
<td>1.Moment里必须有User对象和Comment数组<br> 2.字段名必须查接口文档，例如评论数量字段名可能是<br> commentCount,comment_count或者简写cmt_count等各种奇葩写法... <br><br> base_url/get/moment/list?<br>page=0&amp;count=3<br>&amp;commentCount=3&amp;userId=38710</td>
<td>有以下几种方式:<br><br> ① 把以上请求里的<br>"Moment":{}, "User":{"id@":"/Moment/userId"}<br>改为<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">"Moment":{"userId":38710}, "User":{"id":38710}</a> <br><br> ② 或把User放在上面的最外层省去重复的User<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710%7D,%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "User":{<br>      "id":38710<br>    },<br>    "[]":{<br>      "page":0,<br>      "count":3, <br>      "Moment":{<br>        "userId":38710<br>      }, <br>      "Comment[]":{<br>        "count":3,<br>        "Comment":{<br>          "momentId@":"[]/Moment/id"<br>        }<br>      }<br>    }<br>}</a><br><br> ③ 如果User之前已经获取到了，还可以不传User来节省请求和返回数据的流量并提升速度<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%22userId%22:38710%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">base_url/get/<br>{<br>    "[]":{<br>      "page":0,<br>      "count":3, <br>      "Moment":{<br>        "userId":38710<br>      },<br>      "Comment[]":{<br>        "count":3,<br>        "Comment":{<br>          "momentId@":"[]/Moment/id"<br>        }<br>      }<br>    }<br>}</a></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
 <br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-2.6" tabindex="-1" class="heading-element" dir="auto">2.6 后端对应不同请求的返回结果</h3><a id="user-content-26-后端对应不同请求的返回结果" class="anchor" aria-label="Permalink: 2.6 后端对应不同请求的返回结果" href="#26-后端对应不同请求的返回结果"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>后端的返回结果</th>
<th>传统方式</th>
<th>APIJSON</th>
</tr>
</thead>
<tbody>
<tr>
<td>User</td>
<td>{<br>    "data":{<br>      "id":38710,<br>      "name":"xxx",<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>}</td>
<td>{<br>    "User":{<br>      "id":38710,<br>      "name":"xxx",<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
<tr>
<td>Moment和对应的User</td>
<td>分别返回两次请求的结果，获取到Moment后取出userId作为User的id条件去查询User <br><br> Moment: <br> {<br>    "data":{<br>      "id":235,<br>      "content":"xxx",<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>} <br><br> User: <br> {<br>    "data":{<br>      "id":38710,<br>      "name":"xxx",<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>}</td>
<td>一次性返回，没有传统方式导致的 长时间等待结果、两次结果间关联、线程多次切换 等问题 <br><br> {<br>    "Moment":{<br>      "id":235,<br>      "content":"xxx",<br>      ...<br>    },<br>    "User":{<br>      "id":38710,<br>      "name":"xxx",<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
<tr>
<td>User列表</td>
<td>{<br>    "data":[<br>      {<br>        "id":38710,<br>        "name":"xxx",<br>        ...<br>      },<br>      {<br>        "id":82001,<br>        ...<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
<td>{<br>    "User[]":[<br>      {<br>        "id":38710,<br>        "name":"xxx",<br>        ...<br>      },<br>      {<br>        "id":82001,<br>        ...<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
<tr>
<td>Moment列表，每个Moment包括发布者User和前3条Comment</td>
<td>Moment里必须有<br>1.User对象<br>2.Comment数组 <br><br> {<br>    "data":[<br>      {<br>        "id":235,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          ...<br>        },<br>        "Comment":[<br>          ...<br>        ]<br>      },<br>      {<br>        "id":301,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          ...<br>        },<br>        ...<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
<td>1.高灵活，可任意组合<br>2.低耦合，逻辑很清晰<br><br>{<br>    "[]":[<br>      {<br>        "Moment":{<br>          "id":235,<br>          "content":"xxx",<br>          ...<br>        },<br>        "User":{<br>          ...<br>        },<br>        "Comment[]":[<br>          ...<br>        ]<br>      },<br>      {<br>        "Moment":{<br>          "id":301,<br>          "content":"xxx",<br>          ...<br>        },<br>        "User":{<br>          ...<br>        },<br>        ...<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
<tr>
<td>User发布的Moment列表，每个Moment包括发布者User和前3条Comment</td>
<td>1.大量重复User，浪费流量和服务器性能<br>2.优化很繁琐，需要后端扩展接口、写好文档，前端/前端再配合优化<br><br>{<br>    "data":[<br>      {<br>        "id":235,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          "id":38710,<br>          "name":"Tommy"<br>          ...<br>        },<br>        "Comment":[<br>          ...<br>        ]<br>        ...<br>      },<br>      {<br>        "id":470,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          "id":38710,<br>          "name":"Tommy"<br>          ...<br>        },<br>        "Comment":[<br>          ...<br>        ]<br>        ...<br>      },<br>      {<br>        "id":511,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          "id":38710,<br>          "name":"Tommy"<br>          ...<br>        },<br>        "Comment":[<br>          ...<br>        ]<br>        ...<br>      },<br>      {<br>        "id":595,<br>        "content":"xxx",<br>        ...,<br>        "User":{<br>          "id":38710,<br>          "name":"Tommy"<br>          ...<br>        },<br>        "Comment":[<br>          ...<br>        ]<br>        ...<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
<td>以上不同请求方式的结果:<br><br> ① 常规请求 <br> {<br>    "[]":[<br>      {<br>        "Moment":{<br>          "id":235,<br>          "content":"xxx",<br>          ...<br>        },<br>        "User":{<br>          "id":38710,<br>          "name":"Tommy"<br>          ...<br>        },<br>        "Comment[]":[<br>          ...<br>        ]<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}<br><br> ② 省去重复的User <br> {<br>    "User":{<br>      "id":38710,<br>      "name":"Tommy",<br>      ...<br>    },<br>    "[]":[<br>      {<br>        "Moment":{<br>          "id":235,<br>          "content":"xxx",<br>          ...<br>        },<br>        "Comment[]":[<br>          ...<br>        ]<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}<br><br> ③ 不查询已获取到的User <br> {<br>    "[]":[<br>      {<br>        "Moment":{<br>          "id":235,<br>          "content":"xxx",<br>          ...<br>        },<br>        "Comment[]":[<br>          ...<br>        ]<br>      },<br>      ...<br>    ],<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">1.base_url指基地址，一般是顶级域名，其它分支url都是在base_url后扩展。如base_url:<a href="http://apijson.cn:8080/" rel="nofollow">http://apijson.cn:8080/</a> ，对应的GET分支url:<a href="http://apijson.cn:8080/get/" rel="nofollow">http://apijson.cn:8080/get/</a> 。下同。<br>
2.请求中的key或value任意一个为null值时，这个 key:value键值对 被视为无效。下同。<br>
3.请求中的 / 需要转义。JSONRequest.java已经用URLEncoder.encode转义，不需要再写；但如果是浏览器或Postman等直接输入url/request，需要把request中的所有 / 都改成 %252F 。下同。<br>
4.code，指返回结果中的状态码，200表示成功，其它都是错误码，值全部都是HTTP标准状态码。下同。<br>
5.msg，指返回结果中的状态信息，对成功结果或错误原因的详细说明。下同。<br>
6.code和msg总是在返回结果的同一层级成对出现。对所有请求的返回结果都会在最外层有一对总结式code和msg。下同。<br>
7.id等字段对应的值仅供说明，不一定是数据库里存在的，请求里用的是真实存在的值。下同。</p>
<br>
<br>
<h2 dir="auto"></h2><div class="markdown-heading" dir="auto"><h2 id="user-content-3" tabindex="-1" class="heading-element" dir="auto">3.设计规范</h2><a id="user-content-3设计规范-1" class="anchor" aria-label="Permalink: 3.设计规范" href="#3设计规范-1"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h2 dir="auto"></h2>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-3.1" tabindex="-1" class="heading-element" dir="auto">3.1 操作方法</h3><a id="user-content-31-操作方法" class="anchor" aria-label="Permalink: 3.1 操作方法" href="#31-操作方法"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th> 方法及说明</th>
<th>URL</th>
<th>Request</th>
<th>Response</th>
</tr>
</thead>
<tbody>
<tr>
<td>GET: <br> 普通获取数据，<br> 可用浏览器调试</td>
<td>base_url/get/</td>
<td>{<br>    TableName:{<br>      … <br>    }<br>} <br> {…}内为限制条件<br><br> 例如获取一个 id = 235 的 Moment：<br> <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fget&amp;type=JSON&amp;json=%7B%22Moment%22%3A%7B%22id%22%3A235%7D%7D" rel="nofollow">{<br>    "Moment":{<br>      "id":235<br>    }<br>}</a> <br> 后端校验通过后自动解析为 SQL 并执行：<br><code>SELECT * FROM Moment WHERE id=235 LIMIT 1</code></td>
<td>{<br>    TableName:{<br>      ...<br>    },<br>    "code":200,<br>    "msg":"success"<br>}<br>例如<br>{<br>    "Moment":{<br>      "id":235,<br>      "userId":38710,<br>      "content":"APIJSON,let interfaces and documents go to hell !"<br>    },<br>    "code":200,<br>    "msg":"success"<br> }</td>
</tr>
<tr>
<td>HEAD: <br> 普通获取数量，<br> 可用浏览器调试</td>
<td>base_url/head/</td>
<td>{<br>    TableName:{<br>      …<br>    }<br> } <br> {…}内为限制条件 <br><br> 例如获取一个 id = 38710 的 User 所发布的 Moment 总数：<br> <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fhead&amp;type=JSON&amp;json=%7B%22Moment%22%3A%7B%22userId%22%3A38710%7D%7D" rel="nofollow">{<br>    "Moment":{<br>      "userId":38710<br>    }<br>}</a> <br> 后端校验通过后自动解析为 SQL 并执行：<br><code>SELECT count(*) FROM Moment WHERE userId=38710 LIMIT 1</code></td>
<td>{<br>    TableName:{<br>      "code":200,<br>      "msg":"success",<br>      "count":10<br>    },<br>    "code":200,<br>    "msg":"success"<br>} <br> 例如<br>{<br>    "Moment":{<br>      "code":200,<br>      "msg":"success",<br>      "count":10<br>    },<br>    "code":200,<br>     "msg":"success"<br>}</td>
</tr>
<tr>
<td>GETS: <br> 安全/私密获取数据，<br> 用于获取钱包等<br>对安全性要求高的数据</td>
<td>base_url/gets/</td>
<td>最外层加一个 "tag":tag，例如 <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets&amp;type=JSON&amp;json=%7B%22tag%22%3A%22Privacy%22,%22Privacy%22%3A%7B%22id%22%3A82001%7D%7D" rel="nofollow">"tag":"Privacy"</a>，其它同GET</td>
<td>同GET</td>
</tr>
<tr>
<td>HEADS: <br> 安全/私密获取数量，<br> 用于获取银行卡数量等<br>对安全性要求高的数据总数</td>
<td>base_url/heads/</td>
<td>最外层加一个 "tag":tag，例如 <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fheads&amp;type=JSON&amp;json=%7B%22tag%22%3A%22Verify%22,%22Verify%22%3A%7B%22phone%22%3A13000082001%7D%7D" rel="nofollow">"tag":"Verify"</a>，其它同HEAD</td>
<td>同HEAD</td>
</tr>
<tr>
<td>POST: <br> 新增数据</td>
<td>base_url/post/</td>
<td>单个： <br> {<br>    TableName:{<br>      …<br>    },<br>    "tag":tag<br>} <br> {…}中id由后端生成，不能传 <br><br>例如当前登录用户 38710 发布一个新 Comment：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost&amp;type=JSON&amp;json=%7B%22Comment%22:%7B%22momentId%22:12,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%22tag%22:%22Comment%22%7D" rel="nofollow">{<br>    "Comment":{<br>      "momentId":12,<br>      "content":"APIJSON,let interfaces and documents go to hell !" <br>    },<br>    "tag":"Comment"<br>}</a> <br> 后端校验通过后自动解析为 SQL 并执行：<br><code>INSERT INTO Comment(userId,momentId,content) VALUES(38710,12,'APIJSON,let interfaces and documents go to hell !')</code> <br>  <br> 批量： <br> {<br>    TableName[]:[{<br>        …<br>      }, {<br>        …<br>      }<br>      …<br>    ],<br>    "tag":tag<br>} <br> {…}中id由后端生成，不能传 <br><br>例如当前登录用户 82001 发布 2 个 Comment：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fpost&amp;type=JSON&amp;json=%7B%22Comment%5B%5D%22:%5B%7B%22momentId%22:12,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%7B%22momentId%22:15,%22content%22:%22APIJSON%20is%20a%20JSON%20transmision%20protocol.%22%7D%5D,%22tag%22:%22Comment:%5B%5D%22%7D" rel="nofollow">{<br>    "Comment[]":[{<br>      "momentId":12,<br>      "content":"APIJSON,let interfaces and documents go to hell !"<br>      }, {<br>      "momentId":15,<br>      "content":"APIJSON is a JSON transmision protocol."<br>    }],<br>    "tag":"Comment:[]"<br>}</a><br>  后端校验通过后自动解析为 SQL 并执行：<br><code>INSERT INTO Comment(userId,momentId,content) VALUES(82001,12,'APIJSON,let interfaces and documents go to hell !');</code><br><br><code>INSERT INTO Comment(userId,momentId,content) VALUES(82001,15,'APIJSON is a JSON transmision protocol.');</code></td>
<td>单个： <br> {<br>    TableName:{<br>      "code":200,<br>      "msg":"success",<br>      "id":38710<br>    },<br>    "code":200,<br>    "msg":"success"<br>}<br>例如<br>{<br>    "Comment":{<br>      "code":200,<br>      "msg":"success",<br>      "id":120<br>    },<br>    "code":200,<br>    "msg":"success"<br>} <br> <br> 批量： <br> {<br>    TableName:{<br>      "code":200,<br>      "msg":"success",<br>      "count":5,<br>      "id[]":[1, 2, 3, 4, 5]<br>    },<br>    "code":200,<br>    "msg":"success"<br>}<br>例如<br>{<br>    "Comment":{<br>      "code":200,<br>      "msg":"success",<br>      "count":2,<br>      "id[]":[1, 2]<br>    },<br>    "code":200,<br>    "msg":"success"<br>}</td>
</tr>
<tr>
<td>PUT: <br> 修改数据，<br> 只修改所传的字段</td>
<td>base_url/put/</td>
<td>{<br>    TableName:{<br>      "id":id,<br>      …<br>    },<br>    "tag":tag<br>} <br> {…} 中 id 或 id{} 至少传一个 <br><br>例如当前登录用户 82001 修改 id = 235 的 Moment 的 content：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput&amp;type=JSON&amp;json=%7B%22Moment%22:%7B%22id%22:235,%22content%22:%22APIJSON,let%20interfaces%20and%20documents%20go%20to%20hell%20!%22%7D,%22tag%22:%22Moment%22%7D" rel="nofollow">{<br>    "Moment":{<br>      "id":235,<br>      "content":"APIJSON,let interfaces and documents go to hell !"<br>    },<br>    "tag":"Moment"<br>}</a> <br> 后端校验通过后自动解析为 SQL 并执行：<br><code>UPDATE Moment SET content='APIJSON,let interfaces and documents go to hell !' WHERE id=235 AND userId=82001 LIMIT 1</code> <br><br> 批量除了 id{}:[] 也可类似批量 POST，只是每个 {...} 里面都必须有 id。<br>"tag":"Comment[]" 对应对象 "Comment":{"id{}":[1,2,3]}，表示指定记录全部统一设置；<br>"tag":"Comment:[]" 多了冒号，对应数组 "Comment[]":[{"id":1},{"id":2},{"id":3}]，表示每项单独设置</td>
<td>同POST</td>
</tr>
<tr>
<td>DELETE: <br> 删除数据</td>
<td>base_url/delete/</td>
<td>{<br>    TableName:{<br>      "id":id<br>    },<br>    "tag":tag<br>} <br> {…} 中 id 或 id{} 至少传一个，一般只传 id 或 id{} <br><br>例如当前登录用户 82001 批量删除 id = 100,110,120 的 Comment：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fdelete&amp;type=JSON&amp;json=%7B%22Comment%22:%7B%22id%7B%7D%22:%5B100,110,120%5D%7D,%22tag%22:%22Comment%5B%5D%22%7D" rel="nofollow">{<br>    "Comment":{<br>      "id{}":[100,110,120]<br>    },<br>    "tag":"Comment[]"<br>}</a> <br> 后端校验通过后自动解析为 SQL 并执行：<br><code>DELETE FROM Comment WHERE id IN(100,110,120) AND userId=82001 LIMIT 3</code></td>
<td>{<br>    TableName:{<br>      "code":200,<br>      "msg":"success",<br>      "id[]":[100,110,120]<br>      "count":3<br>    },<br>    "code":200,<br>    "msg":"success"<br>}<br>例如<br>{<br>   "Comment":{<br>      "code":200,<br>      "msg":"success",<br>      "id[]":[100,110,120],<br>      "count":3<br>   },<br>   "code":200,<br>   "msg":"success"<br>}</td>
</tr>
<tr>
<td>以上接口的简单形式: <br> base_url/{method}/{tag}</td>
<td>GET: 普通获取数据 <br> base_url/get/{tag} <br><br> HEAD: 普通获取数量 <br> base_url/head/{tag} <br><br> GETS: 安全/私密获取数据 <br>  base_url/gets/{tag} <br><br> HEADS: 安全/私密获取数量 <br> base_url/heads/{tag} <br><br> POST: 新增数据 <br>  base_url/post/{tag} <br><br> PUT: 修改数据  base_url/put/{tag} <br><br> DELETE: 删除数据 <br> base_url/delete/{tag}</td>
<td>例如安全/私密获取一个 id = 82001 的 Privacy：<br> <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets%2FPrivacy&amp;type=JSON&amp;json=%7B%22id%22%3A82001%7D" rel="nofollow">base_url/gets/Privacy/ <br> {"id":82001}</a> <br> 相当于 <br> <a href="http://apijson.cn/api/?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets&amp;type=JSON&amp;json=%7B%22tag%22%3A%22Privacy%22,%22Privacy%22%3A%7B%22id%22%3A82001%7D%7D" rel="nofollow">base_url/gets/ <br>{"tag":"Privacy", "Privacy":{"id":82001}}</a> <br> <br> 例如批量修改 id = 114, 124 的 Comment 的 content：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput%2FComment%5B%5D&amp;type=JSON&amp;json=%7B%22id%7B%7D%22%3A%5B114,124%5D,%22content%22%3A%22test%20multi%20put%22%7D" rel="nofollow">base_url/put/Comemnt[]/ <br> {<br>    "id{}":[114,124],<br>    "content":"test multi put"<br>}</a> <br> 相当于 <br> <a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fput&amp;type=JSON&amp;json=%7B%22tag%22%3A%22Comment%5B%5D%22,%22Comment%22%3A%7B%22id%7B%7D%22%3A%5B114,124%5D,%22content%22%3A%22test%20multi%20put%22%7D%7D" rel="nofollow">base_url/put/ <br> {<br>    "tag":"Comment[]", <br>    "Comment":{<br>      "id{}":[114,124],<br>      "content":"test multi put"<br>    }<br>}</a></td>
<td>同以上对应的方法</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">1.TableName指要查询的数据库表Table的名称字符串。第一个字符为大写字母，剩下的字符要符合英语字母、数字、下划线中的任何一种。对应的值的类型为JSONObject，结构是 {...}，里面放的是Table的字段(列名)。下同。<br>
2."tag":tag 后面的tag是非GET、HEAD请求中匹配请求的JSON结构的标识，一般是要查询的Table的名称，由后端Request表中指定。下同。<br>
3.GET、HEAD请求是开放请求，可任意组合任意嵌套。其它请求为受限制的安全/私密请求，对应的 方法（method）, 标识（tag）, 版本（version）, 结构（structure） 都必须和 后端Request表中所指定的 一一对应，否则请求将不被通过。version 不传、为 null 或 &lt;=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本。下同。<br>
4.GETS与GET、HEADS与HEAD分别为同一类型的操作方法，请求稍有不同但返回结果相同。下同。<br>
5.在HTTP通信中，自动化接口(get,gets,head,heads,post,put,delete) 全用HTTP POST请求。下同。<br>
6.所有JSONObject都视为容器(或者文件夹)，结构为 {...} ，里面可以放普通对象或子容器。下同。<br>
7.每个对象都有一个唯一的路径(或者叫地址)，假设对象名为refKey，则用 key0/key1/.../refKey 表示。下同。</p>
<br>
<h3 dir="auto"></h3><div class="markdown-heading" dir="auto"><h3 id="user-content-3.2" tabindex="-1" class="heading-element" dir="auto">3.2 功能符</h3><a id="user-content-32-功能符" class="anchor" aria-label="Permalink: 3.2 功能符" href="#32-功能符"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div><h3 dir="auto"></h3>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>功能</th>
<th>键值对格式</th>
<th>使用示例</th>
</tr>
</thead>
<tbody>
<tr>
<td>查询数组</td>
<td>"key[]":{}，后面是 JSONObject，key 可省略。当 key 和里面的 Table 名相同时，Table 会被提取出来，即 {Table:{Content}} 会被转化为 {Content}</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%7D%7D%7D" rel="nofollow">{"User[]":{"User":{}}}</a>，查询一个 User 数组。这里 key 和 Table 名都是 User，User 会被提取出来，即 {"User":{"id", ...}} 会被转化为 {"id", ...}，如果要进一步提取 User 中的 id，可以把 User[] 改为 User-id[]，其中 - 用来分隔路径中涉及的 key</td>
</tr>
<tr>
<td>匹配选项范围</td>
<td>"key{}":[]，后面是 JSONArray，作为 key 可取的值的选项</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22id%7B%7D%22:%5B38710,82001,70793%5D%7D%7D%7D" rel="nofollow">"id{}":[38710,82001,70793]</a>，对应 SQL 是<code>id IN(38710,82001,70793)</code>，查询 id 符合 38710,82001,70793 中任意一个的一个 User 数组</td>
</tr>
<tr>
<td>匹配条件范围</td>
<td>"key{}":"条件0,条件1..."，条件为 SQL 表达式字符串，可进行数字比较运算等</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22id%7B%7D%22:%22%3C=80000,%3E90000%22%7D%7D%7D" rel="nofollow">"id{}":"&lt;=80000,&gt;90000"</a>，对应 SQL 是<code>id&lt;=80000 OR id&gt;90000</code>，查询 id 符合 id&lt;=80000 | id&gt;90000 的一个 User 数组</td>
</tr>
<tr>
<td>包含选项范围</td>
<td>"key&lt;&gt;":value  =&gt;  "key&lt;&gt;":[value]，key 对应值的类型必须为 JSONArray，value 值类型只能为 Boolean, Number, String 中的一种</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22contactIdList%3C%3E%22:38710%7D%7D%7D" rel="nofollow">"contactIdList&lt;&gt;":38710</a>，对应SQL是<code>json_contains(contactIdList,38710)</code>，查询 contactIdList 包含 38710 的一个 User 数组</td>
</tr>
<tr>
<td>判断是否存在</td>
<td>"key}{@":{<br>    "from":"Table",<br>    "Table":{ ... }<br>}<br>其中：<br>}{ 表示 EXISTS；<br> key 用来标识是哪个判断；<br> @ 后面是 子查询 对象，具体见下方 子查询 的说明。</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%7D%7B@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22momentId%22:15%7D%7D%7D%7D" rel="nofollow">"id}{@":{<br>    "from":"Comment",<br>    "Comment":{<br>        "momentId":15 <br>    }<br>}</a><br> WHERE EXISTS(SELECT * FROM Comment WHERE momentId=15)</td>
</tr>
<tr>
<td>远程调用函数</td>
<td>"key()":"函数表达式"，函数表达式为 function(key0,key1...)，会调用后端对应的函数 function(JSONObject request, String key0, String key1...)，实现 参数校验、数值计算、数据同步、消息推送、字段拼接、结构变换 等特定的业务逻辑处理，<br>可使用 - 和 + 表示优先级，解析 key-() &gt; 解析当前对象 &gt; 解析 key() &gt; 解析子对象 &gt; 解析 key+()</td>
<td><a href="http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22id%22:301,%22isPraised()%22:%22isContain(praiseUserIdList,userId)%22%7D%7D" rel="nofollow">"isPraised()":"isContain(praiseUserIdList,userId)"</a>，会调用远程函数 <a href="https://github.com/APIJSON/apijson-framework/blob/master/src/main/java/apijson/framework/APIJSONFunctionParser.java#L361-L374">boolean isContain(JSONObject request, String array, String value)</a> ，然后变为 "isPraised":true 这种（假设点赞用户 id 列表包含了 userId，即这个 User 点了赞）</td>
</tr>
<tr>
<td>存储过程</td>
<td>"@key()":"SQL函数表达式"，函数表达式为 <br>  function(key0,key1...) <br> 会调用后端数据库对应的存储过程 SQL 函数 <br> function(String key0, String key1...) <br> 除了参数会提前赋值，其它和 远程函数 一致</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22@limit%22:10,%22@offset%22:0,%22@procedure()%22:%22getCommentByUserId(id,@limit,@offset)%22%7D%7D" rel="nofollow">"@limit":10, <br> "@offset":0, <br> "@procedure()":"getCommentByUserId(id,@limit,@offset)"</a> <br> 会转为 <br> <code>getCommentByUserId(38710,10,0)</code> <br> 来调用存储过程 SQL 函数 <br> <code>getCommentByUserId(IN id bigint, IN limit int, IN offset int)</code> <br> 然后变为 <br>"procedure":{<br>    "count":-1, <br>    "update":false, <br>    "list":[] <br> } <br> 其中 count 是指写操作影响记录行数，-1 表示不是写操作；update 是指是否为写操作（增删改）；list 为返回结果集</td>
</tr>
<tr>
<td>引用赋值</td>
<td>"key@":"key0/key1/.../refKey"，引用路径为用 / 分隔的字符串。以 / 开头的是缺省引用路径，从声明 key 所处容器的父容器路径开始；其它是完整引用路径，从最外层开始。<br> 被引用的 refKey 必须在声明 key 的上面。如果对 refKey 的容器指定了返回字段，则被引用的 refKey 必须写在 @column 对应的值内，例如 "@column":"refKey,key1,..."</td>
<td><a href="http://apijson.cn:8080/get/%7B%22Moment%22:%7B%22userId%22:38710%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D%7D" rel="nofollow">"Moment":{<br>    "userId":38710<br>},<br>"User":{<br>    "id@":"/Moment/userId"<br>}</a><br> User 内的 id 引用了与 User 同级的 Moment 内的 userId，<br>即 User.id = Moment.userId，请求完成后<br> "id@":"/Moment/userId" 会变成 "id":38710</td>
</tr>
<tr>
<td>子查询</td>
<td>"key@":{<br>    "range":"ALL", <br>    "from":"Table", // 可省略，默认为首个表对象 key 名<br>    "Table":{ ... }<br>}<br>其中：<br>range 可为 ALL,ANY；<br>from 为目标表 Table 的名称；<br>@ 后面的对象类似数组对象，可使用 count 和 join 等功能。</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22@column%22:%22min(userId)%22%7D%7D%7D%7D" rel="nofollow">"id@":{<br>    "from":"Comment", // 可省略<br>    "Comment":{<br>        "@column":"min(userId)" <br>    }<br>}</a><br> WHERE id=(SELECT min(userId) FROM Comment)</td>
</tr>
<tr>
<td>模糊搜索</td>
<td><code>"key$":"SQL搜索表达式"</code> =&gt; <code>"key$":["SQL搜索表达式"]</code>，任意 SQL 搜索表达式字符串，如 %key%(包含 key), key%(以 key 开始), %k%e%y%(包含字母 k,e,y) 等，% 表示任意字符</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22name$%22:%22%2525m%2525%22%7D%7D%7D" rel="nofollow">"name$":"%m%"</a>，对应 SQL 是<code>name LIKE '%m%'</code>，查询 name 包含 "m" 的一个 User 数组</td>
</tr>
<tr>
<td>正则匹配</td>
<td>"key~":"正则表达式" =&gt; "key~":["正则表达式"]，任意正则表达式字符串，如 ^[0-9]+$ ，*~ 忽略大小写，可用于高级搜索</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22name~%22:%22%5E%5B0-9%5D%252B$%22%7D%7D%7D" rel="nofollow">"name~":"^[0-9]+$"</a>，对应 SQL 是<code>name REGEXP '^[0-9]+$'</code>，查询 name 中字符全为数字的一个 User 数组</td>
</tr>
<tr>
<td>连续范围</td>
<td>"key%":"start,end" =&gt; "key%":["start,end"]，其中 start 和 end 都只能为 Number, String 中的一种，如 "2017-01-01,2019-01-01" ，["1,90000", "82001,100000"] ，可用于连续范围内的筛选</td>
<td><a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:3,%22User%22:%7B%22date%2525%22:%222017-10-01,2018-10-01%22%7D%7D%7D" rel="nofollow">"date%":"2017-10-01,2018-10-01"</a>，对应SQL是<code>date BETWEEN '2017-10-01' AND '2018-10-01'</code>，查询在2017-10-01和2018-10-01期间注册的用户的一个User数组</td>
</tr>
<tr>
<td>新建别名</td>
<td>"name:alias"，name 映射为 alias，用 alias 替代 name。可用于 column,Table,SQL 函数 等。只用于 GET 类型、HEAD 类型的请求</td>
<td><a href="http://apijson.cn:8080/get/%7B%22Comment%22:%7B%22@column%22:%22id,toId:parentId%22,%22id%22:51%7D%7D" rel="nofollow">"@column":"toId:parentId"</a>，对应 SQL 是<code>toId AS parentId</code>，将查询的字段 toId 变为 parentId 返回</td>
</tr>
<tr>
<td>增加 或 扩展</td>
<td>"key+":Object，Object的类型由key指定，且类型为 Number,String,JSONArray 中的一种。如 82001,"apijson",["url0","url1"] 等。只用于 PUT 请求</td>
<td>"praiseUserIdList+":[82001]，对应 SQL 是<code>json_insert(praiseUserIdList,82001)</code>，添加一个点赞用户 id，即这个用户点了赞</td>
</tr>
<tr>
<td>减少 或 去除</td>
<td>"key-":Object，与"key+"相反</td>
<td>"balance-":100.00，对应SQL是<code>balance = balance - 100.00</code>，余额减少100.00，即花费了100元</td>
</tr>
<tr>
<td>比较运算</td>
<td>&gt;, &lt;, &gt;=, &lt;= 比较运算符，用于 <br>① 提供 "id{}":"&lt;=90000" 这种条件范围的简化写法 <br><br>② 实现子查询相关比较运算<br><br>不支持 "key=":Object 和 "key!=":Object 这两种写法，直接用更简单的 "key":Object 和 "key!":Object 替代。</td>
<td>① <a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22User%22:%7B%22id%3C=%22:90000%7D%7D%7D" rel="nofollow">"id&lt;=":90000</a>，对应 SQL 是<code>id&lt;=90000</code>，查询符合id&lt;=90000的一个User数组<br><br> ② <a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%3E@%22:%7B%22from%22:%22Comment%22,%22Comment%22:%7B%22@column%22:%22min(userId)%22%7D%7D%7D%7D" rel="nofollow">"id&gt;@":{<br>    "from":"Comment",<br>    "Comment":{<br>        "@column":"min(userId)" <br>    }<br>}</a><br> WHERE id&gt;(SELECT min(userId) FROM Comment)</td>
</tr>
<tr>
<td>逻辑运算</td>
<td>&amp;, |, ! 逻辑运算符，对应数据库 SQL 中的 AND, OR, NOT。 <br>横或纵与：同一键值对的值内条件默认 | 或连接，可以在 key 后加逻辑运算符来具体指定；不同键值对的条件默认 &amp; 与连接，可以用下面说明的对象关键词 @combine 来具体指定。 <br><br>① &amp; 可用于 "key&amp;{}":"条件"等<br><br>② | 可用于 "key|{}":"条件", "key|{}":[]等，一般可省略<br><br>③ ! 可单独使用，如 "key!":Object，也可像 &amp;,| 一样配合其他功能符使用 <br> "key!":null 无效，null 值会导致整个键值对被忽略解析，可以用 "key{}":"!=null" 替代，<br>"key":null 同理，用 "key{}":"=null" 替代。</td>
<td>① <a href="http://apijson.cn:8080/head/%7B%22User%22:%7B%22id&amp;%7B%7D%22:%22%3E80000,%3C=90000%22%7D%7D" rel="nofollow">"id&amp;{}":"&gt;80000,&lt;=90000"</a>，对应SQL是<code>id&gt;80000 AND id&lt;=90000</code>，即id满足id&gt;80000 &amp; id&lt;=90000<br><br> ② <a href="http://apijson.cn:8080/head/%7B%22User%22:%7B%22id%7C%7B%7D%22:%22%3E90000,%3C=80000%22%7D%7D" rel="nofollow">"id|{}":"&gt;90000,&lt;=80000"</a>，同 "id{}":"&gt;90000,&lt;=80000"，对应 SQL 是<code>id&gt;90000 OR id&lt;=80000</code>，即 id 满足 id&gt;90000 | id&lt;=80000<br><br> ③ <a href="http://apijson.cn:8080/head/%7B%22User%22:%7B%22id!%7B%7D%22:%5B82001,38710%5D%7D%7D" rel="nofollow">"id!{}":[82001,38710]</a>，对应 SQL 是<code>id NOT IN(82001,38710)</code>，即 id 满足 ! (id=82001 | id=38710)，可过滤黑名单的消息</td>
</tr>
<tr>
<td>数组关键词，可自定义</td>
<td>"key":Object，key为 "[]":{} 中 {} 内的关键词，Object 的类型由 key 指定<br><br>① "count":5，查询数量，0 表示最大值，默认值为 10，默认最大值为 100 <br><br>② "page":1，查询页码，从 0 开始，默认值为 0，默认最大值为 100，一般和 count 一起用<br><br>③ "query":2，查询内容<br>0-对象，1-总数和分页详情，2-数据、总数和分页详情<br>总数关键词为 total，分页详情关键词为 info，<br> 它们都和 query 同级，通过引用赋值得到自定义 key:value 键值对，不传则返回默认键值对，例如  <br>"total@":"/[]/total", "info@":"/[]/info" <br>这里query及total仅为GET类型的请求提供方便，<br> 一般可直接用HEAD类型的请求获取总数<br><br>④ "join":"&amp;/Table0,&lt;/Table1/key1@" 或 <br>"join":{<br>    "&amp;/Table0":{},  // 支持 ON 多个字段关联,<br>    "&lt;/Table1/key1@":{  // ON 只允许指定的 key1 关联<br>      "key0":value0, // 其它ON条件 <br>      "key2":value2,<br>      ... <br>      "@combine":"...", // 其它ON条件的组合方式 <br>      "@column":"...", // 外层 SELECT <br>      "@group":"...", // 外层 GROUP BY <br>      "@having":"..." // 外层 HAVING <br>    }<br>}<br>多表连接方式：<br>  "@" - APP JOIN <br> "&lt;" - LEFT JOIN <br> "&gt;" - RIGHT JOIN <br> "&amp;" - INNER JOIN <br> "|" - FULL JOIN <br>  "!" - OUTER JOIN <br>  "*" - CROSS JOIN <br>  "^" - SIDE JOIN <br>  "(" - ANTI JOIN <br>  ")" - FOREIGN JOIN <br>其中 @ APP JOIN 为应用层连表，会从已查出的主表里取得所有副表 key@ 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...]，然后把原来副表 count 次查询 key=$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能；<br> 其它 JOIN 都是 SQL JOIN，具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应 <br><code>"join":"&lt;/ViceTable/key@",</code><br><code>"MainTable":{},</code><br><code>"ViceTable":{"key@":"/MainTable/refKey"}</code><br>会对应生成 <br><code>MainTable LEFT JOIN ViceTable</code> <br><code>ON ViceTable.key=MainTable.refKey</code> AND 其它ON条件 <br> 除了 = 等价关联，也支持 ! 不等关联、&gt; &lt; &gt;= &lt;= 等比较关联和 $ ~ {} &lt;&gt; 等其它复杂关联方式 <br><br>⑤ "otherKey":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值</td>
<td>① 查询User数组，最多5个：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:5,%22User%22:%7B%7D%7D%7D" rel="nofollow">"count":5</a><br>对应 SQL 是<code>LIMIT 5</code> <br><br> ② 查询第3页的User数组，每页5个：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:5,%22page%22:3,%22User%22:%7B%7D%7D%7D" rel="nofollow">"count":5,<br>"page":3</a><br>对应 SQL 是<code>LIMIT 5 OFFSET 15</code> <br><br> ③ 查询User数组和对应的User总数：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22query%22:2,%22count%22:5,%22User%22:%7B%7D%7D,%22total@%22:%22%252F%5B%5D%252Ftotal%22,%22info@%22:%22%252F%5B%5D%252Finfo%22%7D" rel="nofollow">"[]":{<br>    "query":2,<br>    "User":{}<br>},<br>"total@":"/[]/total", // 可省略<br>"info@":"/[]/info" // 可省略</a><br> 返回的数据中，总数及分页详情结构为： <br>  "total":139, // 总数 <br> "info":{ // 分页详情 <br>    "total":139, // 总数 <br>    "count":5, // 每页数量 <br>    "page":0, // 当前页码 <br>    "max":27, // 最大页码 <br>    "more":true, // 是否还有更多 <br>    "first":true, // 是否为首页 <br>    "last":false // 是否为尾页 <br>} <br><br> ④ Moment INNER JOIN User LEFT JOIN Comment：<br><a href="http://apijson.cn/api/?type=JSON&amp;url=http://apijson.cn:8080/get&amp;json=%7B%22%5B%5D%22:%7B%22count%22:5,%22join%22:%22%26%2FUser%2Fid@,%3C%2FComment%22,%22Moment%22:%7B%22@column%22:%22id,userId,content%22,%22@group%22:%22id%22%7D,%22User%22:%7B%22name~%22:%22t%22,%22id@%22:%22%2FMoment%2FuserId%22,%22@column%22:%22id,name,head%22%7D,%22Comment%22:%7B%22momentId@%22:%22%2FMoment%2Fid%22,%22@column%22:%22id,momentId,content%22%7D%7D%7D" rel="nofollow">"[]":{<br>    "join":"&amp;/User/id@,&lt;/Comment",<br>    "Moment":{<br>     "@group":"id" // 主副表不是一对一，要去除重复数据<br>   },<br>    "User":{<br>      "name~":"t",<br>      "id@":"/Moment/userId"<br>    },<br>    "Comment":{<br>      "momentId@":"/Moment/id"<br>    }<br>}</a><br><br> ⑤ 每一层都加当前用户名：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%7D,%22%5B%5D%22:%7B%22name@%22:%22User%252Fname%22,%22Moment%22:%7B%7D%7D%7D" rel="nofollow">"User":{},<br>"[]":{<br>    "name@":"User/name", // 自定义关键词<br>    "Moment":{}<br>}</a></td>
</tr>
<tr>
<td>对象关键词，可自定义</td>
<td>"@key":Object，@key 为 Table:{} 中 {} 内的关键词，Object 的类型由 @key 指定<br><br>① "@combine":"key0 | (key1 &amp; (key2 | !key3))..."，条件组合方式，最终按 <br> (其它key条件 AND 连接) AND (key0条件 OR (key1条件 AND (key2条件 OR (NOT key3条件)))) <br>这种方式连接，其中 "其它key" 是指与 @combine 在同一对象，且未被它声明的条件 key，默认都是 &amp; 连接。注意不要缺少或多余任何一个空格。 <br><br>② "@column":"column;function(arg)..."，返回字段<br><br>③ "@order":"column0+,column1-..."，排序方式<br><br>④ "@group":"column0,column1..."，分组方式。如果 @column 里声明了 Table 的 id，则 id 也必须在 @group 中声明；其它情况下必须满足至少一个条件:<br>1.分组的 key 在 @column 里声明<br>2.Table 主键在 @group 中声明 <br><br>⑤ "@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2..." // OR 连接，或 <br>"@having&amp;":"function0(...)?value0;function1(...)?value1;function2(...)?value2..." // AND 连接，或 <br>"@having":{<br>   "h0":"function0(...)?value0",<br>   "h1":function1(...)?value1",<br>   "h2":function2(...)?value2...",<br>   "@combine":"h0 &amp; (h1 | !h2)"  // 任意组合，非必传<br>}<br>SQL 函数条件，一般和 @group 一起用，函数一般在 @column 里声明<br><br>⑥ "@schema":"sys"，集合空间(数据库名/模式)，非默认的值可通过它来指定，可以在最外层作为全局默认配置<br><br>⑦ "@database":"POSTGRESQL"，数据库类型，非默认的值可通过它来指定，可以在最外层作为全局默认配置<br><br>⑧ "@datasource":"DRUID"，跨数据源，非默认的值可通过它来指定，可以在最外层作为全局默认配置<br><br>⑨ "@json":"key0,key1..."，转为 JSON 格式返回，符合 JSONObject 则转为 {...}，符合 JSONArray 则转为 [...] <br><br>⑩ "@role":"OWNER"，来访角色，包括<br>UNKNOWN,LOGIN,CONTACT,CIRCLE,OWNER,ADMIN，<br>可以在最外层作为全局默认配置，<br>可自定义其它角色并重写 Verifier.verify 等相关方法来自定义校验 <br><br>⑪ "@explain":true，性能分析，可以在最外层作为全局默认配置 <br><br>⑫ "@raw":"key0,key1..."，其中 key0, key1 都对应有键值对<br> "key0":"SQL片段或SQL片段的别名", <br> "key1":"SQL片段或SQL片段的别名" <br> 自定义原始SQL片段，可扩展嵌套SQL函数等复杂语句，必须是后端已配置的，只有其它功能符都做不到才考虑，谨慎使用，注意防 SQL 注入<br><br>⑬ "@null":"key1,key2..."，空值键值对，自动插入 key1:null, key2:null ... 并作为有效键值对执行，作为条件时对应 SQL 是 <code>WHERE tag IS NULL</code>，作为值时对应 SQL 是 <code>SET tag = NULL</code><br><br>⑭ "@otherKey":Object，自定义关键词，名称和以上系统关键词不一样，且原样返回上传的值</td>
<td>① 搜索 name 或 tag 任何一个字段包含字符 a 的 User 列表：<br> <a href="http://apijson.cn:8080/get/%7B%22User%5B%5D%22:%7B%22count%22:10,%22User%22:%7B%22@column%22:%22id,name,tag%22,%22name~%22:%22a%22,%22tag~%22:%22a%22,%22@combine%22:%22name~%20%7C%20tag~%22%7D%7D%7D" rel="nofollow">"name~":"a",<br>"tag~":"a",<br>"@combine":"name~ | tag~"</a> <br>对应SQL是<code>name REGEXP 'a' OR tag REGEXP 'a'</code> <br><br> ② 只查询 id,sex,name 这几列并且请求结果也按照这个顺序：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22@column%22:%22id,sex,name%22,%22id%22:38710%7D%7D" rel="nofollow">"@column":"id,sex,name"</a><br>对应 SQL 是<code>SELECT id,sex,name</code> <br><br> ③ 查询按 name 降序、id 默认顺序 排序的 User 数组：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22User%22:%7B%22@column%22:%22name,id%22,%22@order%22:%22name-,id%22%7D%7D%7D" rel="nofollow">"@order":"name-,id"</a><br>对应 SQL 是<code>ORDER BY name DESC,id</code> <br><br> ④ 查询按 userId 分组的 Moment 数组：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId,id%22,%22@group%22:%22userId,id%22%7D%7D%7D" rel="nofollow">"@group":"userId,id"</a><br>对应 SQL 是<code>GROUP BY userId,id</code> <br><br> ⑤ 查询 按 userId 分组、id 最大值&gt;=100 的 Moment 数组：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId%253Bmax(id)%22,%22@group%22:%22userId%22,%22@having%22:%22max(id)%3E=100%22%7D%7D%7D" rel="nofollow">"@column":"userId;max(id)",<br>"@group":"userId",<br>"@having":"max(id)&gt;=100"</a><br>对应 SQL 是<code>SELECT userId,max(id) ... GROUP BY userId HAVING max(id)&gt;=100</code> <br>还可以指定函数返回名：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22count%22:10,%22Moment%22:%7B%22@column%22:%22userId%253Bmax(id):maxId%22,%22@group%22:%22userId%22,%22@having%22:%22(maxId)%3E=100%22%7D%7D%7D" rel="nofollow">"@column":"userId;max(id):maxId",<br>"@group":"userId",<br>"@having":"(maxId)&gt;=100"</a><br>对应 SQL 是<code>SELECT userId,max(id) AS maxId ... GROUP BY userId HAVING (maxId)&gt;=100</code> <br><br> ⑥ 查询 sys 内的 User 表：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22@schema%22:%22sys%22%7D%7D" rel="nofollow">"@schema":"sys"</a><br>对应 SQL 是<code>FROM sys.User</code> <br><br> ⑦ 查询 PostgreSQL 数据库的 User 表：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22@database%22:%22POSTGRESQL%22,%22@explain%22:true%7D%7D" rel="nofollow">"@database":"POSTGRESQL"</a><br><br> ⑧ 使用 Druid 连接池查询 User 表：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22@datasource%22:%22DRUID%22%7D%7D" rel="nofollow">"@datasource":"DRUID"</a><br><br> ⑨ 将 VARCHAR 字符串字段 get 转为 JSONArray 返回：<br><a href="http://apijson.cn:8080/get/%7B%22Access%22:%7B%22@json%22:%22get%22%7D%7D" rel="nofollow">"@json":"get"</a><br><br> ⑩ 查询当前用户的动态：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@role%22:%22OWNER%22%7D%7D%7D" rel="nofollow">"@role":"OWNER"</a><br><br> ⑪ 开启性能分析：<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@explain%22:true%7D%7D%7D" rel="nofollow">"@explain":true</a><br>对应 SQL 是<code>EXPLAIN</code> <br><br> ⑫ 统计最近一周偶数 userId 的数量<br><a href="http://apijson.cn:8080/get/%7B%22%5B%5D%22:%7B%22Moment%22:%7B%22@column%22:%22date%3bleft(date,10):day%3bsum(if(userId%252=0,1,0))%22,%22@group%22:%22day%22,%22@having%22:%22to_days(now())-to_days(%60date%60)%3C=7%22,%22@raw%22:%22@column,@having%22%7D%7D%7D" rel="nofollow">"@column":"date;left(date,10):day;sum(if(userId%2=0,1,0))",<br>"@group":"day",<br>"@having":"to_days(now())-to_days(`date`)&lt;=7",<br>"@raw":"@column,@having"</a><br>对应 SQL 是<code>SELECT date, left(date,10) AS day, sum(if(userId%2=0,1,0)) ... GROUP BY day HAVING to_days(now())-to_days(`date`)&lt;=7</code> <br><br> ⑬ 把用户的标签设置为空 <br><a href="http://apijson.cn/api/?type=JSON&amp;url=http://apijson.cn:8080/put/User&amp;json=%7B%22id%22:82001,%22@null%22:%22tag%22,%22@explain%22:true%7D" rel="nofollow">"@null":"tag"</a> <br><br> ⑭  从pictureList 获取第 0 张图片：<br><a href="http://apijson.cn:8080/get/%7B%22User%22:%7B%22id%22:38710,%22@position%22:0,%22firstPicture()%22:%22getFromArray(pictureList,@position)%22%7D%7D" rel="nofollow">"@position":0, // 自定义关键词<br>"firstPicture()":"getFromArray(pictureList,@position)"</a></td>
</tr>
<tr>
<td>全局关键词</td>
<td>为最外层对象 {} 内的关键词。其中 @database，@schema, @datasource, @role, @explain 基本同对象关键词，见上方说明，区别是全局关键词会每个表对象中没有时自动放入，作为默认值。 <br><br>① "tag":"Table"，后面的 tag 是非 GET、HEAD 请求中匹配请求的 JSON 结构的标识，一般是要查询的 Table 的名称或该名称对应的数组 Table[] 或 Table:[]，由后端 Request 表中指定。 <br><br>② "version":1，接口版本，version 不传、为 null 或 &lt;=0 都会使用最高版本，传了其它有效值则会使用最接近它的最低版本，由后端 Request 表中指定。<br><br>③ "format":true，格式化返回 Response JSON 的 key，一般是将 TableName 转为 tableName, TableName[] 转为 tableNameList, Table:alias 转为 alias, TableName-key[] 转为 tableNameKeyList 等小驼峰格式。</td>
<td>①  查隐私信息：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets&amp;type=JSON&amp;json=%7B%22tag%22:%22Privacy%22,%22Privacy%22:%7B%22id%22:82001%7D%7D" rel="nofollow">{"tag":"Privacy","Privacy":{"id":82001}}</a><br><br> ② 使用第 1 版接口查隐私信息：<br><a href="http://apijson.cn/api?url=http%3A%2F%2Fapijson.cn%3A8080%2Fgets&amp;type=JSON&amp;json=%7B%22version%22:1,%22tag%22:%22Privacy%22,%22Privacy%22:%7B%22id%22:82001%7D%7D" rel="nofollow">{"version":1,"tag":"Privacy","Privacy":{"id":82001}}</a> <br><br> ③ 格式化朋友圈接口返回 JSON 中的 key：<br><a href="http://apijson.cn:8080/get/%7B%22format%22:true,%22%5B%5D%22:%7B%22page%22:0,%22count%22:3,%22Moment%22:%7B%7D,%22User%22:%7B%22id@%22:%22%252FMoment%252FuserId%22%7D,%22Comment%5B%5D%22:%7B%22count%22:3,%22Comment%22:%7B%22momentId@%22:%22%5B%5D%252FMoment%252Fid%22%7D%7D%7D%7D" rel="nofollow">{<br>    "format":true, <br>    "[]":{<br>      "page":0, <br>      "count":3, <br>      "Moment":{}, <br>      "User":{<br>        "id@":"/Moment/userId"<br>      },<br>      "Comment[]":{<br>        "count":3,<br>        "Comment":{<br>          "momentId@":"[]/Moment/id"<br>        }<br>      }<br>    }<br>}</a></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<br>
</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

