<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>前后端协作 on Saiga</title>
    <link>http://localhost:1313/tags/%E5%89%8D%E5%90%8E%E7%AB%AF%E5%8D%8F%E4%BD%9C/</link>
    <description>Recent content in 前后端协作 on Saiga</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <managingEditor>wuwenzen@outlook.com (wuwj)</managingEditor>
    <webMaster>wuwenzen@outlook.com (wuwj)</webMaster>
    <lastBuildDate>Mon, 30 Aug 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="http://localhost:1313/tags/%E5%89%8D%E5%90%8E%E7%AB%AF%E5%8D%8F%E4%BD%9C/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>前后端协作改造记：从「口头协议」到 Mock 驱动开发</title>
      <link>http://localhost:1313/posts/2021-08-30-api-contract-and-mock/</link>
      <pubDate>Mon, 30 Aug 2021 00:00:00 +0000</pubDate><author>wuwenzen@outlook.com (wuwj)</author>
      <guid>http://localhost:1313/posts/2021-08-30-api-contract-and-mock/</guid>
      <description>&lt;p&gt;很多项目的前后端协作，一开始都是这样：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;「你先把页面搭着，接口我晚点给你。」&lt;br&gt;&#xA;「返回字段大概就这些，不行再改。」&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;结果就是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;接口文档滞后甚至缺失，全靠口头约定；&lt;/li&gt;&#xA;&lt;li&gt;字段今天叫 &lt;code&gt;userName&lt;/code&gt; 明天叫 &lt;code&gt;customerName&lt;/code&gt;；&lt;/li&gt;&#xA;&lt;li&gt;前端经常等后端联调，后端也抱怨前端改来改去。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这篇文章是一次真实改造的复盘：我们从这种「口头协议」状态，逐步过渡到：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;有规范的接口文档 + 可用的 Mock 服务 + 基于契约的联调流程。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;1-先承认问题我们缺的不是工具而是契约&#34;&gt;1. 先承认问题：我们缺的不是工具，而是「契约」&lt;/h2&gt;&#xA;&lt;p&gt;一开始我们也装过各种工具：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Swagger / OpenAPI；&lt;/li&gt;&#xA;&lt;li&gt;YApi / Rap2 之类的平台；&lt;/li&gt;&#xA;&lt;li&gt;各种 Mock 插件。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但用一段时间就废掉了，根本原因是：&lt;strong&gt;文档没人维护，接口变更不走流程&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;所以改造的第一步，不是换工具，而是统一几个规则：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;所有新接口必须先有文档，再开发&lt;/strong&gt;；&lt;/li&gt;&#xA;&lt;li&gt;文档就是契约：前端后端都按契约来实现；&lt;/li&gt;&#xA;&lt;li&gt;接口变更要么走版本，要么走兼容字段，不再「直接改」。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;工具只是为了让这套流程变得没那么痛苦。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;2-选择和收敛接口文档工具&#34;&gt;2. 选择和收敛接口文档工具&lt;/h2&gt;&#xA;&lt;p&gt;我们最终选的是：&lt;strong&gt;OpenAPI 规格 + 一套接口管理平台（如 YApi 或内部平台）&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提供可视化的接口列表、请求例子、响应示例；&lt;/li&gt;&#xA;&lt;li&gt;支持一键导出 JSON / SDK 生成；&lt;/li&gt;&#xA;&lt;li&gt;自带 Mock 功能。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;接口粒度大致是：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;paths&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;/api/order/list&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;post&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;summary&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;订单列表&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;parameters&lt;/span&gt;: []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;requestBody&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;content&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;application/json&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;schema&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;$ref&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#/components/schemas/OrderListRequest&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;responses&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;200&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;description&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;OK&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;content&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;application/json&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;schema&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;$ref&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;#/components/schemas/OrderListResponse&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当后端定义好这些 schema 后，前端就可以基于文档做代码生成、Mock 数据、类型定义。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
