1 Star 0 Fork 0

TimWong / ecgo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
request.go 2.41 KB
一键复制 编辑 原始数据 按行查看 历史
Tim 提交于 2021-06-17 22:36 . first version
//解释请求内容,放到相应的成员变量中
package ecgo
import (
"encoding/json"
"errors"
"net/http"
"net/url"
"strings"
)
// Request 请求对象
type Request struct {
RawData string
*http.Request
data map[string]string
parsed bool
}
// NewRequest 创建Request对象
func NewRequest(req *http.Request) *Request {
data := make(map[string]string)
body := make([]byte, req.ContentLength)
req.Body.Read(body)
return &Request{
string(body),
req,
data,
false,
}
}
func (req *Request) parse() {
if !req.parsed {
req.ParseForm()
contentType := strings.ToLower(req.Header.Get("Content-Type"))
if strings.HasPrefix(contentType, "multipart/form-data") {
req.ParseMultipartForm(10 << 20)
}
var vals url.Values
if req.MultipartForm != nil {
vals = req.MultipartForm.Value
} else {
vals = req.PostForm
}
for k, v := range vals {
if _, ok := req.data[k]; !ok {
req.data[k] = v[0]
}
}
for k, v := range req.Form {
if _, ok := req.data[k]; !ok {
req.data[k] = v[0]
}
}
req.parsed = true
}
}
// GetHeader 获取指定名称的请求头
func (req *Request) GetHeader(key string) string {
return req.Header.Get(key)
}
// Input 获取指定的请求参数内容,以字符串类型返回
// Input(key) 获取请求参数,未设置时返回空字符串
// Input(key, defaultVal) 获取请求参数,不存在时返回defaultVal
func (req *Request) Input(key string, defaultVal ...string) string {
req.parse()
val, exists := req.data[key]
if !exists {
if len(defaultVal) > 0 {
val = defaultVal[0]
} else {
val = ""
}
}
return val
}
// Inputs 返回指定的请求参数,返回map
// Inputs() 获取全部请求参数
// Inputs(key1, key2, ...) 返回指定的参数,不存在的参数值为空字符串
func (req *Request) Inputs(keys ...string) map[string]string {
req.parse()
result := make(map[string]string)
switch len(keys) {
case 0:
result = req.data
default:
for _, k := range keys {
if val, exists := req.data[k]; exists {
result[k] = val
} else {
result[k] = ""
}
}
}
return result
}
// ParseJson 将json字符串格式的原始数据decode到result
func (req *Request) ParseJson(result interface{}) error {
if !strings.HasPrefix(strings.ToLower(req.Header.Get("Content-Type")), "application/json") {
return errors.New("not application/json request")
}
return json.Unmarshal([]byte(req.RawData), result)
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/tim1020/ecgo.git
git@gitee.com:tim1020/ecgo.git
tim1020
ecgo
ecgo
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891