响应解析基于接口实现

This commit is contained in:
2025-05-07 15:48:36 +08:00
parent 088670c7d4
commit 741c9c8ea0
5 changed files with 193 additions and 94 deletions

View File

@ -9,6 +9,7 @@ package httpclient
import (
"fmt"
"git.zhangdeman.cn/zhangdeman/network/httpclient/implement"
"net"
"strings"
"time"
@ -19,7 +20,6 @@ import (
"git.zhangdeman.cn/zhangdeman/network/httpclient/validate"
"git.zhangdeman.cn/zhangdeman/serialize"
"github.com/go-resty/resty/v2"
"github.com/tidwall/gjson"
)
// NewHttpClient 获取http client
@ -28,6 +28,13 @@ import (
//
// Date : 15:27 2024/5/31
func NewHttpClient(reqConfig *define.Request, reqOption *RequestOption) (*HttpClient, error) {
if nil == reqOption {
reqOption = &RequestOption{}
}
if nil == reqOption.ResponseParser {
// 没有自定义响应解析实现, 使用内置实现
reqOption.ResponseParser = &implement.Response{}
}
if nil == reqConfig.Logger {
reqConfig.Logger = log.Get() // 未单独指定日志实例, 则使用全局日志实例
}
@ -420,11 +427,9 @@ func (hc *HttpClient) requestBackendApi() *define.Response {
continue
}
// 解析返回信息
hc.fillResponseHeader(response)
hc.fillResponseCookie(response)
hc.fillResponseBody(response)
hc.reqOption.ResponseParser.Parse(hc.reqCfg, response)
// 配置了当前code为成功, 或者未配置任何code, 当前code为2xx, 则认为请求成功
isHttpSuccess := successHttpCodeTable[response.HttpCode] || (len(successHttpCodeTable) == 0 && response.HttpCode/100 == 2)
isHttpSuccess := hc.reqOption.ResponseParser.HttpSuccess(hc.reqCfg, response)
if !isHttpSuccess {
// 非 成功
errType := define.RequestFailTypeServerError
@ -450,7 +455,7 @@ func (hc *HttpClient) requestBackendApi() *define.Response {
}
continue
}
if !hc.isCodeSuccess(response) {
if !hc.reqOption.ResponseParser.BusinessSuccess(hc.reqCfg, response) {
response.FailInfo = &define.ResponseFailInfo{
Type: define.RequestFailTypeBusinessError,
Message: "business code is " + response.Code + ", not success",
@ -517,93 +522,6 @@ func (hc *HttpClient) newResponse() *define.Response {
}
}
// fillResponseHeader 填充响应header
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:30 2024/6/5
func (hc *HttpClient) fillResponseHeader(response *define.Response) {
response.Header = map[string]any{} // 清空已有数据
response.HttpCode = response.RestyResponse.StatusCode() // http状态码
response.HttpCodeStatus = response.RestyResponse.Status() // http状态码描述
for headerName, headerValue := range response.RestyResponse.Header() {
if len(headerValue) > 0 {
response.Header[headerName] = headerValue[0]
} else {
response.Header[headerName] = ""
}
}
}
// fillResponseCookie 填充cookie
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:32 2024/6/5
func (hc *HttpClient) fillResponseCookie(response *define.Response) {
response.Cookie = map[string]any{} // 清空已有数据
for _, cookieValue := range response.RestyResponse.Cookies() {
response.Cookie[cookieValue.Name] = cookieValue.Value
}
}
// fillResponseBody 填充响应body
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:38 2024/6/5
func (hc *HttpClient) fillResponseBody(response *define.Response) {
response.Data = string(response.RestyResponse.Body())
response.Code = gjson.Get(response.Data, hc.reqCfg.CodeField).String()
response.Message = gjson.Get(response.Data, hc.reqCfg.MessageField).String()
businessData := gjson.Get(response.Data, hc.reqCfg.DataField)
if businessData.Value() == nil {
// data为空指针, 归一化成空对象
response.Body = map[string]any{}
} else {
if businessData.IsArray() {
// 数组类型的转换
response.Data = fmt.Sprintf(`{"list":` + businessData.String() + "}")
} else {
if businessData.IsObject() {
// 返回的就是对象
response.Data = businessData.String()
} else {
// 返回是普通类型
response.Data = serialize.JSON.MarshalForStringIgnoreError(map[string]any{
"value": businessData.Value(),
})
}
}
_ = serialize.JSON.UnmarshalWithNumber([]byte(response.Data), &response.Body)
}
response.ExtendData = map[string]string{}
gjson.Parse(response.Data).ForEach(func(key, value gjson.Result) bool {
if key.String() == hc.reqCfg.CodeField ||
key.String() == hc.reqCfg.MessageField ||
key.String() == hc.reqCfg.DataField {
return true
}
response.ExtendData[key.String()] = value.String()
return true
})
}
// isHttpCodeSuccess ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 22:48 2024/6/6
func (hc *HttpClient) isCodeSuccess(response *define.Response) bool {
for _, itemSuccessCode := range hc.reqCfg.SuccessCodeList {
if itemSuccessCode == response.Code {
return true
}
}
return false
}
// getCacheResult 获取缓存结果
//
// Author : go_developer@163.com<白茶清欢>