1
0
mirror of https://github.com/ZSCNetSupportDept/website.git synced 2025-10-29 17:34:15 +08:00
Files
website/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成/index.html

97 lines
38 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-devdocs/培训/Web后端/基于HTTP的Web后端的组成" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.4.0">
<title data-rh="true">基于HTTP的Web后端的组成 | 中山学院网络维护科</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://developer.zsxyww.com/img/docusaurus-social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://developer.zsxyww.com/img/docusaurus-social-card.jpg"><meta data-rh="true" property="og:url" content="https://developer.zsxyww.com/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="基于HTTP的Web后端的组成 | 中山学院网络维护科"><meta data-rh="true" name="description" content="一个基于HTTP的Web后端通常有以下部分组成:"><meta data-rh="true" property="og:description" content="一个基于HTTP的Web后端通常有以下部分组成:"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://developer.zsxyww.com/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成"><link data-rh="true" rel="alternate" href="https://developer.zsxyww.com/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成" hreflang="en"><link data-rh="true" rel="alternate" href="https://developer.zsxyww.com/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="中山学院网络维护科 RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="中山学院网络维护科 Atom Feed"><link rel="stylesheet" href="/assets/css/styles.ace29f53.css">
<script src="/assets/js/runtime~main.e595c274.js" defer="defer"></script>
<script src="/assets/js/main.05661661.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();null!==e?t(e):window.matchMedia("(prefers-color-scheme: dark)").matches?t("dark"):(window.matchMedia("(prefers-color-scheme: light)").matches,t("light"))}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="ZSCNetworkSupport_logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo.svg" alt="ZSCNetworkSupport_logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">ZSCNetworkSupport</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/">首页</a><a class="navbar__item navbar__link" href="/docs/wiki/首页">wiki</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/devdocs/首页">开发组文档</a><a class="navbar__item navbar__link" href="/blog">公告</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/ZSCNetSupportDept/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/devdocs/首页">开发组首页</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/devdocs/网站/">网站</a><button aria-label="Expand sidebar category &#x27;网站&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/devdocs/网维报修系统/">网维报修系统</a><button aria-label="Expand sidebar category &#x27;网维报修系统&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/devdocs/招新系统/">招新系统</a><button aria-label="Expand sidebar category &#x27;招新系统&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/devdocs/基础设施/">基础设施</a><button aria-label="Expand sidebar category &#x27;基础设施&#x27;" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/devdocs/联系开发组">联系开发组</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/devdocs/下载">下载</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/docs/devdocs/培训/git/概览">培训</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0" href="/docs/devdocs/培训/git/概览">git</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" tabindex="0" href="/docs/devdocs/培训/Web后端/Web后端的简单介绍">Web后端</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/devdocs/培训/Web后端/Web后端的简单介绍">Web后端的简单介绍</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成">基于HTTP的Web后端的组成</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/devdocs/培训/Web后端/高级教程">高级教程</a></li></ul></li></ul></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">培训</span><meta itemprop="position" content="1"></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Web后端</span><meta itemprop="position" content="2"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">基于HTTP的Web后端的组成</span><meta itemprop="position" content="3"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>基于HTTP的Web后端的组成</h1>
<p>一个基于HTTP的Web后端通常有以下部分组成:</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="路由系统router">路由系统(router)<a class="hash-link" aria-label="Direct link to 路由系统(router)" title="Direct link to 路由系统(router)" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#路由系统router"></a></h5>
<p>路由系统负责处理用户访问网页时的请求路径/方法,并转交给对应的处理者</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="处理者handler">处理者(handler)<a class="hash-link" aria-label="Direct link to 处理者(handler)" title="Direct link to 处理者(handler)" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#处理者handler"></a></h5>
<p>处理者负责处理用户的请求读取用户在URI中的参数和请求体中的内容如果有统称为上下文(Context),负责返回请求所对应的回应</p>
<p>有的系统还会继续细分,将业务层和接口层分开(这种情况下通常接口层是和路由功能合并的)</p>
<p><em>最低要求是这个,另外,通常一个后端系统还需要连接一个数据库:</em></p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="数据库">数据库<a class="hash-link" aria-label="Direct link to 数据库" title="Direct link to 数据库" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#数据库"></a></h5>
<p>通常是兼容SQL协议的关系型数据库负责存储后端所需要用到和产生的信息</p>
<p><em>其实很多后端系统无非就是对数据库的增删改查(所谓的CRUD),可以说这些系统就是数据库的一层方便wrapper</em></p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="鉴权系统">鉴权系统<a class="hash-link" aria-label="Direct link to 鉴权系统" title="Direct link to 鉴权系统" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#鉴权系统"></a></h5>
<p>通常,我们系统的内容不打算对互联网上的任何一个人开放,所以我们需要一些方法来验证访问者的身份</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="模板系统optional">模板系统optional<a class="hash-link" aria-label="Direct link to 模板系统optional" title="Direct link to 模板系统optional" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#模板系统optional"></a></h5>
<p>如果你打算通过后端渲染HTML返回到用户浏览器那你需要一套模板来方便地将动态内容插入到模板里面返回给用户如果是一个纯粹API的站点还是想直接把工作甩给前端你就可以不用配置模板</p>
<p>此外,还有一些外围的工作:</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="反向代理">反向代理<a class="hash-link" aria-label="Direct link to 反向代理" title="Direct link to 反向代理" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#反向代理"></a></h5>
<p>通常我们的Web后端服务不是直接暴露对外访问的而是经过一层代理的转发这样更加的安全配置也更加简单服务只需要监听本地端口</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="配置系统">配置系统<a class="hash-link" aria-label="Direct link to 配置系统" title="Direct link to 配置系统" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#配置系统"></a></h5>
<p>你的系统需要读取配置,比如监听端口,数据库连接,还有其他服务的密钥等</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="cicd">CI/CD<a class="hash-link" aria-label="Direct link to CI/CD" title="Direct link to CI/CD" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#cicd"></a></h5>
<p>自动化配置构建,部署,测试等工作,让你专注代码工作,而不用把心思过多地放在部署构建这些工作上面</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="路由">路由<a class="hash-link" aria-label="Direct link to 路由" title="Direct link to 路由" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#路由"></a></h2>
<p>假设你的一个报名服务架设在<code>service.io</code>上:</p>
<p>首先,用户访问这个网址时需要显示一段欢迎文字,然后将他们引导到报名的页面</p>
<p>那么,你应该在用户访问<code>/</code>时返回一个html文件里面含有导向<code>/volunteer.html</code>的超链接</p>
<p><code>/volunteer.html</code>里面的前端代码需要以AJAX的形式与后端API交互比如</p>
<p><code>service.io/api/register</code>接受POST请求前端上传报名人的信息,后端录入数据库,并返回录入的信息全部以JSON序列化</p>
<p><code>service.io/api/view</code>接受GET请求让这个报名人查看自己的报名信息返回JSON格式</p>
<p><code>service.io/api/cancel</code>接受POST请求取消某个报名人的信息成功则返回相应状态码</p>
<p><code>service.io/admin/viewAll</code>让管理员查看当前的所有报名接受GET请求</p>
<p><code>service.io/admin/cancel</code>让管理员取消任意的报名,接受的POST</p>
<p>在现代网站设计中,我们不是在根目录下面创建对应的文件(实际上,连根目录都不需要了),我们使用一些叫做“路由器(router)”的模块,当用户通过一定的方法请求一定的路径时就把这些请求转交到相应的handler</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="uri参数">URI参数<a class="hash-link" aria-label="Direct link to URI参数" title="Direct link to URI参数" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#uri参数"></a></h3>
<p>参数在正常路径后面,以?开始,以&amp;分割,以键值对的形式存在</p>
<p>例如:<code>service.io/api/register?name=小明&amp;phone=10000000000&amp;freeday=2024-9-25</code></p>
<p>这样的参数可以被许多后端框架使用内置的解析器解析</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="参数化路径">参数化路径<a class="hash-link" aria-label="Direct link to 参数化路径" title="Direct link to 参数化路径" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#参数化路径"></a></h3>
<p>这种路径通常是配合REST风格的接口来设计的比如</p>
<p><code>service.io/api/users/小明</code></p>
<p>类似于这样的路径,许多后端框架可以使用<code>service.io/api/users/:user</code>这样的形式来匹配在转交给的handler中可以读取<code>:user</code>参数,从而返回参数所指定的资源</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="api设计">API设计<a class="hash-link" aria-label="Direct link to API设计" title="Direct link to API设计" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#api设计"></a></h3>
<p>API的设计包括了路径的设计和接口格式的设计一般小项目可以相对地随便一点但是大项目还是需要认真一点的</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="传统">传统<a class="hash-link" aria-label="Direct link to 传统" title="Direct link to 传统" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#传统"></a></h4>
<p>我们刚才所举的例子就是一个传统的API设计一个路径就对应了一个业务点一般只会使用<code>GET</code><code>POST</code>来对应获取和上传,前后端的交互一般在文档里自行约定,或者采用内置的表单(如果数据比较简单的话)</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rest">REST<a class="hash-link" aria-label="Direct link to REST" title="Direct link to REST" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#rest"></a></h4>
<p>REST的意思是“表现层状态转换”英语Representational State Transfer缩写REST这种风格的要点是一个URI表示一个资源而不是一个业务同时充分地利用HTTP方法</p>
<p>例如,我们在前面定义了<code>Register</code>,<code>View</code><code>Cancel</code>三个API,如果是要上传什么就用<code>POST</code>,获取<code>GET</code>,一个路径表示的是一个业务而不是系统的某个资源下面来看看REST怎么写</p>
<p><code>POST service.io/api/users/小明</code> 用户小明提交一个报名,具体的报名信息在请求体里,这将在数据库里面创建一个小明的报名记录</p>
<p><code>GET service.io/api/users/小明</code> 用户小明查看自己的报名信息</p>
<p><code>DELETE service.io/api/users/小明</code> 取消小明的报名</p>
<p><code>PUT service.io/api/users/小明</code> 修改小明的报名信息,新信息放在请求体里面了</p>
<p>可以发现REST风格的API可以看作是对传统静态网页互联网的回归这种风格直观简洁兼容性更好更加利于缓存等</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="graphql">GraphQL<a class="hash-link" aria-label="Direct link to GraphQL" title="Direct link to GraphQL" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#graphql"></a></h4>
<p>GraphQL是一种用于API交互的查询语言他意图解决接口格式定义和多次查询带来的复杂问题</p>
<p>首先后端需要支持GraphQL,然后前端需要在API请求中注明自己想后端用什么格式呈现什么想要的信息这样就不需要前端多次请求不同的业务了</p>
<p>这对大型系统或许比较友好,但是如果只是一些小项目的话,这可能有些复杂,具体可以自己去了解</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="handler">handler<a class="hash-link" aria-label="Direct link to handler" title="Direct link to handler" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#handler"></a></h2>
<p>handler可以说是一个后端系统的核心了因为他们是实际处理业务的地方</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="面向对象与模型">面向对象与模型<a class="hash-link" aria-label="Direct link to 面向对象与模型" title="Direct link to 面向对象与模型" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#面向对象与模型"></a></h3>
<p>虽然可以使用其他的范式但是最推荐的是依据OOP的原则将需要处理的模型写成对象将一系列操作写成对象的方法
例如,报名系统本质上就是处理“报名人”这个对象的各种操作,我们可以定义:</p>
<div class="language-Go language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> Volunteer </span><span class="token keyword" style="color:#00009f">struct</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> id </span><span class="token builtin">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Name </span><span class="token builtin">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Phone </span><span class="token builtin">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> FreeDay time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Time</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> Note </span><span class="token builtin">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">func</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v </span><span class="token operator" style="color:#393A34">*</span><span class="token plain">volunteer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token builtin">error</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> err</span><span class="token operator" style="color:#393A34">:=</span><span class="token plain">db</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addVolunteer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MainConnection</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> err</span><span class="token operator" style="color:#393A34">!=</span><span class="token boolean" style="color:#36acaa">nil</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">nil</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>要设计一个登记报名的handler,就只需要将前端发过来的信息反序列化到Volunteer对象里然后调用Add方法即可这种思路就叫做面向对象</p>
<p>所设计的Volunteer和他的一系列方法就叫做“模型”</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="数据库-1">数据库<a class="hash-link" aria-label="Direct link to 数据库" title="Direct link to 数据库" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#数据库-1"></a></h2>
<p>数据库为后端的业务数据提供了方便的存储和查询服务,这里指的是结构化数据,其他需求可以去看高级教程</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sqlite">SQLite<a class="hash-link" aria-label="Direct link to SQLite" title="Direct link to SQLite" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#sqlite"></a></h3>
<p>这是个轻量级的数据库,一个数据库就是一个文件,通常用于业务量比较小的场景或者是本地开发的场景</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="postgresql">PostgreSQL<a class="hash-link" aria-label="Direct link to PostgreSQL" title="Direct link to PostgreSQL" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#postgresql"></a></h3>
<p>这个可以说是目前最厉害的开源数据库了,不仅提供了常规的结构化功能,而且对于一些简单的非结构化存储需求也可以胜任,但是本身的资源消耗是有点高的</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="选择数据库的各种考量">选择数据库的各种考量<a class="hash-link" aria-label="Direct link to 选择数据库的各种考量" title="Direct link to 选择数据库的各种考量" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#选择数据库的各种考量"></a></h3>
<ul>
<li>业务量如果业务量比较小的话就使用SQLite吧</li>
<li>兼容性:如果现有的环境和业务依赖于某个数据库,那么就继续用吧</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="orm">ORM<a class="hash-link" aria-label="Direct link to ORM" title="Direct link to ORM" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#orm"></a></h3>
<p>ORM是对数据库的一层抽象让你专注于业务逻辑的开发而不用担心具体的数据库问题如果对于性能或者其他的方面没有很大的需求的话建议在你的项目里使用ORM</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="鉴权">鉴权<a class="hash-link" aria-label="Direct link to 鉴权" title="Direct link to 鉴权" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#鉴权"></a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="session">Session<a class="hash-link" aria-label="Direct link to Session" title="Direct link to Session" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#session"></a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jwt">JWT<a class="hash-link" aria-label="Direct link to JWT" title="Direct link to JWT" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#jwt"></a></h3>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="oauth20">OAuth2.0<a class="hash-link" aria-label="Direct link to OAuth2.0" title="Direct link to OAuth2.0" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#oauth20"></a></h3>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="模板">模板<a class="hash-link" aria-label="Direct link to 模板" title="Direct link to 模板" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#模板"></a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="jinja2">Jinja2<a class="hash-link" aria-label="Direct link to Jinja2" title="Direct link to Jinja2" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#jinja2"></a></h3></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/ZSCNetSupportDept/website/tree/master/docs/devdocs/09-培训/02-Web后端/02-基于HTTP的Web后端的组成.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2024-11-02T11:55:40.000Z" itemprop="dateModified">Nov 2, 2024</time></b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/devdocs/培训/Web后端/Web后端的简单介绍"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Web后端的简单介绍</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/devdocs/培训/Web后端/高级教程"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">高级教程</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#路由">路由</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#uri参数">URI参数</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#参数化路径">参数化路径</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#api设计">API设计</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#handler">handler</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#面向对象与模型">面向对象与模型</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#数据库-1">数据库</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#sqlite">SQLite</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#postgresql">PostgreSQL</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#选择数据库的各种考量">选择数据库的各种考量</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#orm">ORM</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#鉴权">鉴权</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#session">Session</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#jwt">JWT</a></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#oauth20">OAuth2.0</a></li></ul></li><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#模板">模板</a><ul><li><a class="table-of-contents__link toc-highlight" href="/docs/devdocs/培训/Web后端/基于HTTP的Web后端的组成#jinja2">Jinja2</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2025 ZSCNetworkSupport,Built with Docusaurus.</div></div></div></footer></div>
</body>
</html>