You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
3.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### 表单参数提交介绍
- 1.前端提交简单的表单参数示例代码,[请参考已有的接口测试用例文档](./api_doc.md)
- 2.本篇我们将介绍复杂表单参数的提交.
#### 什么是简单的表单参数提交
> 1.如果接口参数都是简单的键值对,没有嵌套关系,就是简单模式.
![form-parms](https://www.ginskeleton.com/images/formparams1.png)
#### 什么是复杂的表单参数提交
> 1.表单参数存在嵌套关系,这种数据在 `postman` 都是以 raw 方式提交,本质上就是请求的表单参数头设置为:`Content-Type: application/json`
![form-parms](https://www.ginskeleton.com/images/formparams2.png)
#### `ginskeleton` 后台处理复杂表单数据
> 1.按照提交的数据格式,我们在表单参数验证器部分,定义接受的结构体,例如上图的参数我们在后台的接受参数就可以定义如下:
```code
type ViewEleCreateUpdate struct {
FkBigScreenView float64 `form:"fk_big_screen_view" json:"fk_big_screen_view"`
EleId string `form:"ele_id" json:"ele_id"`
EleIdTitle string `form:"ele_id_title" json:"ele_id_title"`
Status *float64 `form:"status" json:"status"`
Remark string `form:"remark" json:"remark"`
ChildrenTableDelIds string `form:"children_table_del_ids" json:"children_table_del_ids"`
ChildrenTable []ChildrenTable `form:"children_table" json:"children_table"`
}
// 大屏界面元素的子表数据
// 每种元素都有三个状态1=正常2=禁止3=隐藏)
// 被嵌套的数据请独立定义,这样的好处就是后续可以随意精准取出任意一部分
type ChildrenTable struct {
Id float64 `form:"id" json:"id"`
FkBigScreenViewElement float64 `form:"fk_big_screen_view_element" json:"fk_big_screen_view_element"`
FkBigScreenViewElementStatusName float64 `form:"fk_big_screen_view_element_status_name" json:"fk_big_screen_view_element_status_name"`
Status *float64 `form:"status" json:"status"`
Remark string `form:"remark" json:"remark"`
}
```
#### 接口验证器 ↓
> 1.复杂接口参数前端都是通过json格式提交.
> 2.`go` 语言代码接收语法是 `context.ShouldBindJSON()`
![form-parms3](https://www.ginskeleton.com/images/formparams3.png)
#### 接口验证器对应的数据类型 ↓
![form-parms4](https://www.ginskeleton.com/images/formparams4.png)
#### 在后续的控制器、model 获取子表数据
```code
# 在接口验证逻辑部分,通过参数验证后,我们将子表数据已经存储在上线文
// 子表数据设置一个独立的键存储
extraAddBindDataContext.Set(consts.ValidatorPrefix+"children_table_del_ids", v.ChildrenTable)
// 那么后续的控制器、以及model都可以根据相关的键获取原始数据、断言为我们定义的子表数据类型继续操作
var childrenTableData = c.MustGet(consts.ValidatorPrefix + "children_table_del_ids")
// 获取子表数据断言为我们定义的子表数据类型
// 这里需要注意验证器验证参数ok调用了控制器如果再验证器文件没有创建独立的数据类型文件夹,在控制器断言会形成包的嵌套、报错,这就是我们一开始将复杂数据类型创建独立的文件件定义的原因
if subTableStr, ok := childrenTableData.([]data_type_for_create_edit.ChildrenTable); ok {
// 这里就相当于获取了go语言切片数据
// 继续批量存储、或者挨个遍历就行
// .... 省略业务逻辑
}
```