RPC增加数据mock能力
This commit is contained in:
111
rpc.go
111
rpc.go
@ -14,7 +14,9 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
@ -73,6 +75,10 @@ func InitRPCFromCfgDir(cfgDir string, logger *zap.Logger) error {
|
||||
if err = util.File.ReadAnyFileContent(filepathNames[i], &serviceInfo); nil != err {
|
||||
return err
|
||||
}
|
||||
if len(serviceInfo.MockPath) == 0 {
|
||||
// 填充默认的mock数据存储路径
|
||||
serviceInfo.MockPath = util.Project.BuildPath("mock")
|
||||
}
|
||||
serviceTable[serviceInfo.Flag] = &serviceInfo
|
||||
}
|
||||
return InitRPC(serviceTable, logger)
|
||||
@ -268,6 +274,7 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
|
||||
response *httpclient.Response
|
||||
responseBody []byte
|
||||
code, message, data string
|
||||
mockFilePath string
|
||||
)
|
||||
|
||||
// 日志数据
|
||||
@ -284,48 +291,60 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
|
||||
logDataList = append(logDataList, zap.Any("read_api_config_fail", err.Error()))
|
||||
return err
|
||||
}
|
||||
logDataList = append(logDataList, zap.Any("api_config", apiConfig))
|
||||
logDataList = append(logDataList,
|
||||
zap.Any("api_config", apiConfig),
|
||||
zap.Any("service_mock_enable", serviceConfig.MockEnable),
|
||||
zap.Any("api_mock_enable", apiConfig.MockEnable),
|
||||
)
|
||||
|
||||
// 完整的请求地址
|
||||
fullURL, body = r.getFullURLAndBody(serviceConfig, apiConfig, parameter)
|
||||
if responseBody, mockFilePath, err = r.getMockData(serviceConfig, apiConfig); nil == err {
|
||||
logDataList = append(logDataList, zap.Any("mock_file_path", mockFilePath))
|
||||
} else {
|
||||
logDataList = append(logDataList,
|
||||
zap.Any("mock_file_path", mockFilePath),
|
||||
zap.Any("mock_disable_reason", err.Error()),
|
||||
)
|
||||
// 完整的请求地址
|
||||
fullURL, body = r.getFullURLAndBody(serviceConfig, apiConfig, parameter)
|
||||
|
||||
logDataList = append(logDataList, zap.String("full_utl", fullURL))
|
||||
fullHeader := make(map[string]string)
|
||||
for k, v := range apiConfig.Header {
|
||||
fullHeader[k] = v
|
||||
}
|
||||
for k, v := range header {
|
||||
fullHeader[k] = v
|
||||
}
|
||||
// 获取客户端
|
||||
client = r.GetHttpClient(fullHeader, apiConfig.Timeout)
|
||||
var bodyReader io.Reader
|
||||
if nil != body {
|
||||
logDataList = append(logDataList, zap.String("request_body", string(body)))
|
||||
bodyReader = bytes.NewReader(body)
|
||||
}
|
||||
logDataList = append(logDataList, zap.String("full_utl", fullURL))
|
||||
fullHeader := make(map[string]string)
|
||||
for k, v := range apiConfig.Header {
|
||||
fullHeader[k] = v
|
||||
}
|
||||
for k, v := range header {
|
||||
fullHeader[k] = v
|
||||
}
|
||||
// 获取客户端
|
||||
client = r.GetHttpClient(fullHeader, apiConfig.Timeout)
|
||||
var bodyReader io.Reader
|
||||
if nil != body {
|
||||
logDataList = append(logDataList, zap.String("request_body", string(body)))
|
||||
bodyReader = bytes.NewReader(body)
|
||||
}
|
||||
|
||||
requestStartTime := time.Now().UnixNano() / 1e6
|
||||
requestFinishTime := int64(0)
|
||||
requestStartTime := time.Now().UnixNano() / 1e6
|
||||
requestFinishTime := int64(0)
|
||||
|
||||
logDataList = append(logDataList, zap.Int64("start_time", requestStartTime))
|
||||
if response, err = client.Do(apiConfig.Method, fullURL, apiConfig.Header, bodyReader); nil != err {
|
||||
requestFinishTime = time.Now().UnixNano() / 1e6
|
||||
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
|
||||
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
|
||||
logDataList = append(logDataList, zap.String("request_fail_reason", err.Error()))
|
||||
return err
|
||||
}
|
||||
|
||||
logDataList = append(logDataList, zap.Int64("start_time", requestStartTime))
|
||||
if response, err = client.Do(apiConfig.Method, fullURL, apiConfig.Header, bodyReader); nil != err {
|
||||
requestFinishTime = time.Now().UnixNano() / 1e6
|
||||
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
|
||||
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
|
||||
logDataList = append(logDataList, zap.String("request_fail_reason", err.Error()))
|
||||
return err
|
||||
}
|
||||
logDataList = append(logDataList, zap.Any("response_header", response.Header))
|
||||
logDataList = append(logDataList, zap.Any("response_http_code", response.StatusCode))
|
||||
|
||||
requestFinishTime = time.Now().UnixNano() / 1e6
|
||||
logDataList = append(logDataList, zap.Int64("finish_time", requestFinishTime))
|
||||
logDataList = append(logDataList, zap.Int64("used_time", requestFinishTime-requestStartTime))
|
||||
logDataList = append(logDataList, zap.Any("response_header", response.Header))
|
||||
logDataList = append(logDataList, zap.Any("response_http_code", response.StatusCode))
|
||||
|
||||
if responseBody, err = r.getResponseBody(response); nil != err {
|
||||
logDataList = append(logDataList, zap.String("read_body_fail_reason", err.Error()))
|
||||
return err
|
||||
if responseBody, err = r.getResponseBody(response); nil != err {
|
||||
logDataList = append(logDataList, zap.String("read_body_fail_reason", err.Error()))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
logDataList = append(logDataList, zap.Any("response_body", string(responseBody)))
|
||||
@ -352,6 +371,30 @@ func (r *request) Send(ctx *gin.Context, serviceFlag string, apiFlag string, par
|
||||
return err
|
||||
}
|
||||
|
||||
// getMockData 获取mock数据
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:29 2022/10/14
|
||||
func (r *request) getMockData(serviceConfig *Service, apiConfig *Api) ([]byte, string, error) {
|
||||
mockFilePath := util.Project.BuildPath(serviceConfig.MockPath, serviceConfig.Flag, apiConfig.Flag+".json")
|
||||
if !serviceConfig.MockEnable || !apiConfig.MockEnable {
|
||||
// 未启用mock服务
|
||||
return nil, mockFilePath, errors.New("mock is forbidden")
|
||||
}
|
||||
var (
|
||||
err error
|
||||
mockData []byte
|
||||
)
|
||||
if _, err = os.Stat(mockFilePath); nil != err {
|
||||
return nil, mockFilePath, errors.New("get mock fileInfo fail : " + err.Error())
|
||||
}
|
||||
if mockData, err = ioutil.ReadFile(mockFilePath); nil != err {
|
||||
return nil, mockFilePath, errors.New("read mock file content fail :" + err.Error())
|
||||
}
|
||||
return mockData, mockFilePath, nil
|
||||
}
|
||||
|
||||
// getResponseBody 获取响应体
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
|
Reference in New Issue
Block a user