goProject/trunk/center/common/webServer/apiContext.go
皮蛋13361098506 1b77f62820 初始化项目
2025-01-06 16:01:02 +08:00

219 lines
5.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package webServer
import (
"encoding/json"
"fmt"
"goutil/jsonUtil"
"goutil/logUtilPlus"
"goutil/typeUtil"
"goutil/zlibUtil"
"io/ioutil"
"net/http"
)
// ApiContext
// @description: Api请求上下文对象
type ApiContext struct {
// 请求对象
request *http.Request
// 应答写对象
responseWriter http.ResponseWriter
// 请求数据
requestBytes []byte
// 字典形式的请求数据
requestDataByMap typeUtil.MapData
//获取头部信息
header *http.Header
}
// GetRequest
// @description: 获取请求对象
// parameter:
// @receiver this: this
// return:
// @*http.Request: 请求对象
func (this *ApiContext) GetRequest() *http.Request {
return this.request
}
// GetResponseWriter
// @description: 获取应答写对象
// parameter:
// @receiver this: this
// return:
// @http.ResponseWriter: 应答写对象
func (this *ApiContext) GetResponseWriter() http.ResponseWriter {
return this.responseWriter
}
// GetRequestBytes
// @description: 获取请求字节数据
// parameter:
// @receiver this: this
// return:
// @[]byte: 请求字节数组
func (this *ApiContext) GetRequestBytes() []byte {
return this.requestBytes
}
// readContent
// @description: 读取内容
// parameter:
// @receiver this: this 请求对象
// @isZlib: 是否数据压缩
// return:
// @content: 二进制格式的内容
// @err: 错误对象
func (this *ApiContext) readContent(isZlib bool) (content []byte, err error) {
var buffer []byte
defer this.request.Body.Close()
if buffer, err = ioutil.ReadAll(this.request.Body); err != nil {
logUtilPlus.ErrorLog(fmt.Sprintf("url:%s,读取数据出错,错误信息为:%s", this.request.RequestURI, err))
return
}
// 不压缩,则直接返回
if isZlib == false {
this.requestBytes = buffer
return buffer, err
}
// 解压数据
if content, err = zlibUtil.Decompress(buffer); err != nil {
logUtilPlus.ErrorLog(fmt.Sprintf("url:%s,解压缩数据出错,错误信息为:%s", this.request.RequestURI, err))
return
}
this.requestBytes = content
return
}
// Unmarshal
// @description: 反序列化
// parameter:
// @receiver this: this
// @obj: 反序列化结果数据
// return:
// @error: 反序列化错误数据
func (this *ApiContext) Unmarshal(obj interface{}) error {
contentData := this.GetRequestBytes()
var errMsg error
// 反序列化
if obj, errMsg = json.Marshal(contentData); errMsg != nil {
logUtilPlus.ErrorLog(fmt.Sprintf("反序列化%s出错错误信息为%s", string(contentData), errMsg.Error()))
return errMsg
}
return nil
}
// RequestDataByMap
// @description: 获取请求的map格式数据
// parameter:
// @receiver this: this
// return:
// @typeUtil.MapData: map数据
// @error: 错误信息
func (this *ApiContext) RequestDataByMap() (typeUtil.MapData, error) {
if this.requestDataByMap != nil {
return this.requestDataByMap, nil
}
var data typeUtil.MapData
if err := this.Unmarshal(&data); err != nil {
return nil, err
}
this.requestDataByMap = data
return this.requestDataByMap, nil
}
// RequestDataBySlice
// @description: 获取请求的slice格式数据
// parameter:
// @receiver this: this
// return:
// @[]interface{}: 返回的数组数据
func (this *ApiContext) RequestDataBySlice() []interface{} {
result := make([]interface{}, 0, 8)
for _, value := range this.requestDataByMap {
result = append(result, value)
}
return result
}
// RequestDataBySlice2
// @description: 获取请求的slice格式数据
// parameter:
// @receiver this: this
// return:
// @[]interface{}: 返回的数组数据
// @error:
func (this *ApiContext) RequestDataBySlice2() (interface{}, error) {
contentData := this.GetRequestBytes()
// 反序列化
var result interface{}
var errMsg error
if result, errMsg = jsonUtil.UnMarshalWithNumberType(string(contentData)); errMsg != nil {
logUtilPlus.ErrorLog(fmt.Sprintf("用[]interface{}反序列化%s出错错误信息为%s", string(contentData), errMsg.Error()))
return nil, errMsg
}
return result, nil
}
// RequestDataBySlice2ByJson
// @description: 获取请求的slice格式数据
// parameter:
// @receiver this: this
// return:
// @[]interface{}: 返回的数组数据
// @error:
func (this *ApiContext) RequestDataBySlice2ByJson() ([]interface{}, error) {
contentData := this.GetRequestBytes()
// 反序列化
result := make([]interface{}, 0, 8)
if errMsg := json.Unmarshal(contentData, &result); errMsg != nil {
logUtilPlus.ErrorLog(fmt.Sprintf("用[]interface{}反序列化%s出错错误信息为%s", string(contentData), errMsg.Error()))
return nil, errMsg
}
return result, nil
}
// NewApiContext
// @description: 新建API上下文对象
// parameter:
// @_request: 请求对象
// @_responseWriter: 应答写对象
// @isZlib: 数据是否压缩
// return:
// @*ApiContext: 上下文
// @error: 错误信息
func NewApiContext(_request *http.Request, _responseWriter http.ResponseWriter, isZlib bool) (*ApiContext, error) {
context := &ApiContext{
request: _request,
header: &_request.Header,
responseWriter: _responseWriter,
}
// 读取数据
_, errMsg := context.readContent(isZlib)
if errMsg != nil {
return nil, errMsg
}
return context, nil
}