分享一个将查询参数解析到 struct 的包

xnotepad · 2018-05-07 22:33:19 · 691 次点击    
这是一个分享于 2018-05-07 22:33:19 的资源,其中的信息可能已经有所发展或是发生改变。
type State int8

const (
    StateLocked State = iota+1
    StateDelete
)

// 实现 query.UnmarshalQueryer 接口
func (s *State) UnmarshalQuery(data string) error {
    switch data {
    case "locked":
        *s = StateLocked
    case "delete":
        *s = StateDelete
    default:
        return errors.New("无效的值")
    }
}

type struct Query {
    Page int `query:"page,1"`
    Size int `query:"size,20"`
    States []State `query:"state,normal"`
}

func (q *Query) SanitizeQuery(errors map[string]string) {
    if q.Page < 0 {
        errors["page"] = "不能小于零"
    }

    // 其它字段的验证
}


func handle(w http.ResponseWriter, r *http.Request) {
    q := &Query{}
    errors := query.Parse(r, q)
    if len(errors) > 0 {
        // TODO
        return
    }

    // 请求参数为 /?page=1&size=2&state=normal,delete
    // 则 q 的值为
    // page = 1
    // size = 2
    // states = []State{StateLocked, StateDelete}
    //
    // 参数 state 也可使用以下方式
    // /?page=1&size=2&state=normal&normal=delete
}

https://github.com/issue9/query


入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

691 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传