<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>RunnerLee (RunnerLee)</title>
    <link>https://ruby-china.org/RunnerLee</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>[请教] API 返回对象数据结构是否需要固定？</title>
      <description>&lt;h4 id="前景概述"&gt;前景概述&lt;/h4&gt;
&lt;p&gt;APP 根据虚拟物品计费点创建订单。创建订单时需要提交不同的表单。
例如 A 付费点需要提交姓名及生日，B 续费点需要提交姓名及邮箱。&lt;/p&gt;
&lt;h4 id="实现"&gt;实现&lt;/h4&gt;
&lt;p&gt;创建订单表 &lt;code&gt;orders&lt;/code&gt;, 计费点表 &lt;code&gt;products&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;表单表 &lt;code&gt;forms&lt;/code&gt;, &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| app_id     | int(10) unsigned | NO   | MUL | NULL    |                |
| product_id | int(10) unsigned | NO   |     | NULL    |                |
| version_id | int(10) unsigned | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;表单字段配置表 &lt;code&gt;form_fields&lt;/code&gt;, &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------+--------------------------------------------+------+-----+---------+----------------+
| Field      | Type                                       | Null | Key | Default | Extra          |
+------------+--------------------------------------------+------+-----+---------+----------------+
| id         | int(10) unsigned                           | NO   | PRI | NULL    | auto_increment |
| form_id    | int(10) unsigned                           | NO   | MUL | NULL    |                |
| name       | varchar(30)                                | NO   |     | NULL    |                |
+------------+--------------------------------------------+------+-----+---------+----------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;订单表单表 &lt;code&gt;form_values&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------+--------------------------------------------+------+-----+---------+----------------+
| Field      | Type                                       | Null | Key | Default | Extra          |
+------------+--------------------------------------------+------+-----+---------+----------------+
| id         | int(10) unsigned                           | NO   | PRI | NULL    | auto_increment |
| order_id   | varchar(22)                                | NO   |     | NULL    |                |
| name       | varchar(30)                                | NO   |     | NULL    |                |
| value      | varchar(255)                               | NO   |     | NULL    |                |
+------------+--------------------------------------------+------+-----+---------+----------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建订单时，传入计费点 ID，并将表单内容通过 json 提交&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /orders
product_id=1&amp;amp;attributes=%7B%22username%22%3A%22testing%22%7D
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过付费点获取到表单及表单字段配置进行表单校验后入库。&lt;/p&gt;
&lt;h4 id="问题"&gt;问题&lt;/h4&gt;
&lt;p&gt;当返回订单信息时，表单的值应该怎么下发？
目前我使用的是&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"testing"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"birthday"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2017-07-10"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样当不同计费点的表单不同时，attributes 内的结构时固定的。&lt;/p&gt;

&lt;p&gt;但也有朋友说应该直接这样&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"attributes"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"birthday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2017-07-10"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者是将上面这种 &lt;code&gt;attributes&lt;/code&gt; 的形式直接转为 json 字符串。&lt;/p&gt;

&lt;p&gt;各位能否指点一下？&lt;/p&gt;</description>
      <author>RunnerLee</author>
      <pubDate>Mon, 31 Jul 2017 23:12:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/33683</link>
      <guid>https://ruby-china.org/topics/33683</guid>
    </item>
  </channel>
</rss>
